Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么这个PDO语句不能正确执行?_Php_Pdo - Fatal编程技术网

Php 为什么这个PDO语句不能正确执行?

Php 为什么这个PDO语句不能正确执行?,php,pdo,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 ) ); 那么,为什么第一种

我还有其他的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();

这是因为prepare和executewitharray参数默认认为数据是字符串。所以他们用“”来逃避。问题是,当您处理限制时,这些引号会触发错误。 解决方案是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();

问题很可能是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();


来源:

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

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

$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();
不确定您是否看到了这一点,但您是否尝试过将发送的值转换为int

$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(); 

你能把数组0,10改成数组0,10,看看它是否有效吗对不起,那是个打字错误。如果没有第二个逗号,它仍然不起作用第二个逗号不是输入错误,php不禁止它的发音,但我得到了这个错误:致命错误:无法通过引用传递参数2。有什么想法吗?在你的回答中,我相信你需要将bindParam改为bindValue@GlaciesofPacis@PenguinCoder-是的,我知道。bindParam仅适用于参数,而bindValue可以使用参数或value@GlaciesofPacis我尝试了两段代码,都没有返回任何结果。但如果我简单地将:low,:high更改为0,10,它将显示良好。这让我抓狂。只是为了好玩,在逗号后加一个空格,所以从“post”LIMIT:low,:high$start=0$每页=10$sth=$dbh->准备“从后限制中选择*,?”$sth->bindValue1,$start,PDO::PARAM_INT;$sth->bindValue2,$perpage,PDO::PARAM_INT$执行某事物;仍然不工作为什么使用1和2作为索引?我认为0和1是好的。您还可以使用命名参数,例如:limit和:offset@artragis对于使用问号占位符的已准备语句,bindValue实际上是1索引的,这将是参数的1索引位置。我同意使用命名参数更清晰!如果新代码不起作用,那就是您拼错了表名。检查post的大小写,检查单数等等。它是MySQL。GlaciesofPacis的建议返回致命错误:无法通过引用传递参数2。有什么想法吗?您需要将bindParam更改为bindValue。
$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();