49彩票集团首页-49彩票集团官网|官网首页

49彩票集团让大家拥有最好的账号使用功能,49彩票集团是为大家带来更加方便的使用途径,是因为在49彩票集团娱乐的玩家们越来越多,发展成为最受欢迎的网上体育娱乐公司。

今天发现php5.1.,该问题是版本的bug

2019-10-01 作者:计算机网络   |   浏览(105)

  发现在客户的某个PHP版本下,执行某类操作的时候,总是会报如下错误 Invalid parameter number: no parameters were bound,经google,发现是php版本过低导致。

介绍

正文:

 

      今天在处理bug的时候发现某一个很奇怪的问题,在执行某类操作的时候会报:Invalid parameter number: no parameters were bound,但是该问题在本地或是测试机上测试都没有重现,猜想是否和版本有关,于是就google了下,发现 该文的二楼说道,该问题是版本的bug,在php5.2.9以下的pdo中会出现。于是就是找了团队中另外一位同时的机子(5.2.6)做测试,果然重现该问题,他的服务器上5.2.17上测试,该问题没有出现。

今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异。

       在调试的时候,发现出现该类操作的时候有如下业务报以上错误:

 

       用PDO往表nw_log(表字段一些列uid之类的,及content字段)中插入一条数据,其中content字段的内容为<a href='

预编译优点

      当我仅仅只是将内容修改为 href=“

1.使用占位符,避免逐字输入数据到SQL中。自动处理引号和反斜线等字符的转义——增加安全性。

 

49彩票集团,2.预先“准备”一条语句,然后在每次执行时绑定不同值达到重用的目的。——常用于以后被多次执行的语句。

3.可读性强。

 

代码

数据库连接代码都一样.

 

$protol = 'mysql:host=localhost;dbname=test';
$username = 'monty';
$passwd = '0818';
$dbh = new PDO($protol, $username, $passwd);

以下是一些测试。注意里面的SQL和for或者foreach语句!

测试1(用key值进行绑定)

$stmt = $dbh->prepare('select * from t1 where name=:name');
$params = array();
$params['name'] = 'rentao';

foreach($params as $k=>$v){
    $stmt->bindParam($k, $v);
}
$stmt->execute();

$item = array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    var_dump($row);
}
$stmt = null;
$dbh = null;

 结论:

PHP 5.1.*

PHP 5.2.*

执行正常

执行正常

$params['name'] = 'rentao' 和$params[':name']='rentao'这两个都能执行,说明不受“:”限制。

测试2(数字下标去绑定,但是绑定的起始参数是1)——":key"在php5.2.*上不能用数字下标绑定

$stmt = $dbh->prepare('select * from t1 where name=:name limit 2');
$params = array();
$params[] = 'rentao';// 这里加不加":"都能成功执行


for($i=0,$iLen = count($params); $i < $iLen; $i++){
    $k = $i+1;
    $stmt->bindParam($k, $params[$i]);
}
echo "HERE1n";
$stmt->execute();
echo "HERE2n";

$item = array();

介绍

 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    var_dump($row);
}
$stmt = null;
$dbh = null;

 结论:

php 5.1.*

PHP 5.2.*

本文由49彩票集团发布于计算机网络,转载请注明出处:今天发现php5.1.,该问题是版本的bug

关键词: