PDO不能使用预处理的两处地方

PHP 2012-06-26 php,pdo,预处理

有些童鞋使用预处理方式取数据库信息时发现结果是空,但数据库的确存在信息。这个是新手经常忽略的一个地方,甚至可能调试半天都不知道问题出在哪里?

第一、MySQL中的LIMIT关键字不能使用预处理

错误的:以下语句在LIMIT中使用了':start',':num'预处理绑定参数方式导致取不出数据,但不会报错。

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test',root,root);
$start = 20;
$num = 10;
$sql = 'SELECT * FROM tab LIMIT :start,:num';
$stmt = $pdo->prepare($sql);
$param = array(':start'=>$start,':num'=>$num);
$stmt->execute($param);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($data); 
?>

正确的:直接拼出LIMIT语句,结果正常

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test',root,root);
$start = 20;
$num = 10;
$sql = 'SELECT * FROM tab LIMIT '.$start.','.$num;
$stmt = $pdo->prepare($sql);
//$param = array(':start'=>20,':num'=>10);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($data); 
?>

第二、MSSQL中TOP关键字不能使用预处理

错误的:在TOP关键字中使用了':top'预处理绑定参数方式导致取不出数据,同样也不会报错

<?php
$pdo = new PDO('mssql:host=localhost;dbname=test',root,root);
$top = 10;
$sql = 'SELECT TOP :top * FROM tab';
$stmt = $pdo->prepare($sql);
$param = array(':top'=>$top);
$stmt->execute($param);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($data); 
?>

正确的:直接拼出TOP关键字语句,结果能取出数据

<?php
$pdo = new PDO('mssql:host=localhost;dbname=test',root,root);
$top = 10;
$sql = 'SELECT TOP '.$top.' * FROM tab';
$stmt = $pdo->prepare($sql);
//$param = array(':top'=>$top);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($data); 
?>

文字链接:《PDO不能使用预处理的两处地方

文章地址:http://www.qttc.net/201206104.html

除非标注,琼台博客所有博文均为原创,转载请加文字链接注明来源

乳名?小名?昵称?网名?均可

email,放心,我不会给你乱投广告的

想获得回访就把你的站点URL写上(没有留空)

[NOTICE]木要投放广告
[NOTICE]木要骂人,说不该说的话
[NOTICE]自由言论,但要遵纪守法

Comments 2

  • http://cn2.php.net/manual/en/pdostatement.execute.php input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR. 不是不能用预处理,而是默认使用的是字符串啊...你自己查看下执行上面2条命令时的MYSQL查询日志就知道了
    2014-07-12 02:26:20 [ 跟帖 ]
    感谢达人的解答
    2014-08-10 10:38:40 [ 跟帖 ]
    1 #