首页 > 编程技术 > php

PDO版本问题 Invalid parameter number: no parameters were bound

发布时间:2016-11-25 17:39

PDO版本问题 Invalid parameter number: no parameters were bound 有碰到此类问题的朋友可参考参考。

  发现在客户的某个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
$jsonText = array (
 0 => array (
  'id' => '1',
  'name' => '文本1'
 ),
 1 => array (
  'id' => '2',
  'name' => '文本2'
  )
) ;
 
echo json_encode($jsonText);
//[{"id":"1","name":""},{"id":"2","name":""}]
//可以看到汉字没有被转义都为空“”,这是因为json仅仅转义encoding编码(类似于:%B0%AE),故上面语句应该先转换编码
?>

解决办法

 代码如下 复制代码

<?php
foreach ($jsonText as $key=>$value)
{
 $jsonText[$key]['name'] = urlencode($value['name']);
}
echo json_encode($jsonText);
?>
客户端处理

<script type="text/javascript">
function encodeTest(obj)
{
 $.ajax( {
  type : "GET",
  url : "< ?=$this->baseUrl?>/index/getajax",
  data : "c=" obj.value,
  success : function(json)
   {
       var json=eval(json);
       var testValue = '';
       $.each(json, function(k) {
                   testValue += decodeURI(json[k]['name']) ;
       });
 
       alert(testValue);
   }
 } )
 
}

</script>

用上面的代码js会报错 说编码不符合标准

原因是因为js 中decodeURI 仅仅支持utf8 转码。所以 ,PHP json_encode函数的代码应该为下面的代码

 代码如下 复制代码

<?php
foreach ($jsonText as $key=>$value)
{
 $jsonText[$key]['name'] = urlencode(iconv('gb2312', 'utf-8',$value['name']));
}
echo json_encode($json);
?>

查看输出结果为:

{“name”:”u4e2du6587u5b57u7b26u4e32″,”value”:”test”}

可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:

 代码如下 复制代码

<?php
    $testJSON=array('name'=>'中文字符串','value'=>'test');
    //echo json_encode($testJSON);
    foreach ( $testJSON as $key => $value ) {
  $testJSON[$key] = urlencode ( $value );
    }
    echo urldecode ( json_encode ( $testJSON ) );
?>

查看输出结果为:

 代码如下 复制代码
{“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即可

标签:[!--infotagslink--]

您可能感兴趣的文章: