目录
大概的现象是
往数据库写一个数组序列化后的字符串,一查发现只有一半信息;到底咋回事,简单记录下。
示例
表结构
CREATE TABLE `test` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`name` text,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
写入代码
$arr = ['"\P\C\M\T\P\"'=>"\0csdc:\"\0cscs\""];
$arr_serialize_str = serialize($arr);
echo $arr_serialize_str;
$conn = new \PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8','test','test');
$conn->exec('replace test (id,name) values (101,'.($conn)->quote($arr_serialize_str).')');
注意:在$arr_serialize_str 实际还有几个2个 \0 显示不出来
mysql-front(5.3)中的结果
这时候开始蒙蔽,转义失败了?有特殊字符影响写入了?这是个漏洞。一顿测试后发现。又是个乌龙事件、
结论
好吧,我的代码没问题,是mysql-front的锅。这里可能的原因是在显示的时候识别到了\0字符,认为已经到结尾而结束。
用Navicat Premium打开则发现没有问题,最重要的是,我居然最开始没试着读取。因为直接用sql读取的数据也是对的。尴尬了。
参考
php-serialize-data-in-mysql