キーワード検索についての疑問と対処法

このQ&Aのポイント
  • キーワード検索をする際の「%」の扱いと対処法について疑問があります。
  • mysql_real_escape_stringなどの関数でエスケープをしてDBに登録した場合、特殊文字が検索時に問題となる場合の対処法について教えてください。
  • DBに登録された特殊文字が検索対象になった場合、適切な結果を得るための対処方法はありますか?
回答を見る
  • ベストアンサー

キーワード検索について

DB(mysql)内をキーワード検索する場合、 Like '%key%' などのようにLike検索をすると思うのですが、 一つ疑問なのが、「%」をキーワードとして検索したい場合は Like '%%%' となってしまい、すべてを表示してしまいます。 「%」をキーワードにした場合はどのような処理を行えば良いのでしょうか? あと、もう一つ分からないのが、mysql_real_escape_stringなどの関数でエスケープをしてDBに登録した場合、例えば、「&」は「&」に変換されてDBに登録されると思うのですが、検索のキーワードを「amp」として検索すると、この「&」までもがヒットしてしまいます。 これはどのようにして対処すれば良いでしょうか? DBに登録されるときに、エスケープされた文字が元に戻るようなことは期待できないでしょうか。 アドバイスをよろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

%を検索するときはエスケープして\%にします。 LIKE '%\%%' &を&に変換するのはmysql_real_escape_stringではなくてhtmlspecialcharsです。DB登録前にhtmlspecialcharsするのではなくDBから取得して表示するときにhtmlspecialcharsするようにしたら良いと思います。

ORmituhide
質問者

お礼

いろいろと勘違いしていたみたいで、おかげで解決できそうです。 回答ありがとうございました。

関連するQ&A

  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • mysql_real_escape_string

    mysql_real_escape_stringについて調べていると、私と同じことを疑問に思い質問している人がいました。 こちらのページです。 http://okwave.jp/qa/q4423735.html mysql_real_escape_stringを通してDBに入れるとします。 すると、「テスト\」というデータをINSERTをするとDBには「テスト\」で入るのでしょうか? では、mysql_real_escape_stringを通さずにdbに入れても 「テスト\」というデータをINSERTをするとDBには「テスト\」で入ると思います。 上記のとおりとした場合、PHPはどうやってmysql_real_escape_stringを通したかどうか判定しているのでしょうか? 現在、mysql_real_escape_stringを通してDBに入れると、 「テスト\\」というデータがDBに入っています。 それをどうやって戻すのか調べていて、上記の質問を見つけました。 どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • array_mapを使ったエスケープ処理

    MYSQLとPHPでアプリケーション作成している初心者です。 今まで一つ一つの項目をmysql_real_escape_stringに通していたのですが今日、array_mapという関数がある事を知りました。 今まで自分がやっていたように項目毎に data1 = mysql_real_escape_string($_POST['data1']); data2 = mysql_real_escape_string($_POST['data2']); ...(省略) とするのは項目が増えれば増えただけ作業量も増えてしまうので $postdata = array_map("エスケープ関数",$_POST); としてPOSTされたデータは一括してエスケープ用関数を通そうかと思っています。 参考書などでこのような方法でエスケープ処理をしているのを見た事が無いの不安なのですが(googleで調べると結構やっている人がいました)、このやり方で何かデメリットはあるでしょうか?

    • ベストアンサー
    • PHP
  • SQL キーワード検索にて

    お世話になります。 DBからSQLでキーワードによる検索をかけるときですが、 二つ以上のワードがあるときに、一つのキーワードがほかのキーワードと かぶってしまう場合、例えば゛、『あいうえお』と『いうえ』等で絞り込むと、 結果的に『あいうえお』が含まれるものだけが該当しますが、これを、 『あいうえお』を含み、更にそれ以外にも『いうえ』が含まれるものを 絞り込むには、どうすればよいでしょうか。 つまり、『あいうえお』のみしか含まれないものは該当しないようにする方法です。 現在のSQLは、 (SELECT * FROM xxxx WHERE tablename LIKE '%あいうえお%' AND tablename LIKE '%いうえ%') のような感じです。 使用しているDBは、MySQL、SQLiteです。 何卒よろしくお願いいたします。

  • mysql_real_escape_stringについて

    MySQLとの接続が確立していない状況でmysql_real_escape_string()を使いたいと考えています。 しかし、接続できていないと当然使えません。 同じ機能の関数なのはないのでしょうか? ない場合は自作するしかないのでしょうか? クエリをエスケープする関数をMySQLと接続していない状況でどうしてつかうのか? というのは無視してください。

    • 締切済み
    • PHP
  • PHPからのLIKE検索ができません。

    こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。

    • ベストアンサー
    • MySQL
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP
  • mysql_real_escape_stringについて

    マニュアルを見ると以下の説明がありました。 >mysql_real_escape_string() は、MySQL のライブラリ関数 mysql_real_escape_string をコールしています。 >これは以下の文字について先頭にバックスラッシュを付加します。 \x00, \n, \r, \, ', " そして \x1a. phpでpdoを使用しmysqlに登録しているのですがこの結果は正しくエスケープできているでしょうか? // 登録情報配列 $user = array( 'id' => 'test', 'pass' => '\x00 \n \r \ \x1a' ); // 略(登録実行) この結果以下のテキストがmysqlに登録されてます。 「\x00 \n \r \ \x1a」 エスケープ前の値と登録された値がなんら変わらなく見えるのですが気のせいでしょうか? ちなみにシングルクオテ―ションをダブルにすると以下のように登録されました。 「 \ ・」

    • ベストアンサー
    • PHP
  • PDOとmysql_real_escape_str

    PDOとmysql_real_escape_string() RHEL5 Apache2.x PHP Version 5.3.5 MySQL 5.1.45 を使っています。 PDOでMySQLにアクセスしている場合、、 mysql_real_escape_stringを使うと エラーになります。 Warning: mysql_real_escape_string(): Access denied for user 'apache'@'localhost' (using password: NO) in /var/www/html/hogehoge/main.php on line 190 Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/html/hogehoge/main.php on line 190 で、いろいろ調べてみたのですが、 PDOを使っている場合は、mysql_real_escape_stringは不要と書いてある場合と、PDOはSQLの脆弱性があると書いてある場合がありました。 実際はどうするのがいいのでしょうか? 以下は、とりあえずうごいているが、脆弱性がのこっているのか分からないコードです。 どうぞよろしくお願い申し上げます。 $dsn = "mysql:dbname={$objConifg->dbName}; host=127.0.0.1"; $user = $objConifg->dbUser;; $passwd=$objConifg->dbPass; try { $db = new PDO($dsn,$user,$passwd); $db->exec('SET NAMES utf8'); //print 'DB接続OK.'; } catch (PDOException $e){ die("接続エラー: {$e->getMessage()}"); } ・ ・ ・ ・ $stt = $db->prepare("select * from keywords where keyword_h1_url = \"{$REQ_PATH}\""); $stt->execute(); ========================================

    • 締切済み
    • PHP
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう