• ベストアンサー
  • 困ってます

PHPスペース区切り、複数単語が検索できません

お日ごろから大変お忙しい中、この投稿を見て頂きまして誠に有難うございます。私はPHP初心者です。もしこの投稿記事内容自体が私の勉強不足のために不適切な内容となっておりましたら大変申し訳ございません。至らない能力をご容赦して頂きたく存じ上げます。 現在、個人のサイトを作成しております。そこで合計6000点ほどの点数に対し文言が添えております。その文言(カラム/side_text)をフォーム検索で抽出したいのですが、単語だけならできるのですが、複数単語(スペース区切り)で検索をすると、どうしても上手くいきません。 下記にソースコードがございますので、もしお時間がございましたら、ご教授して頂けますと大変嬉しく思います。 var_dampで各要所をチェックしていったら複数単語でもちゃんとdbc.phpファイルの $result = $stmt->fetchALL(); return $result; まで返しているので、htmlへの出力方法がおかしいのかと思ったのですが、どうしても最後の最後はvar_damp()array(0)になってしまいます。 ▼▼▼▼▼【var_damp(result)の結果】▼▼▼▼▼ 「確定」と「福来い」を検索した場合 string(59) "(side_text LIKE "%確定%") AND (side_text LIKE "%福来い%")" array(0) { } ▲▲▲▲▲【var_damp(result)の結果】▲▲▲▲▲ test.phpページです ▼▼▼▼▼【フォーム検索送信】▼▼▼▼▼ <form action="search.php" method="POST"> <input type="text" name="search" placeholder="検索ワードを入力して下さい" autocomplete="off"> <input type="submit" value="SAERCH"> </form> 【html内の出力結果】  <?php if(isset($results)) : ?> <?php foreach($results as $result) : ?>    <?php echo $result['side_text'] ; ?> <?php endforeach ; ?> <?php endif ; ?> ▲▲▲▲▲【フォーム検索送信】▲▲▲▲▲ search.phpページです ▼▼▼▼▼【フォーム検索送信/test.phpから受け取り】▼▼▼▼▼ $err = []; if(!$search = filter_input(INPUT_POST, 'search')){ $err['search'] = '検索ワードを入力して下さい'; } if(count($err) > 0){ $_SESSION = $err; header('Location: test.php'); return; } if(count($err) === 0){ $results = search($_POST['search']); } ▲▲▲▲▲【フォーム検索送信/受け取り】▲▲▲▲▲ dbc.phpページです ▼▼▼▼▼【dbc.phpページ】▼▼▼▼▼ function search(){ $result = false; $keywords = $_POST['search']; $keywords = mb_convert_kana($keywords, 's'); $ary_keyword = preg_split('/[\p{Z}\p{Cc}]++/u', $keywords, 5, PREG_SPLIT_NO_EMPTY); $ary_keyword = explode(" " ,$keywords, 5); $keywordCon = []; foreach( $ary_keyword as $keyword ){ $keywordCon[] = '(side_text LIKE "%' . $keyword . '%")'; } $keywordCon = implode(" AND ", $keywordCon); $sql = "SELECT * FROM test1 WHERE". $keywordCon; var_dump($keywordCon); try{ $stmt = dbc()->prepare($sql); $result = $stmt->execute(); $result = $stmt->fetchALL(); return $result; }catch(\Exception $e){ echo 'Something wrong 3'. $e->getMessage(); return $result; } } ▲▲▲▲▲【dbc.phpページ】▲▲▲▲▲ 間違いだらけのコーディングとは存じ上げますが、どうぞよろしくお願い申し上げます。

共感・応援の気持ちを伝えよう!

  • MySQL
  • 回答数2
  • 閲覧数116
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2
  • t_ohta
  • ベストアンサー率38% (4581/11792)

> ご回答を頂いて初めて同じレコード内を検索していた記述だと知りました。私はカラム指定をすれば全ての言葉を検索すると思っておりました。全てのレコード(横列)を含んだカラム名の指定方法がございますか? 検索条件を AND で繋ぐと、一つのレコードの中で全ての条件を満たすレコードを探すことになります。 (side_text LIKE "%確定%") OR (side_text LIKE "%福来い%") と言う条件にすれば「確定」か「福来い」のどちらか一つまたは両方が含まれるレコードを検索するようになります。 どの様な検索を行いたいのか、しっかり条件を考えてプログラミングしなけれいけません。 趣味のプログラミングでも設計のプロセスは重要ですよ。

