2012-10-23 125 views
2

我得到这个错误显示在我的屏幕上,我一直在尝试调试。MYSQL语法错误 - SELECT语句

“您的SQL语法错误;检查对应于你的MySQL服务器版本,在1号线附近使用‘来=‘测试名称’’正确的语法手册”

我的功能即时通讯使用这是如下:

function recentMessages() { 
    $tbl_name="messages"; 
    $username = $_SESSION['username']; 
    $result = mysql_query("SELECT * FROM $tbl_name WHERE to = '$username' ") or die(mysql_error()); 
    while ($row = mysql_fetch_row($result)) 
     { 
     return $row['date']." ".$row['time']." ".$row['from']." ".$row['subject']. "<br />";  
     } 
} 

基本上什么即时试图做的是从数据库中的信息,其中谁是它的“为”是会话和回显出来的用户名获得数据的所有行。任何想法做什么即时错误?谢谢

+0

@BrendanLong这是一个正确的观点(当然)逃避变量在SQL,但如果是微不足道的修改会话数据,SQL注入将是至少你的应用程序的后顾之忧。安德鲁 - 考虑有$ username =“'OR 1 = 1或x ='” – AD7six

+0

你应该[escape string data](http://php.net/manual/en/function.mysql-real-escape-string。 PHP)在将其用于数据库之前,即使您认为它可能是安全的,也可以从外部源获得。 –

回答

10

to是一个保留字。以刻度标记进行处理。

... WHERE `to` = '$username' 

查看MySQL reserved words

如果可能,应避免使用保留字。

+0

不错!甚至没有意识到他们已经为mysql保留了词语! – Nexus9988

+0

@AndrewL大多数(如果不是全部的话)DBMS具有保留字。 – Kermit

-1

是我相信的保留字。尝试改为[至] 编辑:完全不确定。我把它放在SQL Server中,看到TO是一个保留字。

+0

它不是mssql,它是mysql – AD7six

+0

我相信括号只适用于MSSQL,我的MySQL。 – Kermit

+1

吉兹对此的投票是苛刻的。这个答案仍然是正确的问题(保留字),只是有错误的数据库的语法.. –

1

该to是保留字。试试这个:

$result = mysql_query("SELECT * FROM $tbl_name WHERE `to` = '$username' ") 
       or die(mysql_error()); 

一般尽量避免小言喜欢之间,从... e.t.c.只是为了防止这种问题。更好的解决方案是有一个字段名称,如:“receiver”或“message_to”或类似的东西

0

TO是MySQL中的保留字。使用反引号来分隔。

SELECT * FROM $tbl_name WHERE `to` = '$username'