【问题标题】:mySQL database changes when I open a field in phpmyadmin, but I don't make any change当我在 phpmyadmin 中打开一个字段时,mySQL 数据库发生更改,但我没有进行任何更改
【发布时间】:2013-12-18 07:35:20
【问题描述】:

我有一个 wordpress 网站和一个安装了演示数据的模板。当我在 phpmyadmin 中打开一些字段时,即使我不做任何更改并选择其他字段,它也会更新该字段。没问题,它什么也没更新,因为我做了零更改。然后发生的事情是 wordpress 网站的前端出现问题,因为我正在检查的领域发生了一些变化。有问题的字段中有大量的 HTML 代码,还有不少;和其中的 " 字符...

我认为当我打开并关闭该字段时,更新命令会解析该字段中的内容,它看到的是 ;和“ 到处都是......我可能是错的。无论如何,当我查看数据并通过mysql shell查询或phpmyadmin复制它,并像以前一样将它完全更新回数据库时,有些东西正在改变,但即使使用记事本++比较插件并尽我所能查看数据,也没有任何变化......

这有意义吗?快把我逼疯了!

这是一个使用火箭主题的 wordpress 网站,带有龙门框架,以防万一有人熟悉...

这里是这个问题的视频演示

https://www.youtube.com/watch?v=ljXTDKKmUUw

好吧,答案似乎是,如果数据被序列化存储在字段内的数组中,则必须先用 php 反序列化才能读取,然后再用 php 序列化才能写入。

显然,这是 wordpress 的一个常见问题,当人们尝试进行更改 url 长度的数据库迁移时,这会导致很多挫败感。

我在这里学到了更多关于这个问题的知识: http://wpgarage.com/tips/data-portability-and-data-serialization-in-wordpress/

【问题讨论】:

  • 如果现场的;" 抛弃了phpmyadmin,你会认为抱怨它的人不止几个......
  • 您是否使用了特殊字符?也许编码搞砸了。
  • 前端具体发生了什么?
  • 这是我刚刚为这篇文章拍摄的整个问题的旁白视频演示。我很困惑为什么会发生这种情况,但希望我能涵盖所有角度来找出原因。 youtu.be/ljXTDKKmUUw
  • 您在该字段中看到的代码是序列化数据,很可能是一个数组或对象被序列化并存储为字符串值。

标签: php mysql wordpress phpmyadmin


【解决方案1】:

问题是有问题的数据库条目不仅仅包含“带有一堆冒号的文本”,这是 PHP serialized 数据。没错,它是文本,但它必须被视为某种二进制。当您对序列化数据进行任意更改时,例如将单词更改为更长或更短的单词,就会破坏数据结构。当相关代码之后尝试反序列化数据时,它会失败。道德:不要随意编辑序列化数据,否则你会破坏东西。

引用 PHP documentation:序列化的字符串甚至不应该存储在 TEXT 字段中。

请注意,这是一个可能包含空字节的二进制字符串,并且 需要这样存储和处理。例如,序列化() 输出通常应存储在数据库的 BLOB 字段中, 而不是 CHAR 或 TEXT 字段。

无论如何,如果您遵守序列化值的规则或调整相应的结构信息,则有一些方法可以编辑 PHP 序列化数据。 甚至还有一些专门的editors 或在线tools 为此(我没有测试过)。
要了解有关序列化数据结构的更多信息,请查看 php.net 上链接的 function documentation 中 egingell 的顶部评论,该评论描述了 serialize() 的值的剖析:

字符串 -> s:size:value;

整数 -> i:value;

布尔值-> b:值; (不存储“真”或“假”,存储“1” 或“0”)

空 -> N;

数组 -> a:size:{key 定义;value 定义;(repeated per 元素)}

对象 -> O:strlen(对象名):对象名:对象 大小:{s:strlen(属性名称):属性名称:属性 定义;(每个属性重复)}

字符串值总是用双引号括起来
数组键总是 整数或字符串
"null => 'value'" 等同于 's:0:"";s:5:"value";',
"true => 'value'" 等同于 'i:1;s:5:"value";',
"false => 'value'" 等同于 'i:0;s:5:"value";',
"array(whatever the contents) => 'value'" 等同于“非法偏移类型”警告,因为您不能使用数组作为键;
但是,如果您使用包含数组作为键的变量,它将 等同于 's:5:"Array";s:5:"value";',并试图使用一个对象 作为键将导致与使用数组相同的行为。

【讨论】:

    【解决方案2】:

    从视频的外观看来,您使用的是相当旧的 PMA 版本。 我会开始更新 PMA、PHP 和 MySQL,看看那个特定版本是否有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多