複数ワード検索(PHP)の区切り文字について

このQ&Aのポイント
  • PHP初心者がデータベースの検索処理を実装する際に、半角スペースと全角スペースを区切り文字として認識させたい。
  • 具体的には、「青山 井上」と検索しても、「青山 井上」でも同じ検索結果を得たい。
  • 現在のコードでは全角スペースが文字として認識されてしまうため、適切な書き方を教えてほしい。
回答を見る
  • ベストアンサー

複数ワード検索(PHP)の区切り文字について

PHP初心者です。 データベースの検索処理を実装しようとしています。 一般の検索エンジンのように、半角スペース、全角スペース、どちらも区切り文字として認識させて、スペースで区切った複数ワードによる検索抽出ができるようにしたいのです。 データベース例) 青山病院 伊藤病院 井上病院 青山歯科 鈴木歯科 「青山 井上」(全角スペース)と検索しても、「青山 井上」(半角スペース)と検索しても、 青山病院 井上病院 青山歯科 という検索結果にしたい。 実際にコードをかいてみたのが以下です。 $searchwords = "青山 井上"; //全角スペース $array_searchwords = mb_split("[  ]", $searchwords); ////[  ]には全角スペース $sql = "SELECT hospitalname FROM hospital"; foreach( $es_array_searchword as $k => $v ) { # 1ワード毎のカッコ区切り(開始)  if( $k == 0 ) {   $sql .= " WHERE (";  } else {   $sql .= " OR (";  }  $sql .= " hospitalname LIKE '%${v}%'";  $sql .= " ) ";  echo $sql; } このようにかくと、$sqlは、 「SELECT hospitalname FROM hospital WHERE ( hospitalname LIKE '%青山%' ) OR ( hospitalname LIKE '%%' ) OR ( hospitalname LIKE '%井上%' )」 と出力されます。 要するに、$searchwords = "青山 井上";、の「全角スペース」が文字として認識されてしまいます。 これを、 「SELECT hospitalname FROM hospital WHERE ( hospitalname LIKE '%青山%' ) OR ( hospitalname LIKE '%井上%' )」 というsql文で実行できるようにしたいのです。 $array_searchwords = mb_split("[  ]", $searchwords); の[  ]の書き方が問題になるのかなと思いますが、全角スペース区切りを生かすには、どうかけばよろしいでしょうか?

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

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5076/13261)
回答No.1

$searchwords = "青山 井上"; $searchwords = preg_replace("/ /", " ", $searchwords); $array_searchwords = explode (" ", $searchwords);

hide_momiji
質問者

お礼

ありがとうございました。 解決しました。

