调皮的转义之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():去除字符串 ...
随机推荐
- DWZ框架Ajax无刷新表单提交处理流程
DWZ框架Ajax无刷新表单提交处理流程是: 1. ajax表单提交给服务器 2. 服务器返回一个固定格式json结构 3. js会调函数根据这个json数据做相应 ...
- 为DEDE织梦添加XMl网站地图
在后台管理: 核心-频道模型-单页文档管理-增加一个新页面 模版文件放在你现在使用的templets目录下,sitemap.xml的内容如下 <?xml version="1.0&qu ...
- hust 1017 DLX
#include<set> #include<cmath> #include<queue> #include<cstdio> #include<v ...
- Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
- ASP.NET自定义错误页面
ASP.NET自定义错误页面 ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件.Application_Error 事件以及应用程序配置文件 (Web.co ...
- C++类(一)
#include<iostream> #include<string> using namespace std; //找了很久,似乎都是类放在Main方法体上 class Pe ...
- 图解win7中IIS7.0的安装及配置ASP环境
控制面板中“程序”的位置 “程序”中“打开或关闭Windows功能”的位置 如图,安装IIS7时需要选择要使用的功能模块 IIS7安装完成之后可以在开始菜单的所有程序中看到“管理工具”,其中有一个“I ...
- C#如何关闭一个窗口的同时打开另一个窗口
在.net的WinForm程序中,如果是直接起动的Form作为主窗口,那么这个主窗口是不能关闭的,因为它维护了一个Windows消息循环,它一旦关闭了就等于声明整个应用程序结束,所以新打开的窗口也就被 ...
- PictureBox控件鼠标进入的手形改变和提示
PictureBox控件载入了图片后,如果要设置其为链接作用的功能,一般需要当鼠标移动到其上时鼠标自动变为手形以提示用户此时可以点击,如果图形无法方便辨识链接的具体功能,最好此时给与一定提示. 1.鼠 ...
- MVC5 属性路由
属性路由(attribute routing)是最新被引进到MVC5中的,它和传统路由共同组成了mvc5中的两种主要路由. 1. 高质量的url应该满足以下几点 域名便于记忆和拼写 简短 便于输入 可 ...