プルダウンメニューで検索がうまくいかない

このQ&Aのポイント
  • プルダウンメニューから前方一致、中間一致、後方一致、完全一致の検索を行いたいが、うまくいかない。
  • 日本語入力を考慮し、全角スペースを半角に変換する必要がある。また、検索位置に応じてキーワードを加工する処理が必要である。
  • データベースから該当するデータを検索する際に、キーワードを用いて検索条件を組み立てる必要がある。
回答を見る
  • ベストアンサー

うまくいきません

プルダウンメニューから前方一致、中間一致、後方一致、完全一致 を選んで検索したいのですが、 うまくいきません。 $mae_naka_ushiro=$_GET['mae_naka_ushiro']; //日本語入力考慮し、全角スペースを半角にする $text = str_replace(" ", " ", $text); $text2=""; $text2 = str_replace(" ", " ", $text2); $text2=mb_convert_case($text,MB_CASE_LOWER,"UTF-8"); //スペースで分解。 $keywords = preg_split('/[\s]+/', $text, -1, PREG_SPLIT_NO_EMPTY); print("<br>検索位置:".$mae_naka_ushiro."<br>"); switch($mae_naka_ushiro){ case "mae": $keywords='%'.$keywords; print("前"."<br>".$keywords); break; case "naka": $keywords='%'.$keywords.'%'; print("中"."<br>".$keywords); break; case "ushiro": $keywords=$keywords.'%'; print("後"."<br>".$keywords); break; case "zen": $keywords=$keywords; print("完全"."<br>".$keywords); break; default: $keywords='%'.$keywords.'%'; print("デフォルト"."<br>".$keywords); break; } $where = " where 1"; foreach( $keywords as $word ){ $where .= " and $key2 LIKE '$word'"; } $time=microtime(); include ('sql_connect.php'); $sql = mysql_query("select count(*) as MAX from song $where"); $row = mysql_fetch_row($sql);

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

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

