2012-09-20 63 views
3

我有其他PDO聲明執行得很好,但是這個是搞砸了。爲什麼這個PDOStatement不能正確執行?

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

你可以改變陣列(0,10)以陣列(0,10),看看它是否工作 – Satya

+0

對不起,那是一個錯字。沒有第二個逗號,它仍然不起作用。 :( – Dominick

+0

和第二個逗號不是拼寫錯誤,php不禁止它 – artragis

回答

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?

+0

聽起來像它會工作,但我得到這個錯誤:致命錯誤:無法通過引用傳遞參數2。有任何想法嗎? – Dominick

+0

你需要改變'bindParam'到'bindValue'我相信,在你的回答@GlaciesofPacis – PenguinCoder

+0

@PenguinCoder - 是的,我喜歡。 'bindParam'只能用於參數,而'bindValue'可以使用參數或值 –

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(); 
+0

$ start = 0; $ perpage = 10; $ sth = $ dbh-> prepare('SELECT * FROM'post' LIMIT?,? '); $ sth-> bindValue(1,$開始,PDO :: PARAM_INT); \t \t \t $ sth-> bindValue(2,$ perpage,PDO :: PARAM_INT); $ sth->執行() ?; 仍然沒有工作 – Dominick

+0

對不起,只是一個錯字 – artragis

+0

爲什麼要使用1和2的指數,我認爲0和1是好的,您還可以使用命名參數(例如:限制和:偏移) – artragis

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(); 
+0

這是MySQL。 GlaciesofPacis的建議返回致命錯誤:無法通過引用傳遞參數2。 任何想法? – Dominick

+0

您需要將'bindParam'更改爲'bindValue'。 – PenguinCoder

+0

我也試過,但它不起作用:http://pastebin.com/7k4515pk – Dominick

0

不知道您看到這個question但你嘗試過鑄造發送爲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(); 
相關問題