我在以下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行
答案 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_string
,mysqli_real_escape_string
或pdo_quote
在将每个变量传递给数据库之前对其进行转义。
或者,如果您正在使用MySQLi或PDO,请使用带有绑定参数的预准备语句,以便为您执行此操作。
答案 7 :(得分:0)
INSERT INTO用户('用户名',...
正如Itay所指出的,这里不需要单引号。如果您希望/需要使用保留字作为名称,则必须使用其他内容对其进行分隔:
如果您想使用跨DBMS兼容的话,设置连接的sql_mode(或服务器默认值,如果不会干扰其他应用程序)以允许ANSI_QUOTES并不是一个坏主意代码在这里。
('$ username',...
糟糕!除非您之前处理了$ username以逃避它,否则您刚刚在应用程序中邀请了一个可爱的SQL injection安全漏洞。请参阅mysql_real_escape_string或更好地使用参数化查询来避免这种情况。