之前插入序列化值从未出现过此问题。
我有一个名为$prefs
的数组:
$prefs=serialize(array( #logged-in preferences
'chatMsgs'=>10,
'forumThreads'=>10,
'forumReplies'=>10
));
当序列化时,变为
a:3:{s:8:\"chatMsgs\";i:10;s:12:\"forumThreads\";i:10;s:12:\"forumReplies\";i:10;}
我的INSERT
查询如下:
INSERT INTO `general_data`(`email`,`pw`,`name`,`adr`,`male`,`regged`,`conf`,`prefs`)
VALUES ('$email', '$pw', '$name', '$adr', $sex, NOW(), $conf, '$prefs');
(male
/ sex
为BIT(1)
,conf
为int(9)
,prefs
为text
。
通常我的序列化查询会按预期插入,但在这种特殊情况下,由于某种原因我收到以下错误:
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第2行的'a:3:{s:8:\“chatMsgs \”'附近使用正确的语法。
有人可以提供一些有关如何解决此问题的见解吗?
EDIT
:我可以通过在base64中对序列化字符串进行编码来解决此问题,但是,这并不能解释此错误的奇怪行为。
答案 0 :(得分:0)
您的头号问题不是properly escaping the values in your SQL statement。您应 NOT 将用户值直接插入查询中。始终使用占位符。无法逃避意味着您遇到了冲突的分隔符。
声明如下:
INSERT INTO `general_data`(`email`,`pw`,`name`,`adr`,`male`,`regged`,`conf`,`prefs`)
VALUES (:email, :pw, :name, :adr, :sex, NOW(), :conf, :prefs);
然后使用PDO,您可以绑定这些占位符。 mysqli
是替代使用?
的替代方案。
如果您坚持使用蹩脚,危险,已弃用的mysql_query
,则必须在插入查询字符串的任何和所有值上调用mysql_real_escape_string
。