MySQL:无法插入序列化值

时间:2012-11-08 18:04:37

标签: php mysql serialization insert

之前插入序列化值从未出现过此问题。

我有一个名为$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 / sexBIT(1)confint(9)prefstext

通常我的序列化查询会按预期插入,但在这种特殊情况下,由于某种原因我收到以下错误:

  

您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在第2行的'a:3:{s:8:\“chatMsgs \”'附近使用正确的语法。

有人可以提供一些有关如何解决此问题的见解吗?

EDIT:我可以通过在base64中对序列化字符串进行编码来解决此问题,但是,这并不能解释此错误的奇怪行为。

1 个答案:

答案 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