Submitted by gouki on 2011, October 8, 6:57 PM
今天同事突然和我说,腾讯微博无法访问了。但新浪微博接口却是正常的。
打开指定的URL,发现报错,仔细看了一下代码,居然是
if(!is_array($jsonDecode)){
throw new Exception("xxxx");
}
当发现json解析出来不是数组的时候,直接抛出异常。
可是我把json字符串在decode前输出的时候是正常的,那是为什么呢?为什么我var_dump出来是null?
看了一下手册,居然说var_dump出来null的原因是因为deepth不够,但看了一下手册,好象也就三个取值范围,128,512,1024,于是我设为最大的1024,但仍然失败。
然后,突然发现,居然json_decode有第四个参数,把BIGINT当成字符串。以为是这个问题导致的,兴冲冲的把这个参数加上去,结果报错,看了一下手册,原来这个参数居然是PHP 5.4才有的。。。
----
再测试,把文本拷成字符串,运行json_decode,居然正常了。这时候我就纳闷了。为什么直接处理不正常。拷成字符串就正常了。
仔细检查。居然发现里面有中文被截断的字符串。晶,肯定是这个原因了。。。
于是写正则,把这玩意替换掉,把A\d{3};的字符串都替换成空格。然后再反处理回去。。结果仍然失败,这时候我就在想一个问题,为什么会有这种情况?
最终我确定,绝对是编码,一定是那个不正常的字符串导致了原来的json字符串被错误的识别成了ISO-8900-1,所以我啥也没处理,直接把json字符串mb_convert_encoding($str,"UTF-8","auto"),自动转换成utf-8,果然json_decode,顺利的转换成了数组。
---
纠结了一天的事情,居然就是这样的小,所幸解决了。
Tags: json_decode, 腾讯微博
PHP | 评论:1
| 阅读:17537
Submitted by gouki on 2011, September 30, 10:16 PM
之前在博客里有提过basename的事情,蜘蛛也说过这个函数处理中文有问题。我也在测试的过程中遇到过各种各样的问题,但总体来说,我现在在处理中文文件名的时候是直接 array_pop(explode("/",$filename));
今天在群里,echo也说了这个问题,他居然还贴了SVN中PHP的源码关于basename的一段,并指出问题在php_mblen 这个函数上:他说mblen发现全中文的时候会返回负数。
于是他说有个临时的解决方案是:
XML/HTML代码
- echo 22:00:11
- ltrim(basename(' ' . $filename))
- 骗过mblen() ,mblen全中文的时候,返回的是负数。
- 有一个空格就好 了
没有试过,希望能够解决问题。
然后日哥说,可以用exif_read来解决这个问题,可以取得图片的title,但echo直接无视,因为不是每个上传的文件都是图片,可以通过 Exif_read解决这个问题。
echo也说了,别妄想用pathinfo解决这个问题,因为源码里显示,这个函数最 后还是调用了php_basename,所以他们的问题其实是一样的。。。。
=------纯记录----
Tags: basename, pathinfo
PHP | 评论:0
| 阅读:22895
Submitted by gouki on 2011, September 27, 12:10 AM
事实上,我一般用的最多的就是Post-Commit,因为用来将SVN里的代码提交到测试机的项目里。其实也听过用svn来检测代码的可执行性。不过我是没有用过啦。
老王在博客里写的这篇文章就是讲pre-commit。有借鉴意义,以后可以悄悄的程序里用。不过,我觉得检查语法这种事情其实可以忽略了,毕竟现在都是用IDE的,一般语法问题IDE都能认出来。。
注:我开始看文章的时候没有仔细看CodeSniffer,我起初认为是语法检测,事实并非这样,是指代码是否按规范来写代码。如果是这样,那值得搞一搞啊
OK,上原文:Subversion钩子
Subversion本身有很好的扩展性,用户可以通过钩子实现一些自定义的功能。
所谓钩子实际上是一种事件机制,当系统执行到某个特殊事件时,会触发我们预定义的动作,这样的特殊事件在Subversion里有很多,默认有如下模板可供选择:
XML/HTML代码
- shell> ls /path/to/repository/hooks
- post-commit.tmpl
- post-lock.tmpl
- post-revprop-change.tmpl
- post-unlock.tmpl
- pre-commit.tmpl
- pre-lock.tmpl
- pre-revprop-change.tmpl
- pre-unlock.tmpl
- start-commit.tmpl
其中最常用的是pre-commit和post-commit,也就是提交前后的钩子,下面以pre-commit为例来说明一下如何自定义Subversion钩子。
假设有一个PHP项目使用Subversion做版本控制,使用中发现了一些问题,比如程序员不写日志,或者提交的文件有BOM,或者提交的文件有语法错误,或者提交的文件不符合编码规范等等,这些问题都可以利用pre-commit钩子来解决,实际上已经有人写了解决类似问题的工具php-svn-hook,不过我们这里选择自己实现:
XML/HTML代码
- shell> cat /path/to/repository/hooks/pre-commit
- #!/bin/bash
-
- REPOS="$1"
- TXN="$2"
-
- SVNLOOK="/usr/bin/svnlook"
- PHP="/usr/bin/php"
-
- LOG=$($SVNLOOK log -t "$TXN" "$REPOS")
-
- if [ "$LOG" = "" ]; then
- echo "Please input log" 1>&2
- exit 1
- fi
-
- FILES=$($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}')
-
- for FILE in $FILES; do
- CONTENT=$($SVNLOOK cat -t "$TXN" "$REPOS" "$FILE")
-
- if echo "$CONTENT" | grep -q $'\xEF\xBB\xBF'; then
- echo "Please remove BOM from $FILE" 1>&2
- exit 1
- fi
-
- if [[ "$FILE" =~ \.(php|html)$ ]]; then
- MESSAGE=$(echo "$CONTENT" | $PHP -l 2>&1)
-
- if [ $? -ne 0 ]; then
- echo "$MESSAGE" | sed "s/ -/ $FILE/g" 1>&2
- exit 1
- fi
- fi
- done
-
- /path/to/PHP_CodeSniffer/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" 1>&2 || exit 1
-
- exit 0
注:代码里使用PHP_CodeSniffer检查编码规范。
配置好脚本后,一定要记着给脚本加上可执行属性,不然脚本执行后会显示不知所云的错误信息:svn: Commit blocked by pre-commit hook (exit code 255) with no output。
本文以pre-commit为例说明了一下钩子的用法,实际上其他脚本也很有用,比如说如果你想在提交代码后发一条微博,就可以利用post-commit来解决,大家自己领悟吧。
--------
主要还是对bash不熟,否则post-commit里的代码我也不至于是直接改成svn-update的代码了。
学习学习
PHP | 评论:0
| 阅读:17160
Submitted by gouki on 2011, September 19, 3:15 PM
纯笔记:
在与IOS交互的时候,采用了POST发送数据,同事说需要发送一张图片,于是我直接用$_POST进行获取,发现该字段无值。打印整个$_POST的时候,连这个key都没有找到
于是我在想,php://input有没有值呢?试了一下也没有,其实想想也是,如果真是用Base64处理后的发给我。我也应该是可以通过 $_POST收到的。
不过,还没有尝试这种:
PHP代码
- preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i', $_SERVER['HTTP_CONTENT_DISPOSITION'], $info)
这种是HTML5上传了,不过我没有试过。。。
我看了一下同事以前的代码,发现是用$_FILES的,于是很方便的套了几行代码就一切都OK了。。
看来,脑子还是不能乱。
Tags: ios
PHP | 评论:1
| 阅读:20734
Submitted by gouki on 2011, September 16, 9:50 PM
摘抄这篇文章不是说它的思路有多好,事实上,我们在用微博登录后,如果用getUserInfo方法获取个人信息的时候,里面已经包含了openId的信息了。所以,如果支持微博登录的话,有些信息也可以利用了。。
原文来自:http://lab.wehefei.com/posts/394
当qq登陆成功后,QQ会给我们返回一个唯一的用户标识,也就是openId。
![大小: 35.62 K
尺寸: 358 x 376
浏览: 1358 次
点击打开新窗口浏览全图](https://neatstudio.com/attachments/date_201109/thumb_0effbd62f9f26e5c7847061b521c89a8.jpg)
这个openId是绝对唯一确定用户的标识,你可以把它理解成QQ号。当取得openId的时候,你就需要修改原网站的user表 或 重新建立一个新表,这样做的目的是为了把openId和网站原用户进行绑定。
当qq用户登陆的时候,就需要通过openId去user表查询,如果有查询到,那么就直接修改session登陆成功;
如果没有查询到,就证明是第一次登陆,需要跳转到绑定页面,让用户绑定一个用户名(也就是说创建一个新用户),然后在修改session登陆成功。
例:
1.首先修改用户表(user)增加一个openId字段 或者重新建立一个新表
2.前面说不是用户登录后能得到openId吗?
openId是绝对唯一确定用户的标识 ,所以我们就根据这个(openId)判断
第一步:查询用户表里是否有 openId == 用户登录的openId
if(qq登陆用户openId如果用户表里查出来有的话){
根据openId取得用户信息 跳转到登陆后的用户。
}else if(qq登陆用户openId如果在户表里有没有的话) {
跳转到绑定页面,也就是创建一个新的用户(具体可以参照我的网站:http://ppptuan.com)
//创建的过程中你还可以加判断的
if(如果注册用已经有帐号了){
直接绑定 跳转到登陆后的页面。
}else if(没有帐号){
跳转到注册页面 然后绑定 跳转到登陆后的页面
}
}
思路大概就是这个样子。
当然第二种方法:
可以直接在我们member表添加一个openId的字段就OK了
----------
其实我想表达的是这里面的伪代码想法不错,在开发中,有时候就需要写这样的伪代码来先整理自己的思路。所以其实这篇文章想推荐给我的团队其他同事,在开发前一定要先把思路理清。不想写流程图就写伪代码吧。
PHP | 评论:0
| 阅读:16285