SQL语法错误

时间:2009-03-05 14:24:47

标签: mysql sql

我在以下sql中找不到错误:

$query = "INSERT INTO users('username', 'password', 'key', 'email', 'rank', 
'ip','active') VALUES ('$username','$password','$random','$email','1','$ip',
'0')";

出于某种原因,我不断收到错误

错误:您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在''username','password','key','email','rank','ip','active'附近使用正确的语法。)VALUES('wx ','79'在第1行

8 个答案:

答案 0 :(得分:16)

变换

('username', 'password', 'key', 'email', 'rank', 'ip', 'active')  

(`username`, `password`, `key`, `email`, `rank`, `ip`, `active`)  

在MySQL中,字段名称应该是不引用反引号(包含在后面的标记或后引号中)。

在MS SQL Server中,字段名称应该不加引号或括在 [方括号] 中。

其他SQL DBMS主要遵循SQL标准,字段名称应该不加引号或用“双引号”括起来,然后称为“分隔标识符”。有时,您必须打开定界标识符处理(这本身就是非标准行为)。

答案 1 :(得分:4)

丢失列名称周围的引号。

答案 2 :(得分:2)

不要将列名称放在单引号中:

$query = "INSERT INTO users(username, password, key, email, rank, ip, active) 
          VALUES ('$username','$password','$random','$email','1','$ip','0')";

我们暂时忽略SQL注入问题。 : - )

答案 3 :(得分:2)

“在''user ...'附近使用正确的语法是一个很好的提示。你应该删除列名称周围的''。

答案 4 :(得分:0)

删除字段名称周围的单引号。 错误消息为您提供了问题的提示。

  

检查对应的手册   您的MySQL服务器版本   在<'username'附近使用正确的语法,   '密码','密钥',......

答案 5 :(得分:0)

除了如上所述删除名称周围的撇号之外,如果数据库提供程序中的保留关键字是一些名称,则可能需要指定一些名称作为标识符。

对于SQL Server,您可以使用括号来指定标识符:[password],但是从您的错误消息中可以看出,您使用的是MySQL,它使用反引号(`)而不是括号。 (由于这个论坛使用了代码块的反引号,我无法写出一个例子,但我认为无论如何你都会得到它。)

根据表格中的数据类型,您可能还需要删除某些值周围的撇号。例如,如果rank是数字字段,则值中的数字1周围不应有撇号。

答案 6 :(得分:0)

判断错误发生的位置,在将数据发送到数据库之前不会转义数据,密码中的第三个字符是撇号(')。

根据您使用的MySQL API,您需要以下功能之一: mysql_real_escape_stringmysqli_real_escape_stringpdo_quote在将每个变量传递给数据库之前对其进行转义。

或者,如果您正在使用MySQLi或PDO,请使用带有绑定参数的预准备语句,以便为您执行此操作。

答案 7 :(得分:0)

  

INSERT INTO用户('用户名',...

正如Itay所指出的,这里不需要单引号。如果您希望/需要使用保留字作为名称,则必须使用其他内容对其进行分隔:

  • `backticks`,默认的MySQL方式,或
  • “doublequotes”,其他数据库支持的标准ANSI SQL方式。

如果您想使用跨DBMS兼容的话,设置连接的sql_mode(或服务器默认值,如果不会干扰其他应用程序)以允许ANSI_QUOTES并不是一个坏主意代码在这里。

  

('$ username',...

糟糕!除非您之前处理了$ username以逃避它,否则您刚刚在应用程序中邀请了一个可爱的SQL injection安全漏洞。请参阅mysql_real_escape_string或更好地使用参数化查询来避免这种情况。