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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
<?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语句,结果正常

1
2
3
4
5
6
7
8
9
10
11
<?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'预处理绑定参数方式导致取不出数据,同样也不会报错

1
2
3
4
5
6
7
8
9
10
<?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关键字语句,结果能取出数据

1
2
3
4
5
6
7
8
9
10
<?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);
?>

posted on 2014-04-03 16:45  innoo1  阅读(283)  评论(0)    收藏  举报

导航