背景:
php自5.3版本开始废除set_magic_quotes_runtime函数,并在5.4及以后版本中移除了该函数
今天程序在向mysql插入一个serialize序列化后的数组时,由于一个数组元素带单引号,导致了插入不成功。
if($_POST){ $id=intval($_POST['id']); $add['title']=htmlspecialchars($_POST['title']); $add['desc']=htmlspecialchars($_POST['desc']); $i=0; $columns=array(); foreach($_POST['columns1'] as $k=>$v){ if(!empty($v)){ $columns[$i]['title']=$v; $columns[$i]['type']=htmlspecialchars($_POST['columns2'][$i]); $columns[$i]['comment']=addslashes($_POST['columns3'][$i]); //之前没有加addslashes,试着在这里加上还是不行 $i++; } } $add['columns']=serialize($columns);// dump($add['columns']);die; M('data')->where('id='.$id)->save($add); echo ''; exit(); }
修改如下,就可以了
foreach($_POST['columns1'] as $k=>$v){ if(!empty($v)){ $columns[$i]['title']=$v; $columns[$i]['type']=htmlspecialchars($_POST['columns2'][$i]); $columns[$i]['comment']=htmlspecialchars($_POST['columns3'][$i]); //修改 $i++; } } $add['columns']=addslashes(serialize($columns)); //修改
在读取数据的时候直接反序列化即可
$columns=unserialize($data['columns']); 因为mysql在存取数据的时候也会进行转义,而且也是使用\ 总结原因: 要反序列化的字符串与先前序列化后的字符串并不相同,因此无法反序列化 小坑: 对于已存入的数据,如果不能正常读取,可以将存入序列化后数据的字段读取出来,在有需要转义的地方,加上\,同时需要注意修改序列化字符串中相应的s长度,否则,还是不能正常读取!
update doc_data set `title`='sdb_pam_account',`desc`='用户账号总表',`columns`='a:6:{i:0;a:3:{s:5:"title";s:10:"account_id";s:4:"type";s:9:"mediumint";s:7:"comment";s:8:"账号id";}i:1;a:3:{s:5:"title";s:12:"account_type";s:4:"type";s:7:"varchar";s:7:"comment";s:12:"账号类型";}i:2;a:3:{s:5:"title";s:10:"login_name";s:4:"type";s:7:"varchar";s:7:"comment";s:9:"账号名";}i:3;a:3:{s:5:"title";s:14:"login_password";s:4:"type";s:7:"varchar";s:7:"comment";s:6:"密码";}i:4;a:3:{s:5:"title";s:8:"disabled";s:4:"type";s:4:"enum";s:7:"comment";s:32:"是否被禁止 ('true','false')";}i:5;a:3:{s:5:"title";s:10:"createtime";s:4:"type";s:7:"varchar";s:7:"comment";s:9:"时间戳";}}' where id=9
update doc_data set `title`='sdb_pam_account',`desc`='用户账号总表',`columns`='a:6:{i:0;a:3:{s:5:"title";s:10:"account_id";s:4:"type";s:9:"mediumint";s:7:"comment";s:8:"账号id";}i:1;a:3:{s:5:"title";s:12:"account_type";s:4:"type";s:7:"varchar";s:7:"comment";s:12:"账号类型";}i:2;a:3:{s:5:"title";s:10:"login_name";s:4:"type";s:7:"varchar";s:7:"comment";s:9:"账号名";}i:3;a:3:{s:5:"title";s:14:"login_password";s:4:"type";s:7:"varchar";s:7:"comment";s:6:"密码";}i:4;a:3:{s:5:"title";s:8:"disabled";s:4:"type";s:4:"enum";s:7:"comment";s:36:"是否被禁止 (\'true\',\'false\')";}i:5;a:3:{s:5:"title";s:10:"createtime";s:4:"type";s:7:"varchar";s:7:"comment";s:9:"时间戳";}}' where id=9
上述读取出的数据,其中需要转义的数组元素长度32,加上四个转义字符\后变为36,这个时候就需要将32修改为32,再运行sql语句
参考 http://nmyun.blog.51cto.com/448726/137981 http://ccvita.com/205.html http://blog.sina.com.cn/s/blog_88f4c9e001013ycm.html