为什么我会收到SQL语法错误?

时间:2012-01-26 16:29:17

标签: php mysql sql

我有一个名为record的表格,其中包含字段ID,电子邮件,密钥和时间。 “key”是电子邮件的md5哈希值。所以我有以下查询/命令

$key = md5($email);
$reg_time = time ();

$query = "INSERT INTO record (id, email, key, time) VALUES (NULL,\"$email\", \"$key\", \"$reg_time\")";
result = mysql_query($query) or die(mysql_error());

当我运行没有“密钥”的sql查询,即只使用(id,电子邮件,时间)时,它工作正常,但当我用密钥运行时,我得到:

 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 'key, time) VALUES (NULL,"someemail.com", "itsmd5hash"' at line 1

密钥存储为varchar(5000)...现在只是为了确保它不是关于长度

问题是什么?

4 个答案:

答案 0 :(得分:4)

KEY是一个保留字。您需要引用该列名称才能使用它。

所以,使用

`key` 

而不是

key

答案 1 :(得分:2)

KEY是MySQL中的reserved word。您需要将列名称包装在反引号中(` - 通常位于键盘的左上角,1旁边):

$query = "INSERT INTO record (id, email, `key`, time) VALUES (NULL,\"$email\", \"$key\", \"$reg_time\")";

此外,您可以使用单引号来包装字符串,因此您不需要那些难以读取的转义序列。以下是我将如何编写查询代码:

$query = "INSERT INTO `record`
            (`id`, `email`, `key`, `time`)
          VALUES
            (NULL, '$email', '$key', '$reg_time')";

答案 2 :(得分:0)

Key是mysql中的保留字。

使用key代替密钥

答案 3 :(得分:0)

我知道它已被回答但是密钥是mysql中的保留字。请google mysql保留字样。我倾向于为出生日期等事情制作首字母缩略词,大多数人会使用日期,但我使用DoB,因为日期是保留的。

如果封装在反引号中,它们仍然可以被使用但是我建议不要使用保留字,因为如果忘记保留它可能会导致挫败感。

另外一个md5哈希标签是一个32字符的哈希值,因此你的varchar不能高于varchar(32),尽管我总是使用(33)以防万一。我很确定varchar会截断自己,但我不是100%肯定。也可以使用sha1($ variable)代替md5($ variable)。它是一个更高级的哈希序列,长度为40个字符。 Sha2()也存在,sha3()将在2012年发布,扩展哈希值达到512位。