为什么这个PDOStatement不能正常执行?

时间:2012-09-20 16:07:55

标签: php pdo

我有其他执行正常的PDO语句,但是这个语句搞砸了。

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT ?,?' );
$sth->execute( array( 0, 10 ) );

以上不起作用,但下面的确有效:

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT 0,10' );
$sth->execute( array( 0, 10 ) );

那么,为什么第一种方式不能显示我的结果呢?它应该给出相同的响应?

<小时/> 所以这就是我现在所拥有的

$start = 0;
$perpage = 10;

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT ?,?' );
$sth->bindValue(1, $start, PDO::PARAM_INT);
$sth->bindValue(2, $perpage, PDO::PARAM_INT);
$sth->execute(); 

这也行不通

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT ?,?' );
$sth->bindParam(1, 0, PDO::PARAM_INT);
$sth->bindParam(2, 10, PDO::PARAM_INT);
$sth->execute();

4 个答案:

答案 0 :(得分:3)

问题可能是PDO会将任何输入解释为字符串。你可以尝试

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT :low,:high' );
$sth->bindValue(':low', 0, PDO::PARAM_INT);
$sth->bindValue(':high', 10, PDO::PARAM_INT);
$sth->execute();

或者

$low = 0;
$high = 10;
$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT :low,:high' );
$sth->bindParam(':low', $low, PDO::PARAM_INT);
$sth->bindParam(':high', $high, PDO::PARAM_INT);
$sth->execute();

来源:How to apply bindValue method in LIMIT clause?

答案 1 :(得分:0)

这是因为“准备”和使用数组参数执行认为您的数据默认为字符串。所以他们用''逃脱了。问题在于,当您处理限制时,这些引号会触发错误。 解决方案是bindValue

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT :number OFFSET :start' );
$sth->bindValue("number",10, PDO::PARAM_INT);
$sth->bindValue("start",0,PDO::PARAM_INT);
$sth->execute();

答案 2 :(得分:0)

什么数据库? MySQL的? SQL Server?甲骨文?

在MySQL中,带有LIMIT子句的PDO应该像GlaciesofPacis的帖子一样工作。但是,如果您使用的是SQL SERVER,则表示您没有使用正确的语法。参考StackOverflow问题:

$query = "
DECLARE @Sort
SET ROWCOUNT :startRow
SELECT @Sort = SortColumn FROM Table ORDER BY SortColumn
SET ROWCOUNT :pageSize
SELECT ... FROM Table WHERE SortColumn >= @Sort ORDER BY SortColumn
";

$dbh->prepare($query);
$sth->bindParam(':startRow',0, PDO::PARAM_INT);
$sth->bindParam(':pageSize',10, PDO::PARAM_INT);
$sth->execute();

答案 3 :(得分:0)

不确定您是否看到此question,但是您是否尝试将您发送的值转换为整数?

$start = 0;
$perpage = 10;

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT ?,?' );
$sth->bindValue(1, (int)$start, PDO::PARAM_INT);
$sth->bindValue(2, (int)$perpage, PDO::PARAM_INT);
$sth->execute(); 

或者说这样做:

$start = 0;
$perpage = 10;

$sth = $dbh->prepare( 'SELECT * FROM `post` LIMIT ?,?' );
$sth->bindValue(1, intval($start), PDO::PARAM_INT);
$sth->bindValue(2, intval($perpage), PDO::PARAM_INT);
$sth->execute();