PHP And MySQL


PHPからデータをMySQLに挿入する際、エスケープ処理をするため test'hoge' のようなデータを入力するとMySQLには test\'hoge\' のように入力されます。

しかしこのデータが入ったレコードを検索するとSQLで select * from table where test = 'test\'hoge\''ではヒットしません。どうすればいいのでしょうか?

ソースコードとともに説明お願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2007/01/25 08:27:33
  • 終了:2007/02/01 08:30:04

回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/01/25 09:52:18

ポイント60pt

test'hoge' のようなデータを入力するとMySQLには test\'hoge\' のように入力されます。

まず、実際に MySQL 中にどのようなデータが入っているか確認した方が良いかと思います。

本当に test\'hoge\' のように入力されているのであればそれはエスケープのし過ぎ。

select * from table where test = 'test\\\\'hoge\\\\''

のようになるはずです。

実際には text'hoge' が入力されているのであれば例示されたSQL 文で構わないはずです。

他の書き方としては

select * from table where test = "test'hoge'";
select * from table where test = 'test''hoge'''

等で実行できます。

http://dev.mysql.com/doc/refman/4.1/ja/string-syntax.html


また、PHP 上で記述されているのであれば、PHP の文字列処理で \ が展開されていないかも確認した方が良いでしょう。

(INSERT,SELECT の直前に実行するSQL文を出力して確認)

id:esecua

エスケープのしすぎはまずありません。mysqlAdminでチェック済みです。

select * from table where test = 'test\'hoge\''では無論だめでした。

ほかの方法でもだめでした。

よろしくお願いいたします。

2007/01/25 11:20:36
  • id:tamtam3
    実はデータがテーブルに収納されてなかった(ぼそ

    この手のバグあり
    http://bugs.mysql.com/bug.php?id=11053

    避けたいのなら、データそのものをバイナリ扱いすれば良いとおもう

  • id:b-wind
    > mysqlAdminでチェック済みです。
    チェックした方法と結果を見せてもらえれば、何かわかるかも。
  • id:esecua
    >b-windさん

    チェックしたというのは実際にデータがtest\'hoge\'のように正しくエスケープされ入力されているかチェックしました。

    そのうえでmysqladminのSQL上から  select * from table where test = 'test\'hoge\'' を実行しましたが、該当するレコードが表示されませんでした。

    よろしくお願いいたします。
  • id:b-wind
    >正しくエスケープされ入力されている
    この言葉の解釈にちょっと戸惑っています。
    自分が想像している内容ではDB内に「test'hoge'」と言う文字列が入っているのだと思いましたが合っていますか?
  • id:esecua
    DB内に「test'hoge'」と言う文字列ははいっていません。エスケープ後のtest\'hoge\'が入力されています。

    よろしくお願いいたします。
  • id:b-wind
    > エスケープ後のtest\'hoge\'が入力されています
    自分としてはそれは過剰なエスケープに感じますが、アプリケーションの作り方が異なるのでしょうね。


    最初の回答の一部にミスが有りました。
    select * from table where test = 'test\\\'hoge\\\'';
    でどうでしょうか?
    バックスラッシュは3個づつでいけるはず。
  • id:esecua
    ありがとうございます。これでOKです。

    別の質問になってしまうのですが、ほかのスクリプト(phpBBなど)もこの方法で検索をかけているのでしょうか?通常の場合はどのようなSQLを発行しているのでしょうか?
  • id:b-wind
    状況によって「普通」も変わってくるのでなんともいえない部分もありますが、扱いたい本来のデータは 「test'hoge'」で委員ですよね?

    INSERT INTO table ( test ) values ( 'test\'hoge\'' );
    で、データ投入。(実際にDB中に入るのは「test'hoge'」)
    select * from table where test = 'test\'hoge\'';
    で検索が素直な方法のように思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません