当你的数据中有一些     "  '

这样的字符要写入到数据库里面,又想不被过滤掉的时候,它就很有用,会在这些字符前自动加上,如

中国地大物博"哈哈"

中国\地大物博"哈哈"

可以使用set_maginc_quotes_runtime(0)关闭掉,当然你也可以直接在php.ini中设置。

get_magic_quotes_runtime() 取得 PHP 环境变量 magic_quotes_runtime 的值。

magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

两者不同

set_magic_quotes_runtime() 可以让程序员在代码中动态开启或关闭 magic_quotes_runtime

set_magic_quotes_runtime(1) 表示开启,set_magic_quotes_runtime(0) 则表示关闭。当set_magic_quotes_runtime(1) 时,从数据库或通过fread之类的函数读取的文本,将自动对’ “和自动加上反斜杠进行转义,防止溢出。这在对数据库的数据进行转移的时候非常有用。

但在一般情况下,应当将其关闭,否则从数据库读取出来的数据单引号、双引号和反斜杠都会被加上,导致显示不正常。像Discuz,PHPWind都在公共文件的头部加上一句 set_magic_quotes_runtime(0); 强制关闭 magic_quotes_runtime 。

magic_quotes_gpc

作用范围是:WEB客户服务端;

作用时间:请求开始是,例如当脚本运行时.

magic_quotes_runtime

作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;

作用时间:每次当脚本访问运行状态中产生的数据.

所以

magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据,

magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据,

magic_quotes_gpc 是对通过GET、POST、COOKIE传递的数据进行转义,一般在数据入库前要先进行转义,

magic_quotes_gpc不能在代码中动态开启或关闭,需要到php.ini将magic_quotes_gpc设置为on或off,

代码中可以用get_magic_quotes_gpc获取magic_quotes_gpc的状态。

当magic_quotes_gpc为off时,需要手工对数据进行addslashes,代码如下:

if (!get_magic_quotes_gpc()) {
new_addslashes($_GET);
new_addslashes($_POST);
new_addslashes($_COOKIE);
} function new_addslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $value) {
$string[$key] = new_addslashes($value);
}
} else {
$string = addslashes($string);
}
return $string;
}

另一示例:

$data1 = $_POST['aaa'];
$data2 = implode(file('1.txt')); if (get_magic_quotes_gpc()) {
//把数据$data1直接写入数据库
} else {
$data1 = addslashes($data1);
//把数据$data1写入数据库
} if (get_magic_quotes_runtime()){
//把数据$data2直接写入数据库
//从数据库读出的数据要经过一次stripslashes()之后输出
} else {
$data2 = addslashes($data2);
//把数据$data2写入数据库
//从数据库读出的数据直接输出
}

经验总结:

一、对于GPC,不管系统有没有开启magic_quotes_gpc(即php.ini中magic_quotes_gpc = On),我们统一开启 magic_quotes_gpc,对get、post、cookie的内容进行转义。操作如下:

(摘自uchome系统)

function saddslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
} //GPC过滤
$magic_quote = get_magic_quotes_gpc();
if(empty($magic_quote)) {
$_GET = saddslashes($_GET);
$_POST = saddslashes($_POST);
} //COOKIE,给cookie值转义
$prelength = strlen($_SC['cookiepre']);
foreach ($_COOKIE as $key => $val) {
if(substr($key, 0, $prelength) == $_SC['cookiepre']) {
$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;
}
}

二、对于magic_quotes_runtime,我们统一关闭它,即set_magic_quotes_runtime(0);不让从数据库读取出来的数据的单引号、双引号和反斜杠都自动被加上。这样,对数据库的操作如下:添加数据到数据库之前,我们手动对数据进行addslashes(),而从数据库取出数据时,则作相反操作,即stripslashes()

三、对于要序列化的内容,要保持裸数据,即要去掉转义,stripslashes(),然后在把序列化过的内容保存到数据库当中(注意,序列化过的内容是不带单引号(')、双引号(")、反斜线()的),示例如下:

$feedarr['body_data'] = serialize(stripslashes($body_data));

出现Function set_magic_quotes_runtime() is deprecated 问题?

在安装PHPCMS出现Deprecated: Function set_magic_quotes_runtime() is deprecated 错误,查了一下网络及资料发现是PHP5.3和PHP6.0之后移除了set_magic_quotes_runtime()函数。

我可以使用如下方案替代:

@set_magic_quotes_runtime(0);

ini_set("magic_quotes_runtime", 0);

if (phpversion() < '5.3.0') {
set_magic_quotes_runtime(0);
}

最新文章

  1. 利用SQLServer数据库发送邮件
  2. 阿里云本地FTP怎么连接?通用win7,win8,win8.1,win10
  3. 【java基础学习】-【泛型】
  4. Storm系列(一):搭建dotNet开发Storm拓扑的环境
  5. Java语言概述
  6. Android 贝塞尔曲线 折线图
  7. seo 优化 仅针对 来拍呀www.laipaiya.com(一)
  8. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问
  9. SetUID、SetGID中的大小写Ss和Sticky bit中的大小写Tt
  10. Scala-数组
  11. 用CSS3写的钟表
  12. C语言的一些基础
  13. Problem 2062 Suneast &amp; Yayamao 二进制(多重背包的理解基础)
  14. 51NOD 1584&#160;加权约数和 [莫比乌斯反演 转化 Trick]
  15. 基于for循环的呼吸灯
  16. The Unique MST POJ - 1679 次小生成树prim
  17. [Discuz!] Discuz X1.5点击“发帖”出现XML代码的解决办法!
  18. 请教神牛_字符串hash
  19. vue---数据更新,视图不更新问题
  20. ImageView的android:scaleType各属性含义(zz)

热门文章

  1. 【2016-11-2】【坚持学习】【Day17】【微软 推出的SQLHelper】
  2. NYOJ 187
  3. sicily vector有序插入
  4. Struts2 easy UI插件
  5. MySQL 笔记2
  6. SQL/LINQ/Lamda 写法[转发]
  7. UCenter创始人密码正确但是登录不了
  8. Tomcat 7.0的配置
  9. 马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版
  10. Vmware虚拟机配置LVS/NAT模式遇到的坑。