发现在客户的某个PHP版本下,执行某类操作的时候,总是会报如下错误 Invalid parameter number: no parameters were bound,经google,发现是php版本过低导致。
正文:
今天在处理bug的时候发现某一个很奇怪的问题,在执行某类操作的时候会报:Invalid parameter number: no parameters were bound,但是该问题在本地或是测试机上测试都没有重现,猜想是否和版本有关,于是就google了下,发现http://forum.typecho.org/topic.php?id=1501 该文的二楼说道,该问题是版本的bug,在php5.2.9以下的pdo中会出现。于是就是找了团队中另外一位同时的机子(5.2.6)做测试,果然重现该问题,他的服务器上5.2.17上测试,该问题没有出现。
在调试的时候,发现出现该类操作的时候有如下业务报以上错误:
用PDO往表nw_log(表字段一些列uid之类的,及content字段)中插入一条数据,其中content字段的内容为<a href='http://a.xxx/?tid=1'>test</a>,并且在入库之前表字段的内容会调用PDO->quote方法进行转义。在php5.2.6机子上则报如上错误,但是在5.2.17机子上表现正常。
当我仅仅只是将内容修改为http://a.xxx/?tid=1的时候,在5.2.6机子上和5.2.17机子上均表现正常,于是再次将内容格式调试为<a href=“http://a.xxx/?tid=1”>test</a>,则5.2.6及5.2.17上均表现正常,看来是单引号惹的祸。
PHP中header和session_start前不能有输出的原因,下面分析给大家看看。
在http传输文本中,规定必须 header和content顺序必须是:header在前content在后,并且header的格式必须满足“keyword: valuen”这种格式。
1、在header输出之前有输出内容的话,就会造成对header的错误理解(尽管现在已经能容错了),例如不是满足“keyword: valuen”的格式还好,直接错误了,但是满足“keyword: valuen”这个格式以后,客户端是否安装错误理解,还是按照正确理解?
2、session开启是会隐含的触发是否用header(“Set-Cookie: sid=xxxxxx”),也就是其实还是一个隐式的header调用
大致的解决办法是保证在使用JSON处理的时候字符是以UTF8编码的。具体我们可以把数据库编码和页面编码都改为UTF8。当然喜欢用gbk编码的话,可以在进行JSON处理前,把字符转为UTF8形式
一、json_encode()
这个是一个对变量进行 JSON 编码常用的函数,但是当文本的格式不是utf-8时,中文的转码会出现一些问题,比如文本为gb2312的时候
示例
代码如下 | 复制代码 |
<?php |
解决办法
代码如下 | 复制代码 |
<?php <script type="text/javascript"> </script> |
用上面的代码js会报错 说编码不符合标准
原因是因为js 中decodeURI 仅仅支持utf8 转码。所以 ,PHP json_encode函数的代码应该为下面的代码
代码如下 | 复制代码 |
<?php 查看输出结果为: {“name”:”u4e2du6587u5b57u7b26u4e32″,”value”:”test”} |
可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:
代码如下 | 复制代码 |
<?php |
查看输出结果为:
代码如下 | 复制代码 |
{“name”:”中文字符串”,”value”:”test”} |
到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。
在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个Warning: date(): It is not safe to rely on the system\'s timezone settings.大体是说timezone没有设置,在中国使用的是格林+8小时,所以需要设置一下。
第一种
在页面头部加入以下语句
代码如下 | 复制代码 |
date_default_timezone_set("PRC"); 或 ini_set('date.timezone','asiashanghai'); |
这种方法有个缺点,就是所有的页面都得添加
第二种
在php.ini里找到date.timezone这行,把值改成PRC,如
代码如下 | 复制代码 |
date.timezone = PRC。 |
如果没有这一行直接加上就好。最后重启WEB服务器与PHP即可。
友情提示:实际上,从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0中,date.timezone这个选项,默认情况下是关闭的,无论用什么php命令都是格林威治标准时间,但是PHP5.3中好像如果没有设置也会强行抛出了这个错误的,解决此问题,只要本地化一下,就行了。
CentOS 64 编译PHP出现 error: Cannot find ldap libraries in /usr/lib 有需要的朋友可参考参考。在CentOS 64位下编译安装PHP5.4.8。cp -frp /usr/lib64/libpng* /usr/lib/ 结果在configure的时候提示
configure: error: Cannot find ldap libraries in /usr/lib
提示在/usr/lib 下找不到相关模块,这是因为64位的linux默认把以上文件都存在 /usr/lib64 文件夹下。
解决方法:
代码如下 | 复制代码 |
cp -frp /usr/lib64/libldap* /usr/lib/ |
重新configure即可