2016-11-07 44 views
0

所以我一直在尝试这一整天,我觉得有一个超级简单的解决方案,我只是想念它。尝试使用此查询:插入一个ISO8601 DATETIME引发错误

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。

任何人有任何建议吗?

回答

0

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

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

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

要理解这一点,让我们说你有一个143-101价值$code。如果你从你的PHP程序做

INSERT INTO junk (code) VALUES ($code) 

,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注入证明,或者一些网络犯罪分子击中你并窃取你的资产。

+0

“字段列表”中的未知列'Subscriber'。 $ type变量是“Subscriber”。 我以前试过这个时出现这个错误。有任何想法吗? – Nick

+0

@尼克,同样的问题。这是一个字符串,它需要引用'$ type'变量,否则数据库会认为您正在尝试引用数据库对象。 –

+0

我觉得很愚蠢。非常感谢你的解释<3 – Nick