共感・感謝の気持ちを伝えよう!

その他の回答 (1)

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

その検索方法だと、1つのレコードの side_text カラムに「確定」と「福来い」の両方のワードが入っているレコードを探している事になりますが、質問者さんの意図と合っていますか? また、「確定」と「福来い」の両方のワードが入ったレコードは存在していますか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答を頂きまして、誠に有難うございます。同じレコードではございませんでした。ご回答を頂いて初めて同じレコード内を検索していた記述だと知りました。私はカラム指定をすれば全ての言葉を検索すると思っておりました。全てのレコード(横列)を含んだカラム名の指定方法がございますか?私自身も今から調べさせて頂きます。有難うございましたm(_ _)m

質問者からの補足

t_ohtaさん 有難うございましたANDからORに変えるだけでした!自身の理解や造形の浅さを知り得たことが大きな収穫です。本当に有難うございました!これからも頑張ってまります!本当に有難うございました!

関連するQ&A

  • PDOを使って複数キーワード検索する方法について

    PDOでプリペアードステートメントを使って複数キーワードで検索する方法を教えて下さい。 プリペアードステートメントは「?」形式ではなく、$stmt->bindParam(':sample', $samle);の形を使った方法を知りたいです。 環境 PHP:5.1.6 MySQL:5.0.77 処理の流れを作ってみました。途中から不明な点があるので変数化しないで記載してあります。 /*--PDOのプリペアードステートメントのbindParamを用いた場合--*/ $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = 'SELECT * FROM table WHERE '; $keyword_str = 'キーワードA キーワードB キーワードC'; //全角スペースを半角スペースに変換する処理(省略) $keywords = split(' ',$keyword_str); for($a = 0; $a <$keywords_num; $a++) { $kw[]=' 列名 like :kw'.$a; } $query.= join('AND', $kw); //キーワードごとに「%キーワード%」の形を作る。 $kw0='%'.$keywords[0].'%'; $kw1='%'.$keywords[1].'%'; $kw2='%'.$keywords[2].'%'; $stmt = $dbh->prepare($query); $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); $stmt->execute(); /*-----------------------------------------------------------*/ 上記ソースの後半部分、 (1) //キーワードごとに「%キーワード%」の形を作る。 のところを変数を使って実現しようと思うのですが、うまくいきません。 $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } の形にすることは予想がつくのですが。 (2) $stmt->bindParam(':kw0', $kw0); $stmt->bindParam(':kw1', $kw1); $stmt->bindParam(':kw2', $kw2); の部分も上記と同じ形を考えていますが $keywords_num=count($keywords); でキーワードの数を取得して for($a = 0; $a <=$keywords_num; $a++) { //作りたいソース } 「//作りたいソース」の部分がうまく作れません。 (1)(2)の作りたいソース部分の書き方を教えて下さい。 上記の考え方より良い(短い)ソースが作れる場合はそのソースを教えて下さい。

    • ベストアンサー
    • PHP
  • POSTで表示される検索フォームの結果の取得

    こんばんは。 とある外部サイトのサイト内検索スクリプトの検索結果を 取得しようといろいろと努力しているのですが、うまくいきません。 具体的には、そのサイトの検索スクリプトにフォームから MethodをPOSTにしてキーワードを送信すると、その結果が表示されるというものです。 しかし、その表示された結果を自分のサイトのPHPスクリプト から取得しようとしているのですが、何をしても叶いませんでした。 その検索スクリプトがGETメソッドで処理してくれるなら、 $keywords = "Search text"; file_get_contents("http://example.com/search.php?s=".$keywords); こんな感じで取得できると思うんです。 PHP初心者なので何を言っているのか分からないかもしれませんけど よろしくお願いいたします。

    • ベストアンサー
    • 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
  • 検索ワードを(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
  • MySQL+PHPでキーワード検索をもとに五十音検索を作りたいです

    キーワード検索のソースを元に五十音検索を作りたいです。 キーワード検索のソースを元に五十音検索を作りたいのですが、”あ”という文字を押したら”あ”の頭文字の一覧が出るようにするにはどうしたらいいでしょうか。 キーワード検索ではすでにキーワードを入れたら検索結果の一覧が出るようになっています。 以下が必要そうなコードの抜粋です。 <?php //抽出条件を組み立てる $array = explode(" ", $keyword); $cnt = count($array); $where = "WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "koji OR kana LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" ".$searchSelect." "; } } // クエリを送信する $sql = "SELECT * FROM sampletable ".$where; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row[no]."</td><td><A href='result2.php?koji=$row[koji]' target='_blank'>".$row[koji]."</A></td><td>".$row[kana]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } ?> <h3>キーワード検索</h3> 故事成語用検索フォーム(複合語検索ができます) <form name="form2" action="search2.php" method="post"> <input type="text" name="keyword" size="25"> <input type="submit" name="search2" value="検索"><br /> </form>

    • 締切済み
    • PHP
  • PHPとSQLをコンパクトにまとめたいです

    部分一致検索して商品が見つかった場合はその商品だけを表示して、もし検索して見つからなかったときはエラーメッセージと商品一覧を表示しています。動作上は問題ありませんが、コンパクトにまとめることは可能でしょうか? // ユーザーが検索した場合の処理 if (isset($_POST['keyword']) === TRUE && mb_strlen ($_POST['keyword']) > 0) { $keyword = trim($_POST['keyword']); try { $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE name like ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $keyword, PDO::PARAM_STR); // SQLを実行 $stmt->execute(['%' . $keyword . '%']); $result = $stmt->fetchALL(); // 上記で検索した名前と部分一致する商品を探す if (count($result) > 0 ) { $msg[] = ($keyword . 'を含む商品が見つかりました!'); } else { try { // ステータスが1(公開)の販売商品のみを一覧で表示する $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE status = 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); //全て取得するのでfetchALLでレコードを取得する $result = $stmt->fetchALL(); $err_msg[] = ($keyword . 'を含む商品は見つかりませんでした。'); } catch (PDOException $e) { $err_msg[] = '商品を取得できませんでした。'; } } } catch (PDOException $e) { $err_msg[] = '商品を検索できませんでした。'; } } else { try { // ステータスが1(公開)の販売商品のみを一覧で表示する。 $sql = 'SELECT product.id, name, price, img, status, stock FROM product JOIN item_stock ON product.id = item_stock.stock_id WHERE status = 1'; $stmt = $dbh->prepare($sql); $stmt->execute(); //全て取得するのでfetchALLでレコードを取得する $result = $stmt->fetchALL(); } catch (PDOException $e) { $err_msg[] = '商品を取得できませんでした。'; } }

    • ベストアンサー
    • PHP
  • phpの処理速度とmysqlについて

    以下のような処理をphpで実行してmicrotimeでみたところ、 6.343くらいなのですが、これって遅いでしょうか? httpリクエストをしているので、ある程度かかっても仕方ないと思っているのですが、 大体どれくらいなのか気になった次第です。後、1つのファイルで下くらいのmysql処理は別に多くないですよね? 恐れ入りますが、ご回答お願い申し上げます。 以下ソースです。 ■実行内容 mysqlから特定のキーワード取得(最後に更新した日から古い順に取得) ↓ そのキーワードを基にhttp://goodkeyword.net/へリクエストを送る。 ↓ file_get_htmlで内容を取得後、一部mysqlへ保存、更新。 ※処理はcronで実施 table構成 ■keywordsテーブル id, name(検索用キーワード) search_date(最後に処理を実行した時間) flg(defaultは1、更新や処理完了後2に変更) ■result_keywordsテーブル keyword_id(外部キー) word(取得ワード) ----------------------------------------------------------------- require_once 'conn.php'; require_once 'simple_html_dom.php'; $start = microtime( TRUE ); $req = $db->prepare('select * from keywords order by search_date asc limit 3'); $req->execute(); $words = $req->fetchAll(); foreach ($words as $word) { $url = 'http://goodkeyword.net/search.php?formquery=' .$word['name']. ''; $html = file_get_html($url); $src = $html->find('#column3-yahoo-result .result-keyword-detail tr td[!class]'); foreach($src as $element) { $rem = strip_tags($element);     if($word['flg'] == 1) { //table result_keywordsへのinsert処理(取得キーワードの挿入) } else { //table result_keywordsへのupdate処理(取得キーワードの更新) } //table keywordsへのupdate処理(search_date変更) } //table keywordsへのupdate処理(フラグ変更) } echo microtime( TRUE ) - $start; $html->clear();

    • ベストアンサー
    • PHP
  • php+mysqlでand検索

    ソースコード抜粋 下記のコードを見つけたのですがNotice: Undefined variable: where・・・。 と表示されて実行できません。 なにぶんPHP初心者なのでわかり易く教えてください。 $search = str_replace(" ", " ", $text); $keywords = preg_split("/[  ]+/",$text); $where = " where 1"; foreach( $keywords as $word ){ $where .= " and $key2 like '%$word%'"; } //SQL文 $result = mysql_query("select * from song $where ORDER BY number ASC LIMIT $start,$end");

    • ベストアンサー
    • PHP
  • PHPでの検索

    初心者です。 ネットもさがしてみたのですが下記の意味がイマイアチわかりません。 <form name="form2" action="search.php" method="post"> <input type="text" name="keyword" size="25" value="<?= $keyword ?>"> <input type="submit" name="search" value="検索"><br /> <input type="radio" checked name="searchSelect" value="AND">AND  <input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect" value="OR">OR </form> (1)<form name="form2" action="search.php" method="post"> 検索ボタンを押すと「action="search.php"」が起動します。  どういう仕組みなのでしょうか。 (2) <input type="text" name="keyword" size="25" value="<?= $keyword ?>">  作者の説明で、  『前の画面でテキストボックスに入力した値を、デフォルトで表示しています。  <input type="text" name="keyword" size="25" value="<?= $keyword ?>">』  となっていますが、value="<?= $keyword ?>"でなぜそうなるのでしょうか。  また、<?= $keyword ?>の<?= ?>構文はどのような機能があるのでしょうか。 (3)<input type="radio" checked name="searchSelect" value="AND">AND  「value="AND">AND」の右側の「AND]はどういう意味でしょうか。 (4)<input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect" value="OR">OR  作者の説明で、  『(6)前の画面でORラジオボタンが選択されていた場合は、選択(checked)します。  <input type="radio" <?= ($searchSelect == "OR")? "checked" : "" ?> name="searchSelect"  value="OR">OR』  とありますが、<?= ($searchSelect == "OR")? "checked" : "" ?>でなぜそういうことができているのでしょうか。  また、『"checked" : 』の『:』は何の役目をしているのでしょうか。 上記4つの質問でどれでもいいですのでどなたかお教え願えないでしょうか。

    • 締切済み
    • PHP
  • PHPの複数条件検索フォーム

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1134440526 の回答者の方のコードを参考にしたのですが、下記の通りにすると Parse error: syntax error, unexpected '{' in C:\Program Files\Apache\Apache24\htdocs\sample\kensaku20.php on line 19 と出ます、カッコの数がおかしいのでしょうか? 19行目前後を見てもおかしな所はないと思われるのです(秀丸を使っていてカーソルを合わせると色が変わる部分を見ました) やりたいこととしてはid名か商品名のどちらか・或いは両方とも入力したらDBより検索、表示させる事です。 HTML部 <form action ="http://localhost/sample/kensaku20.php" method="post"> id名:<input type="text" name="id"> 商品名:<input type="text" name="name"> <input type="submit" name="exec" value="検索"> </form> php部 中略 $ary_whr = array(); $ary_dat = array(); if (!empty($_POST['exec'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['exec'].'%';} if (!empty($_POST['id'])) __{ $ary_whr[] = 'id LIKE ? '; $ary_dat[] = '%'.$_POST['id'].'%';} if (!empty($_POST['name'])) __{ $ary_whr[] = 'name LIKE ? '; $ary_dat[] = '%'.$_POST['name'].'%';} $where = ' WHERE ' . implode(' AND ', $ary_whr); 中略

    • ベストアンサー
    • PHP