2012-07-31 24 views
9

我在我的應用程序中使用了PDO。但是我在使用包含LIMIT的查詢中的預處理語句時遇到問題。有什麼問題?
代碼:在查詢中使用PDO預處理語句和LIMIT時出錯

$start = 0; 
$rows = 20; 
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?"; 
$q = $db->prepare($sql); 
$q->execute(array($start , $rows)); 

錯誤:

check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '20''

+0

@Maerlyn謝謝。我以前沒有找到這篇文章。 – 2012-07-31 10:58:13

回答

-1

date是你有back-ticks

+0

這不是問題。即使沒有連字符,它也可以工作 – 2012-07-31 10:55:44

0
$sql = "SELECT * FROM tbl_news ORDER BY `date` DESC LIMIT ?, ?"; 
3

來包裝它保留字這是一個known bug這是固定在5.5.6從米埃默裏。

來自文章: LIMIT不允許在任何情況下的變量。 它的參數必須是整數常量。

進一步修改:(關於此事的爭用) 用戶變量是預處理語句中LIMIT子句的接受參數,預處理語句的SQL語法可用於存儲過程。

第三編輯: 這個link解釋說這些應該與預處理語句一起工作。

+0

您鏈接的存儲處理存儲過程的錯誤,而不是準備好的語句。 – Maerlyn 2012-07-31 10:57:26

+0

@Maerlyn是啊,剛剛看到我自己,在看到您的評論之前做了修改。 – Fluffeh 2012-07-31 10:58:47

3

你可以這樣做:

$sql = SELECT * FROM tbl_news ORDER BY date DESC LIMIT :start, :rows"; 
$q = $db->prepare($sql); 
$q->bindParam(':start', $start, PDO::PARAM_INT); 
$q->bindParam(':rows',$rows, PDO::PARAM_INT); 
+0

限制期望一個整數,強制你的限制變量是一個整數解決真正的問題(使用的變量不被識別爲一個整數)綁定時強制它,你將永遠不必擔心限制變量的類型:)。所以這個答案應該被接受了。 – Terradon 2016-09-05 15:16:31

2

我只是偶然發現了同樣的問題。對我來說,使用我自己的語句類(擴展PDOStatement)和我自己的​​方法修復了它。

這是類:

class MyPDOStatement extends PDOStatement { 

    public function execute($input_parameters = null) { 
    if (is_array($input_parameters)) { 
     $i = 1; 
     foreach ($input_parameters as $p) { 
     // default to string datatype 
     $parameterType = PDO::PARAM_STR; 
     // now let's see if there is something more appropriate 
     if (is_bool($p)) { 
      $parameterType = PDO::PARAM_BOOL; 
     } elseif (is_null($p)) { 
      $parameterType = PDO::PARAM_NULL; 
     } elseif (is_int($p)) { 
      $parameterType = PDO::PARAM_INT; 
     } 
     // parameters passed to execute() are input-only parameters, so use 
     // bindValue() 
     $this->bindValue($i, $p, $parameterType); 
     $i++; 
     } 
    } 
    return parent::execute(); 
    } 

} 

告訴PDO使用這個聲明類而不是默認的,這樣做:

$db = new PDO(...); 
$db->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement')); 

現在問題的代碼將工作:

$start = 0; 
$rows = 20; 
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?"; 
$q = $db->prepare($sql); 
$q->execute(array($start , $rows)); 

你必須做的唯一事情就是綁定到語句的變量具有正確的類型pe,整數。如果您有數字字符串,例如從$_GET數組,你可以這樣做:

if (isset($_GET['start']) && is_numeric($_GET['start']) 
    && is_int($_GET['start'] + 0) { 
    $start = (int) $_GET['start']; 
} 

如果是過去的事情更簡單的方法,我不舒爾,但至少它爲我工作得很好。

+0

'「如果有一種更簡單的方法,我不確定......」「如果你沒有注意到的話,有一個被接受的答案。 – 2013-03-03 19:26:52