繁体   English   中英

为什么会出现SQL语法错误?

[英]Why Am I getting an SQL syntax error?

我有一个名为record的表,其中包含字段ID,电子邮件,键和时间。 “密钥”是电子邮件的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,email,time),它运行良好,但是当我使用键运行它时,我得到:

 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)...现在只是为了确保它与长度无关

可能是什么问题?

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

所以用

`key` 

代替

key

KEY是MySQL中的保留字 您需要将列名称包装在反引号中( ` -通常在键盘的左上角,旁边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')";

键是mysql中的保留字。

使用key代替密钥

我知道它已经被回答了,但是键是mysql中的保留字。 请google mysql保留字。 我倾向于为出生日期之类的缩写,大多数人会使用日期,但我使用DoB,因为日期是保留的。

如果将它们封装在反引号中,它们仍然可以使用,但是我建议您避免保留字,因为如果您忘记保留字,可能会造成挫败感。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM