0

このMySQLクエリがあります:

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

そして、それは私にエラーを与えます;

SQL 構文にエラーがあります。1 行目の「read = 0」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

私が削除した場合:

AND read = 0

一部、それは完全に正常に動作します。私は何が間違っていたのでしょうか?

4

2 に答える 2

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

于 2013-05-11T16:19:25.770 に答える
0

このクエリを使用すると、mysql の予約済みキーワードを使用しようとしています。READ は予約キーワードです。バックティック演算子を使用する

$querynotis = "SELECT * FROM notifications WHERE pid = " . $_SESSION['sess_id'] . " AND `read` = '0'";
于 2013-05-11T16:19:38.517 に答える