2013-08-01 30 views
4

我有這樣的查詢:參數化查詢PDO和`LIMIT`條款 - 不工作

SELECT imageurl 
FROM entries 
WHERE thumbdl IS NULL 
LIMIT 10; 

它完美地與PDO和MySQL工作臺(它返回10個網址作爲我想要的)。

但是我試圖參數化LIMIT與PDO:

$cnt = 10; 
$query = $this->link->prepare(" 
      SELECT imageurl 
      FROM entries 
      WHERE imgdl is null 
      LIMIT ? 
     "); 

$query->bindValue(1, $cnt); 

$query->execute(); 

$result = $query->fetchAll(PDO::FETCH_ASSOC); 

返回空數組。

回答

14

我只是測試了一堆案件。我在OS X上使用PHP 5.3.15,並查詢MySQL 5.6.12。

任意組合的作品,如果你設置:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

以下所有工作的:你可以使用一個int或串;你不需要使用PDO :: PARAM_INT。

$stmt = $dbh->prepare("select user from mysql.user limit ?"); 

$int = intval(1); 
$int = '1'; 

$stmt->bindValue(1, 1); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindValue(1, '1'); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindValue(1, 1, PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindValue(1, '1', PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindParam(1, $int); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindParam(1, $string); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindParam(1, $int, PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindParam(1, $string, PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

也可以忘記bindValue()或bindParam(),而是通過其中一個int或字符串在陣列參數執行()。這工作正常,並做同樣的事情,但使用數組更簡單,通常更方便的代碼。

$stmt = $dbh->prepare("select user from mysql.user limit ?"); 

$stmt->execute(array($int)); 
print_r($stmt->fetchAll()); 

$stmt->execute(array($string)); 
print_r($stmt->fetchAll()); 

如果啓用模擬準備,只有一個組合的工作原理:你必須使用一個整數作爲參數必須指定PDO :: PARAM_INT:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 

$stmt = $dbh->prepare("select user from mysql.user limit ?"); 

$stmt->bindValue(1, $int, PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

$stmt->bindParam(1, $int, PDO::PARAM_INT); 
$stmt->execute(); 
print_r($stmt->fetchAll()); 

傳遞值的execute()如果您已啓用模擬準備工作,則不起作用。

+3

感謝有關PDO參數的很多有用的信息! :) – Kamil

+1

匿名downvoter:請讓我知道你爲什麼認爲這個答案是不正確的。也許我可以改進它。 –

+0

我是另一個downvoter。我之所以下降是因爲:「你也可以忘記bindValue()或bindParam(),而是將數組參數中的一個int或一個字符串傳遞給execute(),只要禁用了模擬準備就行。準備好的陳述的力量是關於綁定的!與綁定habbit你不能忘記逃脫或鑄造。是的,有時你需要一些額外的代碼才能使它工作。但是:安全第一! – Terradon

9

默認情況下bindValue綁定一個字符串值,但限制是一個整數,所以使用PDO :: PARAM_INT

$query->bindValue(1, $cnt, PDO::PARAM_INT); 
+0

謝謝,它幫助+1,但@BillKarwin提供了一種更有用的答案。 – Kamil

+0

這個幫了我:) – Terradon