2011-07-21 83 views
3

我運行下面的代碼:PDO mysql的語法錯誤1064

$conn = new PDO(....); 
.... pdo attributes ... 

$limitvalue = 0; 
$limit = 10; 
$sql = $conn->prepare("SELECT * FROM table1 LIMIT ?, ?"); 
$sql->bindParam(1, $limitvalue, PDO::PARAM_INT); 
$sql->bindParam(2, $limit, PDO::PARAM_INT); 
$sql->execute(); 

,我也得到:

未捕獲的異常 'PDOException' 有消息「SQLSTATE [42000]: 語法錯誤或訪問衝突:1064您的SQL 語法中有錯誤;檢查對應於你的MySQL服務器版本 的手冊正確的語法使用近「NULL,10」位於第1' 行

它發生僅與此特定的查詢。其他一切都可以。

順便說一句:我知道它可能看起來很愚蠢,我做準備「代碼內」值的語句。但這僅僅是一個例子。實際上,這些值取決於頁碼,但在這裏並不重要 - 此查詢也會給出相同的錯誤。


如果有人有興趣,PHP的版本是:5.3.4RC2和MySQL的是:mysqlnd 5.0.7-dev的 - 091210 - $修訂:304625 $

回答

4

這似乎是一個php bug:PDO忽略PARAM_INT常量,並使用$limit$limitvalue變量作爲字符串。綁定時查詢中引用了哪些內容。

嘗試使用:

$sql->bindParam(1, (int)$limitvalue, PDO::PARAM_INT); 
$sql->bindParam(2, (int)$limit, PDO::PARAM_INT); 

要強制變量類型爲int。

+1

感謝您的回答。它現在有效。但還有一個問題 - 爲什麼第二個參數($ limit)在沒有int轉換的情況下工作正常?我的意思是,如果我的SQL查詢就像'LIMIT X,Y'那麼爲什麼只有** X **需要你提到的轉換(因爲** Y **工作正常)?它是指錯誤:)? – Wysiwyf

+1

我不知道。喜歡那些臭蟲:第。 – Arkh

+1

哈哈,無論如何,謝謝。 – Wysiwyf

-2

我不認爲sql中限制的第一個參數可以是NULL。如果你只是想要前10條記錄,然後使用限制10。

+1

它不是NULL - 在代碼中,'$ limitvalue = 0' –

+0

我也認爲這可能是問題所在。我已將其更改爲1,但我仍然遇到此錯誤。所以不,這裏沒關係。 – Wysiwyf