插入ISO8601 DATETIME会引发错误

时间:2016-11-07 17:48:05

标签: php mysql datetime mariadb

所以我现在已经尝试了一整天,我觉得这是一个超级简单的解决方案,我只是错过了它。试图使用此查询:

INSERT INTO codes (`user_id`, `type`, `code`, `expires`) VALUES ($id, $type, $code, $expires);

这是"到期"值:

2016-11-13T00:14:43.000Z

查询产生的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':14:43.000Z)' at line 1

这是数据库结构:

CREATE TABLE IF NOT EXISTS codes (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`code` varchar(255) NOT NULL,
`expires` DATETIME
)ENGINE=InnoDB;

如果重要,我会在$ expires变量上使用real_escape_string。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

您的日期时间值(如2016-11-13T00:14:43.000Z)是文本字符串。您需要将它们用插入语句的VALUES子句中的单引号括起来。

实际上,您需要围绕所有值使用单引号,因为它们都是文本字符串。

 INSERT INTO codes (user_id, type, code, expires) VALUES ('$id', '$type', '$code', '$expires');

要理解这一点,我们假设您的$code值为143-101。如果你这样做

 INSERT INTO junk (code) VALUES ($code)
从您的php程序

,MySQL服务器将看到

 INSERT INTO junk (code) VALUES (143-101)

将产生列值42。这将使道格拉斯亚当斯高兴,但没有其他人。

您希望MySQL服务器看到

 INSERT INTO junk (code) VALUES ('143-101')

你可以用

做什么
 INSERT INTO junk (code) VALUES ('$code')

而且,如果这个应用程序可以被全球互联网访问,你必须研究SQL注入并使你的SQL注入证明,或者某些网络犯罪 pwn你并窃取你的资产。