背景:

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 '<script>alert("修改成功");document.location.href="table.php";</script>';
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::"是否被禁止 ('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::"是否被禁止 (\'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

调皮的转义之addslashes的更多相关文章

  1. PHP实现字符串转义和还原

    首先大家可以简单了解下什么是转义字符?有什么用? 转义字符是一种特殊的字符常量.转义字符以反斜线"\"开头,后跟一个或几个字符.转义字符具有特定的含义,不同于字符原有的意义,故称“ ...

  2. PHP怎么实现字符串转义和还原?

    首先大家可以简单了解下什么是转义字符?有什么用? 转义字符是一种特殊的字符常量.转义字符以反斜线"\"开头,后跟一个或几个字符.转义字符具有特定的含义,不同于字符原有的意义,故称“ ...

  3. PHP好用但又容易忽略的小知识

    1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...

  4. PHP自带防SQL攻击函数区别

    为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果m ...

  5. dedecms /include/filter.inc.php Local Variable Overriding

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 filter.inc.php这个文件在系统配置文件之后,里面有forea ...

  6. webexam项目杂记

    sql 语句 数据库 本身 有数据类型的区分,对于mysql的字符串默认的用单引号''来表示,因此,整个sql 语句就要用双引号来括. 如: $sql = "SELECT * FROM us ...

  7. PHP学习笔记 - 进阶篇(4)

    PHP学习笔记 - 进阶篇(4) 字符串操作 字符串介绍 PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号 2.双引号 ...

  8. PHP基础语法2

    数组 PHP有两种数组:索引数组.关联数组. 函数 自定义函数 自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰 返回值 使用return关键字可以使函数返回值,可以返回包括数 ...

  9. php字符串处理函数常见问题

    PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 字符串去除 trim():去除字符串 ...

随机推荐

  1. 管理后台-第二部分:Custom sections in Umbraco 7 – Part 2 the views(翻译文档)

    在上一篇文章中我们讨论了怎样在我们Umbraco7.0版本中去添加一个新的自定义的应用程序(或部分)和如何去定义一个树.现在我将给你展示你改何如添加视图,来使你的内容可以做一些更有意义的事情. The ...

  2. JavaScript获取两个时间的时间差

    <html><head><title>JavaScript计算两个时间差</title><meta http-equiv="conten ...

  3. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  4. AsyncTask实现的原理和适用的优缺点

    AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI ...

  5. 关于SVN下载代码和Android Studio里面导入别人代码build tools不一致问题总结

    项目build tools的sdk我没有 网络问题没法下载. 解决问题 方法 1.下载对应的SDK.需要VPN,或者FQ 2.将bulid.gradle的内容用下面的内容替换 // Top-level ...

  6. Java之简单图形面积计算

    设计一个类层次,定义一个抽象类--形状(类名:shape).其中包括求形状的面积抽象方法(方法名:calArea()).继承该抽象类定义三角形(Triangle).矩形(Rectangle).圆(Ci ...

  7. DateDiff函数 asp运算时间

    DateDiff DateDiff函数 返回 返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目. 语法 DateDiff(interval, date1, date2[, f ...

  8. asp.net在网页上显示数据库中的数据

    第一步: 第二步: 第三步: 第四步:在网页代码中写显示格式代码,如下 <asp:SqlDataSource ID="SqlDataSource1" runat=" ...

  9. 命令行启动tomcat,怎么配置

    进和你tomcat的安装目录进入里面bin目录下列可以直接在cmd中运行(要进入tomcat的bin目录),也可直接双击startup.bat 启动tomcatshutdown.bat 关闭tomca ...

  10. MVC 模型js远程校验的使用方法

    我们在网站注册的时候往往需要在用户注册完毕的时候显示用户名是否可用,这就要用到模型的远程校验了.具体如下. [Required(ErrorMessage = "用户名不能为空"), ...