0

以前插入序列化值时从未遇到过这个问题。

我有一个名为$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中编码序列化字符串来解决这个问题,但是,这并不能解释这个错误的奇怪行为。

4

1 回答 1

0

Your number one problem is not properly escaping the values in your SQL statement. You should NOT be inserting user values directly into the query. Always use placeholders. A failure to escape means that you run into conflicting delimiters.

The statement should look like:

INSERT INTO `general_data`(`email`,`pw`,`name`,`adr`,`male`,`regged`,`conf`,`prefs`)
                    VALUES (:email, :pw, :name, :adr, :sex, NOW(), :conf, :prefs);

Then using PDO you can bind against those placeholders. mysqli is an alternative that uses ? instead.

If you insist on using the creaky, dangerous, deprecated mysql_query you will have to call mysql_real_escape_string on any and all values interpolated into your query string.

于 2012-11-08T18:10:08.843 回答