関連するQ&A

  • phpとmysqlで「あいまい検索」をしたいです。

    phpとmysqlで「あいまい検索」をしようと思い、下記サイトを参考にしましたが、 http://d.hatena.ne.jp/akihito_sado/20120602/p1 PDOを使ってlikeデータを抜き出したい場合、bindParamを使うらしいですが、 http://rasukaru55.sitemix.jp/or_kensaku.php 下記の場合どう書き直すべきでしょうか? 打ち方が悪いのか、うまく作動しません。 教えてください。 ※bindParamを使えばSQLインジェクション対策になっていると言う事でしょうか? <html> <head></head> <body> <?php //POST送信されたデータを$text1へ $text1 =@$_POST["text1"]; //SQL(テーブルから列を抽出する $sql ="SELECT 列名 FROM 表名 "; //キーワードが入力されているときはwhere以下を組み立てる if (strlen($text1)>0){ //受け取ったキーワードの全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); //キーワードを空白で分割する $array = explode(" ",$text2); //分割された個々のキーワードをSQLの条件where句に反映する $where = "WHERE "; for($i = 0; $i <count($array);$i++){ $where .= "(列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where .= " AND "; } } //別カラムも同じ検索したい $where2 = " OR "; for($i = 0; $i <count($array);$i++){ $where2 .= "(2列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where2 .= " AND "; } } } ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1"></td> <td><input type="submit" value="検索" name="sub1"></td> </tr> </table> </form> <?php //組み立てたSQL分を表示する echo "<p>組み立てたSQL分: ".$sql.@$where.@$where2; ?> </body> </html>

    • ベストアンサー
    • PHP
  • 【PHP】複数語検索について

    お世話になります。 PHPにて複数語検索を行いたいのですが、うまく検索できずに困っています。 テーブル名はinformation、 レコード名はnameとして、スペース区切りで検索します。 $st = $db->prepare("SELECT * FROM information"); $where = array(); if($arr['name']){ $name_ary = explode(" ", $name); $name_count = count($name_ary); $where = ""; for( $i = 0; $i < $name_count; $i++ ){ if( $i != 0 ){ $where = ($where . " or"); } $where = $where . " name LIKE '%{$name_ary[$i]}%'"; } } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); どなたかご教授いただけないでしょうか? 他の質問など見て真似たり、下記サイトを参考にしたりしているのですが、 うまくいかず困っております。 http://blog.olivesystem.com/824.html 何卒宜しくお願い致します。

    • 締切済み
    • PHP
  • phpで複数の検索語を検索対象にしたい

    環境:php+mysql やりたいこと: 半角や全角スペースの入った複数の検索語を検索対象にしたいです。 例:りんご みかん で検索されたキーワード 現在のコードは以下のとおりです。。 長くなるので、検索結果数だけの処理までを書いてます。 $sql の箇所で for文など使って繰り返し処理をさせればよいのかと思い google先生で検索しましたが、、どうにも該当しそうなサイトが見つからず アドバイスいただきたく質問させていただきました。 単語1つの場合だけ検索結果が正しく動きますが、 現在は、検索フォームに「りんご みかん」と入れると 検索結果ゼロになります。 これはこれで正しいのですが、、 希望は「りんご みかん」と入れると りんごとみかんを含む検索をしてほしい と考えてます。 <?php $keywords = $_GET["key"]; //検索キーワードのデータが何件あるか? $sql="select * from item where title like '%".$keywords."%' or Description like '%".$keywords."%' or category like '%".$keywords."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; } ?>

    • ベストアンサー
    • PHP
  • 複数キーワードを複数カラムに照会するSQL文?

    頭の整理ができないので技術的なこともさることながら、SQL構築の考え方もうかがいたいのですが、 以下のテーブルに対して、スペース区切りで複数キーワードをAND条件で結ぶとして ID MyCol1 MyCol2 -------------------------- 1 いちご みかんジュース 2 ぶどう いちごみるく 3 みかん すいかジュース 4 すいか めろんソーダ 5 めろん ぶどうガム 検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。 スペース区切りで複数キーワードをAND条件で結ぶSQLは、以前教わりました。 http://okwave.jp/qa/q1212708.html $sql = 'select * from t_url'; if ($title != '') { $titles = array(); foreach (preg_split('/(\s| )+/', $title) as $word) { array_push($titles, "MyCol1 like '%$word%'"); } $sql .= ' where (' . implode(' and ', $titles) . ')'; } 今回の質問は、受け取った$titleを「MyCol1」だけでなく「MyCol1かMyCol2」にも同じ照会する方法をうかがいたいです。 検索キーワードが「いちご ソーダ」だったとき、MyCol1だけなら、 and (MyCol1 like '%いちご%' and MyCol2 like '%ソーダ%') でよいわけですが、MyCol2はどう熱かったらいいのでしょうか。 and (MyCol1 or MyCol2 like '%いちご%' and MyCol1 or MyCol2 like '%ソーダ%') みたいにできればよいのでしょうが。 PHPのコードも、上記のものだとMyCol1にしか照会がかかりませんが・・・

    • ベストアンサー
    • MySQL
  • 検索ワードを(1)クリアされないようにしたい、(2) スペース区切りしたい

    ◆ 環境: PHP 5.0.3 MySQL 4.0.14b(Win)(←古いこと承知) IIS 5.1 ◆ 背景 質問 No.1212008にも書きましたが、PHP+MySQLで簡単な検索システムを 作っている初心者です。 ・001.htm に設置したこの検索フォームからPOSTすると ・002.php に渡され、これがHTMLを組み立てて検索結果を表示します。 ・002.php には、001.htmと同じ検索フォームを設置してあります。 ・検索フォームは name="1" ~ "4" までのテキストフィールドと検索ボタンで、  次のようなSQL文でWHERE文を構成しています。 $sql = "select * from t_url where (fullpass like '%$title1%')"; if (strlen($title2) > 0) { $sql .= " and (fullpass like '%$title2%')"; } if (strlen($title3) > 0) { $sql .= " and (fullpass like '%$title3%')"; } if (strlen($title4) > 0) { $sql .= " and (fullpass like '%$title4%')"; } ◆ 質問は2点です。 (1) 001.htmから検索し、002.php結果がリストアップされると、 002.phpにある検索フォームに入力したキーワードはが当然クリアされています。 また、002.php から再検索しても、同じくクリアされてしまいます。 いずれの場合にも、テキストフィールドに入力した内容を残す(引き継ぐ)ことは 可能でしょうか?PHPとかJavascriptとかで実現方法はあるのかもしれませんが ちょっと見当がつきません。 (2)今は1フォーム・1キーワード×4テキストフィールドなので4ワードまでは AND条件で絞り込みできますが、 Web検索ライクに、検索フォームのテキストは1つ、全角&半角スペースで区切った キーワードがAND条件でつながるようにするのも敷居高いでしょうか。 アドホックな感じがするので、何とかできたらと思うのですが。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPの参考書で分からないとこがあります

    PHPによるWebアプリケーションスーパーサンプル第2版のP.99のサンプルファイルにどうしても分からない箇所があります。 <html> <head> <title>絞込み検索キーワードをSQLに反映する</title> </head> <body> <?php // データを受け取る $text1 = @$_POST["text1"]; // SQL(ProductsテーブルからProductNameを抽出する) $sql = "SELECT ProductName FROM Products "; // キーワードが入力されているときはWHERE以下を組み立てる if (strlen($text1) > 0) { // 全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); // キーワードを空白で分割する $array = explode(" ", $text2); // 分割された個々のキーワードをSQLに反映する $where = "WHERE "; for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } } // 受け取った値を表示する echo "<p>検索キーワード:".$text1; // 組み立てたSQLを表示する echo "<p>組み立てたSQL:".$sql.@$where; ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1" value="<?php echo $text1?>"></td> <td><input type="submit" value="送信" name="sub1"></td> </tr> </table> </form> </body> </html> 上記の for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } の箇所なんですが、そこに複数ある「.(ドット)」は何を表しているのでしょうか? また、 if ($i < count($array) - 1) { $where .= " AND "; が行っている処理を教えて下さい。 初歩的な質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • スペース区切り

    If name1<>"" Then SQL = SQL & " AND name1 LIKE '%" & name1 & "%'" これで、スペース区切りでも検索できるようにするには? テキストなど見てみるとすごく長くなってしまってるんですが、 簡潔に記述できるものはないでしょうか? よろしくお願いいたします~。

  • 単語ではなく複数語検索

    $usersearch =$_POST['usersearch']; $query = "select byou,syou from kensaku2 where syou like '%{$_POST['usersearch']}%' OR syou like '%{$_POST['usersearch']}%'"; $where_list = array(); $search_words = explode(' ', $usersearch); foreach ($search_words as $word){ $where_list[]= " syou like '%$word%'"; } $where_clause = implode('or',$where_list); if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $result = mysql_query($query); while($row = mysql_fetch_array($result)){ echo '<strong>ドリンク:</strong>' . $row['byou'] . '<br/>'; echo '<strong>野菜:</strong>' . $row['syou'] . '<br/>'; } 上記のものでテキストボックスに[コーラ お茶]等の複数のワードで検索し、その二つに該当するデータを取り出したいのですが、上手くいきません(単語でないと検索できません)。改変部分等御指摘下さい。

    • ベストアンサー
    • PHP
  • チェックボックスを使っての検索で

    PHP5とMySQL4.0.24を使用しています。 フィールド内にカンマ区切りでテキストが格納されてます。 +----+----------------------+ | ID | text | +----+----------------------+ |id01| 101,001,201,300 | |id02| 001,201,105 | |id03| 101,401,300,201,003 | | : | : | +----+----------------------+ これをチェックボックスで □001 □003 □101 □105 □201 … でOR検索をしたいのですが。 検索側のHTMLで <input type=checkbox name=chk[] value=001>001         : と書いて 処理側のPHPに $arraival = is_array(@$_POST['chk'])? implode(',',$_POST['chk']):'empty case'; $sql = "select * from shop_data where arraival like '%$arraival%'"; としてもうまく結果が得られません。 どの様に書けばよいのでしょうか?

    • ベストアンサー
    • MySQL
  • 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

専門家に質問してみよう