php中magic
昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空。 我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中
昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空。
我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息。
调试一下发现问题出现在unserialize上。
我先根据它的购物车原理写了段代码:
代码如下 | 复制代码 |
header("Content-type: text/html; charset=utf-8"); $magic = get_magic_quotes_gpc() ? "开启" : "未开启"; $str = array(array('goods_id'=>13,'number'=>1)); setcookie("cart", serialize($str)); echo "magic_quotes_gpc: ".$magic." "; echo $_COOKIE['cart']." "; print_r(unserialize($_COOKIE['cart'])); ?> |
大家执行下这段代码可以发现,当你的magic_quotes_gpc关闭时这段程序执行没有任何问题,但是magic_quotes_gpc开启时你会发现反序列化并不成功。这时你可能就知道问题出在哪了?
原因是magic_quotes_gpc开启时,系统会自动对POST GET COOKIE的结果中的单引号进行转义,加上\,所以$_COOKIE['cart']的值就变成了a:1:{i:0;a:2: {s:8:\"goods_id\";i:13;s:6:\"number\";i:1;}},这样的话unserialize是无法反序列化成功的,就出现了问题。
解决的办法简单来说就是将unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉转义符。这样就没问题了。
对于cookie影响我们再做个测试
1.问题:项目数据需要序列化保存在cookie中,然后再获得cookie的数据反序列,获得原数据
代码如下 | 复制代码 |
|
在没有经过cookie赋值时,正常反序列化。经过cookie之后,取到值为空
2.分析:
代码如下 | 复制代码 |
$a[0] = array("key"=>"哈 逻"); $a[1] = array("key"=>"哈 逻"); $jsona = json_encode($a); var_dump($jsona); //string(50) "[{"key":"\u54c8 \u903b"},{"key":"\u54c8 \u903b"}]" setcookie("testcookie",""); setcookie("testcookie",$jsona); var_dump($_COOKIE['testcookie']); // string(62) "[{\"key\":\"\\u54c8 \\u903b\"},{\"key\":\"\\u54c8 \\u903b\"}]" var_dump(json_decode($_COOKIE['testcookie'],true)); |
对比了一下数据,经过cookie处理后多了几个//
解决方法:
代码如下 | 复制代码 |
|
总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,
首先判断magic_quotes_gpc开启情况
1>在开启情况下,处理数据需要stripslashes
2>在没有开启情况下,接受数据先addslashes,处理数据stripslashes
推荐阅读
-
2021校友会全国大学排名-2021中国大学排名完整版
-
2021年艾瑞深中国高职院校排行榜-2021年中国职业技术大学排行榜
-
Android studio中IDE窗口怎么显示或者隐藏?
-
MATLAB怎么读取excel文件中的数据?
-
“2019中国金指尖奖”隆重揭晓!粉象生活斩获“2019最佳创新电商平台”大奖
-
Android studio中logcat提示信息设置?
-
Solidworks怎么在装配体中打孔? sw装配体中打孔的教程
-
matlab中失误将command窗口关掉了该怎么办?
-
百中搜优化软件怎么样?百中搜优化软件使用教程(附视频教程)
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法