调皮的转义之addslashes
背景:
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的更多相关文章
- PHP实现字符串转义和还原
首先大家可以简单了解下什么是转义字符?有什么用? 转义字符是一种特殊的字符常量.转义字符以反斜线"\"开头,后跟一个或几个字符.转义字符具有特定的含义,不同于字符原有的意义,故称“ ...
- PHP怎么实现字符串转义和还原?
首先大家可以简单了解下什么是转义字符?有什么用? 转义字符是一种特殊的字符常量.转义字符以反斜线"\"开头,后跟一个或几个字符.转义字符具有特定的含义,不同于字符原有的意义,故称“ ...
- PHP好用但又容易忽略的小知识
1.PHP函数之判断函数是否存在 当我们创建了自定义函数,并且了解了可变函数的用法,为了确保程序调用的函数是存在的,经常会先使用function_exists判断一下函数是否存在.同样的method_ ...
- PHP自带防SQL攻击函数区别
为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes.(php.ini magic_quotes_gpc).如果m ...
- dedecms /include/filter.inc.php Local Variable Overriding
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 filter.inc.php这个文件在系统配置文件之后,里面有forea ...
- webexam项目杂记
sql 语句 数据库 本身 有数据类型的区分,对于mysql的字符串默认的用单引号''来表示,因此,整个sql 语句就要用双引号来括. 如: $sql = "SELECT * FROM us ...
- PHP学习笔记 - 进阶篇(4)
PHP学习笔记 - 进阶篇(4) 字符串操作 字符串介绍 PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号 2.双引号 ...
- PHP基础语法2
数组 PHP有两种数组:索引数组.关联数组. 函数 自定义函数 自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰 返回值 使用return关键字可以使函数返回值,可以返回包括数 ...
- php字符串处理函数常见问题
PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 字符串去除 trim():去除字符串 ...
随机推荐
- javaweb学习总结二十六(response对象的用法二 下载文件)
一:浏览器打开服务器上的文件 1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层 可以使用类加载器读取文件 2:向浏览器写数据,实际上是把数据封装到r ...
- Linux之cuda安装
1.下载https://developer.nvidia.com/cuda-downloads 2.双击下载好的deb进行安装 3.sudo apt-get install cuda 4.As par ...
- 百度地图LBS开放平台AK一直没有用
http://api.map.baidu.com/geoconv/v1/?coords=114.21892734521,29.575429778924;114.21892734521,29.57542 ...
- oracle 常用技巧及脚本
[Q]怎么样查询特殊字符,如通配符%与_ [A]select * from table where name like 'A/_%' escape '/' [Q]如何插入单引号到数据库表中 [A]可以 ...
- Linux下向SVN服务器添加新文件步骤
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain ...
- Kettle 连接 oracle
问题1:加载不了驱动 Kettle 不包含jdbc的驱程 所以需要把Ojdbc6.jar 放到 Kettle目录下 4.X: \libext\JDBC 5.x: \lib 问题2:没打开监听 症状 ...
- UIView的frame的扩展分类,轻松取出x、y、height、width等值
一.引言: 在ios开发中,就界面搭建.控件布局时,都会很恶心的通过很长的代码才能取出控件的x.y.height.width等值,大大降低了开发效率.那为了省略这些恶心的步骤,小编在这里给UIView ...
- 理解C#系列 / 核心C# / 编译参数
编译参数 编译控制台应用程序 csc 源文件.cs 编译Windows应用程序 csc /t:winexe 源文件.cs 编译类库应用程序 csc /t:libray 源文件.cs 编译引用类库的应用 ...
- UI2_ScrollView&UIPageControl
// // ViewController.h // UI2_ScrollView&UIPageControl // // Created by zhangxueming on 15/7/10. ...
- Ajax_2
<script> var xmlHttp;//创建一个对象 function queryDetail(id){ if(window.ActiveXObject){ xmlHttp = ne ...