今天在做一个东西的时候需要抓取淘宝的一些数据,找到了请求的url,返回了一个callback,看了下callback中的参数是一个对象,通过正则匹配去到了数组,但是在使用json_decode()转换的时候返回的是NULL,老郁闷了,前一段时间要做一个东西也是因为这个原因,没有成功的把json对象转换成php的数组,放弃了,今天又遇到了,终于找到了解决的办法。
原因在于:抓取的数数据是是GBK格式,通过抓包看到,返回的header头中
代码如下 | 复制代码 |
Content-Type:text/html;charset=GBK |
这个时候用icvo转码下,然后在json_decode()就可以正常转换了
代码如下 | 复制代码 |
iconv('gbk','utf-8',$data[1][0]); |
这里还需要主要的是你php代码文件的格式,建议是utf-8无bom头。
昨天发现博客的收录全部掉了,网站关了一个多月,唉。度娘你就块收了我把。
是在mysql中用utf8表示utf-8而已,就是指代一种编码。
在php中mysql_query(“set names utf-8″);因为mysql中定义的是utf8而不是utf-8,所以这条语句是执行不成功的,效果和mysql_query(“set names test”)一样,所以你存储和获得的mysql编码并没有改变。改为
代码如下 | 复制代码 |
mysql_query(“set names utf8″);就行了。 |
各们注意了前面是uft-8而后面是uft8这是有区别的哦,但这个对于gbk或gbk2312和网页设置又可以一样,这里估计是mysql有原因吧。
现在年纪大了,面对问题时的嗅觉不再灵敏,第一感觉零是正确的,心想是不是重定向后忘记退出了,后面还有内容输出,可是查了一下代码发现没有问题:
<?php
header('Location: /path');
exit;
?>
在绕了一大圈之后,我猛然意识到环境是Nginx+PHP,响应没有「Content-Length」,数据是通过「Transfer-Encoding」分块发送的,所以重定向的空响应体实际类似:
0\r\n\r\n
不多不少,正好五个字节,细节大家可以参考Chunked transfer encoding。如此看来在此类空响应体的情况下,PHP主动输出一个「Content-Length: 0」说不定会更好些。
那零个字节的响应如何解释呢?查询日志发现如下两种情况:
HEAD “/path HTTP/1.1″ 302 0
GET “/path HTTP/1.0″ 302 0
前者是HEAD请求,不需要响应体;后者是HTTP/1.0,不支持「Transfer-Encoding」。
问题基本解释清楚了,擦擦额头的汗,总算没在同事面前丢脸。
利用php读取数据库时如果页面与数据库编码不一致中文就会有乱码了,但我们可以通过set names来强制统一编码。首先需要修改文件的类型 我的utf8 提交资料的时候 需要在mysql_query上加这么语句话
代码如下 | 复制代码 |
mysql_query("SET NAMES 'utf8'",$db); |
然后数据库的编码也得是utf8_general_ci
然后在读取的时候 也加
代码如下 | 复制代码 |
mysql_query("SET NAMES 'utf8'",$db); |
然后就不会实现乱码了 以下代码是是实例
代码如下 | 复制代码 |
<?php |
总结一下这个乱码问题的解决方法:
1.确认所有页面都统一使用同样的编码,强烈建议用utf-8;
2. 在用mysql_query作查询时无论是写入数据到mysql还是从mysql提数据出来,设置mysql_query(“set names utf8″)..,连接数据库时就设置,而且不要把这时的“utf8”写成“utf-8”,这点很重要。
昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空。
我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息。
调试一下发现问题出现在unserialize上。
我先根据它的购物车原理写了段代码:
代码如下 | 复制代码 |
<?php 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."<br>"; echo $_COOKIE['cart']."<br>"; 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