我有一个wordpress网站,以及一个安装了演示数据的模板。当我在phpmyadmin中打开一些字段时,即使我没有做任何更改并选择其他字段,它也会对该字段进行更新。没问题,它什么都没有更新,因为我做了零修改。然后发生的事情是wordpress网站的前端变得混乱,因为SOMETHING在我正在检查的领域发生了变化。有问题的字段中有大量的HTML代码,还有不少;和“其中的人物......
我认为当我打开字段并关闭它时,update命令会解析字段中的内容,它会看到;并且“到处都是......我可能是错的。无论如何,当我查看数据并通过mysql shell查询或phpmyadmin复制它,并将其完全更新回到DB之前,SOMETHING正在改变,但即使使用记事本++比较插件并以我能够的方式查看数据,也没有任何变化......
这有什么意义吗?这让我疯了!
这是一个使用火箭主题的wordpress网站,以及任何人都熟悉的龙门架...
以下是此问题的视频演示
https://www.youtube.com/watch?v=ljXTDKKmUUw
好的,答案似乎是,如果数据是在一个字段内的数组中序列化存储的,那么必须首先使用php对其进行反序列化,然后再使用php进行读取和序列化。
显然这是wordpress的一个常见问题,当人们尝试进行更改网址长度的数据库迁移时,会造成很多挫折。
我在这里学到了更多关于这个问题的知识: http://wpgarage.com/tips/data-portability-and-data-serialization-in-wordpress/
答案 0 :(得分:7)
问题是,有问题的数据库条目不仅包含“带有一堆冒号的文本”,这是PHP serialized数据。没错,它是文本,但必须被视为二进制。对序列化数据进行任意更改时,例如将单词更改为更长或更短的单词,就会破坏数据结构。当关联代码尝试事后反序列化数据时,它会失败。道德:不要随意编辑序列化数据,否则你就会破坏它们。
引用PHP documentation:序列化字符串甚至不应存储在TEXT字段中。
请注意,这是一个二进制字符串,可能包含空字节,和 需要存储和处理。例如,serialize() 输出通常应存储在数据库的BLOB字段中, 而不是CHAR或TEXT字段。
无论如何,如果您遵守序列化值的规则或调整相应的结构信息,有一些方法可以编辑PHP序列化数据。 甚至还有一些专门的editors或在线tools(我还没有对它们进行过测试) 要了解有关序列化数据结构的更多信息,请查看php.net上链接function documentation中egingell的最高评论,其中描述了serialize()'ed值的解剖:
字符串 - > S:尺寸:值;
整数 - > I:值;
布尔值 - > B:值; (不存储“true”或“false”,存储'1' 或'0')
空 - > N;
数组 - > a:size:{key definition; value definition;(重复per 元件)}
对象 - > O:strlen(对象名):对象名:对象 size:{s:strlen(属性名称):属性名称:property 定义;(每个属性重复)}
字符串值始终用双引号
数组键总是如此 整数或字符串
“null =>'value'”等于's:0:“”; s:5:“value”;',
“true =>'value'”等同于'i:1; s:5:“value”;',
“false =>'value'”等于'i:0; s:5:“value”;',
“array(无论内容是什么)=>'value'”等同于“非法偏移类型”警告,因为您不能将数组用作键;
但是,如果您使用包含数组的变量作为键,它将会 等于's:5:“Array”; s:5:“value”;',并试图使用一个对象 作为键将导致与使用数组相同的行为。
答案 1 :(得分:3)
从视频的外观来看,您似乎使用的是非常古老的PMA版本。 我会开始更新PMA,PHP和MySQL,以查看该特定版本是否存在问题。