• ベストアンサー

phpMyAdminで正常に認識されていない??

下記のようにテーブルにデータを投げたところ「'」の前に「\」がある場合シングルコーテーションとして認識されずエラーを起こします。 尚、「―」が含まれる場合もエラーを起こします。 INSERT INTO `table` VALUES (1, 'test', 1, 1, 1, 'タイトル', '名前', 'パスワード', 'テストコメント―\―\―\―\―\'); 正しく認識されていないということなのでしょか? phpの問題なのでしょうか…

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

shift_jisつかってるとこういう現象が多々でます ― は 5C問題といわれる文字のひとつです これは、SQLやPHPで使う特殊な記号についてはその特殊な記号そのものを文字列として扱う場合には、特殊文字の前に「\」をつけて「この文字は記号ではなくて、普通の文字として扱ってくださいね」という意味を持たせることができます たとえばPHPで echo "あいうえお かきくけこ"; の場合、 " " このダブルクォーテーションの間を文字列データとして扱いなさい という意味ですがもし、「"」そのものを文字として扱いたい場合はどうなるでしょう echo "あいうえお " かきくけこ"; 「お」と「か」の間にある「"」は人間の目から見れば単なる文字の一部ですが、PHP側から見れば「ここで文字列終わり」という意味の記号です echo "あいうえお " と かきくけこ"; の 二つの意味となり 「かきくけこ"; 」の部分でエラーが出ます それを回避するために echo "あいうえお \" かきくけこ"; とすることで、「お」と「か」の間にある「"」は 文字列扱いとしてくれます。 「\」そのものを文字列として扱いたい場合も同じように 画面に あいうえお \ かきくけこ と表示させたい場合は echo "あいうえお \\ かきくけこ"; と記述します。 さて、ここまではよいでしょうか。 ここから本題 質問文の中にある ― の文字ですが これをshift_JISコードに置き換えると 「815C」になります そして、「\」ですが、これをコードに置き換えると 「5C」になります なんとなく見えてきましたか? 815C の後半 5Cの部分を文字列として扱うために 81と5Cの間にさらに\(5C)を入れます そうすると 815C5C となります 先頭から815Cは「―」を意味しますので、表示する時には人間の目には「―\」と見えます ほかにも (表示文字 = shift_JISコード) 表 = 955C 申 = 905C 能 = 945C ソ = 835C 等のような文字も 5Cで終わります そしてまとめ 質問文にあるSQL文の最後 'テストコメント―\―\―\―\―\' ですが、 人間の目には テストコメント―\―\―\―\―\ が文字列のように見えますが SQLとしては最後の「'」の前に \ が付いています ですから、最後の「'」を文字列と認識してしまい、文字列の終わりを意味する「'」がどこにも無いと判断してエラーになります 対策 1 shift_JISをやめる(EUCなどを使う) 2 magic_quotes_gpc = offにして、手動で \や'を置換する (addslash() というPHP標準関数が存在しますが、これは極力使わないようにしましょう、半角英数しか使わない英語圏ではよいのですが2バイト文字を使う日本語圏では致命的なバグが存在しています) と、長くなりましたが、気をつけないとSQLインジェクションされてしまう怖い セキュリティホールを生む原因ともなりますので、今後もプログラムをしていく上では大切な知識ですのでがんばって勉強してくださいね。

hanagogo
質問者

お礼

丁寧にありがとうございました。やっと理解できました!テキストエディタで¥を置換したいと思います。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

状況がよくわかりませんが 最後の\'で閉じるはずのコーテーションがエスケープ されて閉じなくなっているのでは? INSERTするなら\マーク自身をエスケープするとよいかと

hanagogo
質問者

補足

いろいろと試したのですが、phpMyAdminでインサートしてもエスケープされてないようです。 例えば「パソコン」や「芸能」と入力すると 通常は「パソ\コン」、「芸能\」となるはずが そのまま「パソコン」、「芸能」として保存されます。 magic_quotes_gpc = on にしているのにエスケープされないのはなぜでしょうか。。。

関連するQ&A