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 構文にエラーがあります。2 行目の ''a:3:{s:8:\"chatMsgs\"' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

どうすればこの問題を解決できるかについて、誰か洞察を提供してもらえますか?

EDIT:シリアル化された文字列を base64 でエンコードすることでこの問題を回避できますが、これではこのエラーの奇妙な動作は説明できません。

4

1 に答える 1

0

一番の問題は、SQL ステートメントの値を適切にエスケープしていないことです。ユーザー値をクエリに直接挿入しないでください。常にプレースホルダーを使用してください。エスケープに失敗すると、競合する区切り文字に遭遇することになります。

ステートメントは次のようになります。

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

于 2012-11-08T18:10:08.843 に答える