这个查询出了什么问题?

时间:2010-01-24 07:32:47

标签: php sql mysql

有人帮助我:

$query = "INSERT INTO tbl_users(user, password, password_def, userid, level
          , regdate, lastdate, email) VALUES('$username', sha1('$password')
          , sha1('$password'), '$userid', '0', NOW(), NOW(), '$email');";

$userid是ramdon md5 id。

它给了我这个错误:

posttokenError: Account not created 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 '\'esck21\', sha1(\'password\'), sha1(\'password\'), 
    \'14bd25cbe111c2975232b33ee8c2' at line 1

我想我会心脏病发作。 感谢。

2 个答案:

答案 0 :(得分:2)

根据错误消息判断,您可能会在整个查询上调用某种转义函数,例如addslashes($query)mysql_real_escape_string($query)。这将逃避查询中的每个引用,当你真正想要做的只是逃避变量中的引号时。

如果是这种情况,那么你想要做这样的事情:

$query = "INSERT INTO tbl_users(user, password, password_def, userid, level,
regdate,lastdate, email) VALUES('".mysql_real_escape_string($username)."',
sha1('".mysql_real_escape_string($password)."'), 
sha1('".mysql_real_escape_string($password)."'), 
'".mysql_real_escape_string($userid)."', '0', 
NOW(), NOW(), '".mysql_real_escape_string($email)."')";

这将正确地转义您的数据,而不会错误地转义查询的其余部分。完成此操作后,请不要通过其他形式的转义将$query作为整个字符串运行。

答案 1 :(得分:1)

您需要反击(`)密码字段:

$query = "INSERT INTO `tbl_users` (`user`, `password`, `password_def`, `userid`
              , `level`, `regdate`, `lastdate`, `email`) 
          VALUES('$username', 'sha1($password)', 'sha1($password)', '$userid'
              , '0', NOW(), NOW(), '$email');";

您应该始终反击字段,表格和数据库。

还有一件事:关注SQL Injections ,请使用mysql_real_escape_string()


经过一番讨论,我确信你的问题在于你的引用用法,检查zombat的答案。