这个MySQL查询失败,即使它不应该

时间:2013-06-27 13:50:53

标签: mysql syntax

$NumPMs = mysql_query("SELECT * FROM messages WHERE to_user='$name' AND read='0'") or die (mysql_error());
$numofpms = mysql_num_rows($NumPMS);

我收到此错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'read='0'' at line 1

没有意义。它应该工作。

帮助将不胜感激!

编辑:

我将查询更改为:$ NumPMs = mysql_query(“SELECT * FROM messages WHERE to_user ='$ name'AND read ='0'”)或die(mysql_error()) ;

有效。虽然,我的mysql_num_rows也发出错误:警告:mysql_num_rows()期望参数1为资源,在第78行的/home/recatio2/public_html/Main.php中给出null

请帮忙。

4 个答案:

答案 0 :(得分:2)

在将其添加到SQL之前,您应该转义字段名称和$ name。

$NumPMs = mysql_query("SELECT * FROM `messages` WHERE `to_user`='". mysql_real_escape_string($name)."' AND `read`='0'") or die (mysql_error());

答案 1 :(得分:2)

read是MySQL中的保留关键字。您可以使用反引号转义所有字段名称:

$NumPMs = mysql_query("SELECT * FROM messages WHERE `to_user`='$name' AND `read`='0'") or die (mysql_error());

答案 2 :(得分:1)

READ是一个mysql_reserved字;您可以在以下位置查看列表: http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

一种解决方案是用反引号来逃避它:

SELECT * FROM messages WHERE to_user='$name' AND `read`='0'

另一种方法是将字段重命名为其他内容 - 对列或表名使用保留字是不好的做法。

答案 3 :(得分:0)

$NumPMs = mysql_query("SELECT * FROM messages m WHERE m.to_user='$name' AND m.read='0'")

使用表的别名以避免与保留的MySQL关键字冲突。

使用别名使其明确清楚从哪个表引用哪些列也是一个好主意。一旦您的查询变得更加复杂并涉及更多表格,您将看到这样做的好处。