$keywordsはpreg_splitの戻り値ですから「配列」ですよね?それなのに >$keywords='%'.$keywords; こういう書き方は無理でしょう。printしているから、ご自分でも「おかしい」のはわかっていると思います。"%Array"などとなっているのではありませんか? 書くとすれば下記のような感じでしょうか・・・ $where = ''; if (count($keywords) > 0) { // 要素数が0なら処理しない $like = array(); switch($mae_naka_ushiro){ case "mae": foreach ($keywords as $val) { $like[] = '(' . $key2 . ' like %' . $keywords . ')'; } break; case "naka": foreach ($keywords as $val) { $like[] = '(' . $key2 . ' like %' . $keywords . '%)'; } break; case "ushiro": foreach ($keywords as $val) { $like[] = '(' . $key2 . ' like ' . $keywords . '%)'; } break; case "zen": foreach ($keywords as $val) { $like[] = '(' . $key2 . ' = ' . $keywords . ')'; } break; } $where = ' where ' . implode('and', $like); } #まったくの未検証ですのであしからず #typoなどがあるかもしれません(汗 なお、上記ソースではエスケープ(mysql_real_escape_string)は端折っています。端折った理由は「ネイティブなMySQL関数はそろそろ先がないので早めにPDOなどで書き直すべき」ということです。プリペアドステートメントを使えばエスケープを意識する必要はありませんので。

関連するQ&A

  • 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
  • 携帯電話での<br>の変換

    iモード(docomo)で 文字列 $text ="りんご<br>バナナ"を textarea 内に入れたくて $text = str_replace("<br>" , "\n", $text) としましたが、textarea 内の表示は「りんご<br>バナナ」となってしまいます。 $text = str_replace("<br>" , "\r\n", $text) $text = str_replace("<br>" , "\r", $text)と記述してみましたが、 textarea 内の表示はすべて「りんご<br>バナナ」となってしまいます。 textarea 内の表示を 「りんご  バナナ」 にしたいのですが、どんなコードに変換したらいいのでしょうか? また、auとsoftbank では、どんな変換をすればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • tableタグの中にあるinputタグに最初から格納させる方法

    (1)index.htmlの記述の中に、たとえば <a href="form.html?/info_mail@ff5.ocn8.ne.jp">自動返信テスト</a>と書きます。 (2)このリンクをクリックしてform.htmlを表示します。 このページのtableタグの中にあるinputタグに最初から格納させる方法 をご教授いただけないでしょうか? form.htmlのソースは、 <html> <head> <title>登録</title> <script language="JavaScript"> <!-- var STR = location.href; var STR1 = STR.split("?"); if (STR1.length > 1){ var STR2 = STR1[1].split("/"); STR2.shift(); for (i in STR2){ switch ( STR2[i] ) { case "": break; case "": break; case "": break; default: break; } document.getElementById("eml").value=STR2[i]; } } //--> </script> </head> <body> <font color="#f35e3c">登録</font><br> <form action="./cgi-bin/testhogehoge2008.cgi" method="post"> アドレス<br> <input name="email" type="text" size="20" maxlength="50" id="eml" /> <input name="email" type="hidden" size="20" maxlength="50" id="eml" /><br> <input type=submit value="確認"> </form> </body> </html> です。 まったくわかりません。困っています。 よろしくお願いいたします。

  • 正規表現を使用して、>から改行までを色変更したい

    正規表現の扱いで困っております。 やりたいことは、BBSで返信記事を書く際に、「>~さんへ」または、「>~さんへ」となっていたらその部分を色変更したいのです。 下記を含めて何パターンか試行したのですが、文字列が化けてしまい上手くいきません…。 $str = preg_replace( "(^>.*?<br />|^&gt;.*?<br />|<br />>.*?<br />|<br />&gt;.*?<br />)", "<font color=RED>\1</font><br />", $str ); $str = mb_ereg_replace( "(^([&gt;>][^<]+)<br />|(<br />)+([&gt;>][^<]+)<br />)", "<font color=RED>\2\4</font><br />", $str ); (環境) ・Windows2000&XP ・PHP 4.3.11 どなたかこれなら上手くいくというパターンが解りましたら、ご教授頂けたら幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • splitについて教えてください。

    @name=("ひろと","けいた","はやと","りゅうすけ","とらのすけ"); @str=@name; print "@str\n"; @str=join(";",@str); print "<br>@str\n"; @str=split(/;/,@str); print "<br>@str\n"; 上記のような配列を作成したプログラムを実験で作ってみました。(一部抜粋です。htmlで表記されるようにしています。) ブラウザで見てみると、以下のようになりました。 ひろと けいた はやと りゅうすけ とらのすけ ひろと;けいた;はやと;りゅうすけ;とらのすけ 1 その中の3行目の「1」とだけ表示された理由がわかりません。 splitにより、joinで作成された一つの文字列を、 再び「;」で区切って要素数が5つの配列に戻したかったのですが、 なぜか1と返されてしまいました。 splitの使い方を教えていただけないでしょうか。

    • ベストアンサー
    • CGI
  • SQL、between の指定方法について

    こんにちは、SQLについての質問なのですが、 PHPで以下のように、テキストボックスを指定して、値を検索 するような作りにしています。 print "<table><tr align=center>"; print "<td align=left>◎日付検索<br>"; print "<input type=text name=s_hiduke></td>\n"; print "<td align=left>◎入力者<br>"; print "<input type=text name=s_name></td>\n"; $where = ''; if($s_hiduke != ""){ $where .= $where ? "and s_hiduke~'$s_hiduke' ":"where  s_hiduke~'$s_hiduke' "; } if($s_name != ""){ $where .= $where ? "and s_name~'$s_name' ":"where  s_name~'$s_name' "; } if (!$sql) { $sql = "select * from syuhou_table ".$where;} else {$sql = str_replace("\\","",$sql);} 今回日付の部分にテキストボックスをもう一つ追加し、「5/10~5/15」 のように期間指検索が定出来るようにする為以下のようにソースを 変更したのですが上手く動作しません… print "<input type=text name=s_hiduke>~<input type=text name=s_hiduke2>&nbsp;&nbsp;</td>\n"; $where = ''; if($s_hiduke != ""){ $where .= $where ? "and s_hiduke~'$s_hiduke',  s_hiduke2~'$s_hiduke' ": "where s_hiduke between    s_hiduke~'$s_hiduke' and s_hiduke2~'$s_hiduke' "; } 何処を直せば正常に動くのか、お分かりになる方がいらっしゃいま したら、アドバイス頂けませんでしょうか。 長々とした文章になってしまい申し訳ございませんが、よろしく お願いいたします。

  • 空行を<br />に置換したい

    今、ファイルの中身を読み込み、それを処理したいものがあります。 処理する過程で、 空行(スペース、タブしかない行も含む)を<br />に置換したいのですが、上手くいきません。 ex) 処理前 あいうえお ←半角スペース2個あると過程 か きくけこ さしせそ 処理後 あいうえお <br /> か <br /> きくけこ <br /> さしすせそ 現在、やってるスクリプトです。 $str = preg_replace("/^\s$/", "<br />", $str); これだと出来ません・・・。 (このままだと<br />に置換するとその行が改行され ませんでしたね><;) どうすると実現出来ますでしょうか?ご教示下さい。

    • ベストアンサー
    • PHP
  • $textの文字列の中にある & を ■ に変えたいです。

    <? $text ="u&ampampfayv&ampin&ampe6&rna6uinv"; ///////////////////////////// print $text."<br>"; print "<XMP>".$text."</XMP><br>"; ///////////////////////////////正規表現で置換 $text = preg_replace('/&[^amp]/', "■", $text); ////////////////////////////// print $text."<br>"; print "<XMP>".$text."</XMP><br>"; ////////////////////////////// print "u&ampampfayv&ampin&ampe6■rna6uinv"; print "<XMP>u&ampampfayv&ampin&ampe6■rna6uinv</XMP>"; ?> $textの文字列の中にある & を ■ に変えたいです。 amp という文字列の前についている & は ■ に置換してはいけません。 &ampamp という文字列の前についている & も ■ に置換してはいけません。 現在の正規表現では r が消えてしまっています。 ブラウザで見た場合に結果が u&ampfayv&in&e6■rna6uinv になるようにして下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • switchの大量分岐の高速化

    いつもお世話になっております。 phpにて、文中にキーワードがあるかどうか判定し、そのキーワードによって処理を変えていくというプログラムを作成しています。 preg_matchまたはstrposによるキーワード判定と、switchによる処理を組み合わせたものです。 //判定対象となる文章 $text = "判定対象となる文章"; //判定キーワードの設定 $word1 = "/キーワード1|きーわーど1|keyword1/"; $word2 = "/キーワード2|きーわーど2|keyword2/"; . .(中略) . $word30 = "/キーワード30|きーわーど30|keyword30/"; //判定処理 switch (true) { case preg_match($word1, $text): echo "キーワード1に該当します" break; case preg_match($word2, $text): echo "キーワード2に該当します" break; . .(大量のcase) . case preg_match($word30, $text) && preg_match($word1, $text): echo "キーワード1かつキーワード30に該当します" break; }; ざっと書くとこのような構造になっています。 しかしキーワード分岐がかなり多岐に渡っている状態で、switch文の後半のcaseに該当する場合になってくると速度もかなり遅く感じます。 どうにかもう少し高速化したいなあと考えているのですが、何か良い方法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPです2つのスクリプトの相違がわかりません

    PHPですが、以下の2つのスクリプトで同じ結果がでると思ったのですが現実は違いました。 henkan.php <html> <body> <?php $uketori=$_POST['UKETORI']; $uketori=str_replace("pen","pencil", $uketori); $uketori=strtoupper($uketori); print "$uketori"; ?> </body> </html> henkan2.php <?php $str=$_POST['UKETORI']; echo str_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; echo mb_ereg_replace("です。","だよん。", $str) . "<br>\n"; echo "<br>\n"; ?> フォームに です。 という文字を入れたら変換されて だよん。 と表示さしたいのですが、上の2つで相違がでました。なぜなんでしょうか。 henkan.php では変換されませんでした。 henkan2.php では変換されました。

    • ベストアンサー
    • PHP