2013-05-11 50 views
0

我有這樣的MySQL查詢:MySQL的「與」給我的錯誤

$querynotis = "SELECT * FROM notifications WHERE pid = " . $_SESSION['sess_id'] . " AND read = 0"; 

,它給我的錯誤;

您的SQL語法錯誤;檢查對應於你的MySQL服務器版本正確的語法使用近1行

「讀= 0」如果我刪除了該手冊:

AND read = 0 

部分,它完美的罰款。我可以做錯什麼?

+0

在嘗試執行查詢之前輸出'$ querynotis'的值;你可能會注意到一些事情。 – mustaccio 2014-05-02 20:36:01

+0

[由於在MySQL中使用保留字作爲表或列名稱而導致的語法錯誤]的可能重複(http://stackoverflow.com/questions/23446377/syntax-error-due-to-using-a-reserved-word -as-a-table-or-column-name-in-mysql) – 2014-05-06 10:05:06

回答

5

READ是一個保留關鍵字,恰好是您的列的名稱。爲了避免語法錯誤,列名應該使用反引號進行轉義。當然,

$pid = $_SESSION['sess_id']; 
$querynotis = "SELECT * FROM notifications WHERE pid = $pid AND `read` = 0"; 

的另一種方式,而不是反引號轉義它:

$pid = $_SESSION['sess_id']; 
$querynotis = "SELECT * FROM notifications n WHERE pid = $pid AND n.read = 0"; 

如果您有權限更改表,更改列名不在保留關鍵字列表上,以防止同樣的錯誤再次回到未來。


作爲旁註,查詢是用SQL Injection脆弱,如果變量的值(小號)從外部來了。請看下面的文章,瞭解如何防止它。通過使用PreparedStatements你可以擺脫使用單引號圍繞值。

+0

謝謝,不知道。我馬上編輯列名。這些變量不是來自外部的,所以我不會在SQL注入時遇到麻煩。儘管感謝您的領導。 – 2013-05-11 16:24:05

+0

不客氣':)' – 2013-05-11 16:24:33

0

使用此查詢,您要使用mysql的保留關鍵字。 READ是預留關鍵字。使用反引號運算符

$querynotis = "SELECT * FROM notifications WHERE pid = " . $_SESSION['sess_id'] . " AND `read` = '0'"; 
+0

謝謝你的迴應!幫助我很多:) – 2013-05-11 16:25:37

+0

酷快樂編碼 – 2013-05-11 16:33:41