博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调皮的转义之addslashes
阅读量:4971 次
发布时间:2019-06-12

本文共 2966 字,大约阅读时间需要 9 分钟。

背景:

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

转载于:https://www.cnblogs.com/walter371/p/4212044.html

你可能感兴趣的文章
easyui+Spring MVC+hibernate = 乐途
查看>>
UVA10090 数论基础 exgcd
查看>>
配置Apache域名【转载】
查看>>
20145220《信息安全系统设计基础》第12周学习总结
查看>>
<算法编程> 把字符串中的空格替换成%20
查看>>
Docker容器运行ASP.NET Core
查看>>
WPF图片浏览器(显示大图、小图等)
查看>>
Asp.Net Core 轻松学-在.Net Core 使用缓存和配置依赖策略
查看>>
c#控制WPF程序自动登录(Automation方式实现)
查看>>
WPF特效-鱼游动动画
查看>>
零元学Expression Blend 4 - Chapter 13 用实例了解布局容器系列-「Pathlistbox」I
查看>>
在WPF中自定义你的绘制(一)
查看>>
利用PHP SOAP扩展实现简单Web Services
查看>>
经典算法题每日演练——第三题 猴子吃桃
查看>>
.Net码农学Android---系统架构和基本概念
查看>>
Windows Phone开发(37):动画之ColorAnimation
查看>>
DevExpress的Web控件汉化方法
查看>>
js中escape,encodeURI,encodeURIComponent 区别(转)
查看>>
结对编程项目-四则运算整体总结
查看>>
Android studio怎么修改文件名
查看>>