PHP+MySQLでAND検索のソースコード

このQ&Aのポイント
  • PHP初心者向けの、PHP+MySQLでAND検索を実行するためのソースコードです。
  • ソースコード中に「Notice: Undefined variable: where」のエラーメッセージが表示されている場合、どのように修正するかについての解説です。
  • ソースコードの解説とともに、わかりやすく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
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

Notice: Undefined variable: ですから、未定義の変数を使おうとしています。 どの行でエラーになっているかが表示されていると思いますので、その行で使っている変数を再チェックしてください。

関連する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
  • Perl アンド検索

    恐れ入ります。 perlにて、&検索を実行する為に、以下のようにしています。 しかしうまく動作しません。 use CGI $word = $form->param('word'); open (IN<, "xxx.txt"); $rec=<IN>; $where="$rec ne '' "; if($word ne ''){ $word =~ s/ / /g; @word_array = split(/ / , $word); foreach (@word_array){ $where .= "and $rec=~/$_/ "; } } if($where){ @rec=split(/,/, $rec); //省略 xxx.txtを$recに格納して、フォームより送信されてきたスペース区切りの語句を、分割し、各々をマッチさせて検索したいのですが、 どのようにしたらよいでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • php複数キーワード検索

    いつもお世話になっております。 php+MySQLにて検索機能を作成しています。 キーワードが1つの場合には以下のスクリプトで正常に動作していますが、全角あるいは半角のスペースによって複数キーワードを入れた場合にも検索が行われるようにしたいと思っています。 現在のスクリプト $word=$_POST["seek"]; $word=stripslashes($word); $con_word=mb_convert_encoding($word,"EUC-JP","auto"); //データベース接続がここに入ります $sql="SELECT words,name,id FROM profile WHERE words like '%$con_word%'"; ここで、スペースを" AND "に置き換えるために、 $word=preg_replace('/\s+/',' ',$word); $word=preg_replace('/ /',' AND ',$word); あるいは $word=mb_convert_kana($word,"as","EUC-JP"); $word=preg_replace('/ /',' AND ',$word); などを試してみたのですがうまく動作しません。 どなたか問題点を具体的にご指摘いただけないでしょうか。 よろしくお願いいたします。 *環境 php mysql レンタルサーバ(ロリポップ)

    • ベストアンサー
    • PHP
  • PHP 空白文字で分割したい

    $text = "日本 中国 オランダ" を 日本, 中国, オランダのように分割するために、 以下のコードを書きました。 preg_split("/[\s]+/", $text); しかし、全角スペースの時も分割したいので、正規表現を/[ \s]+/とすると、preg_splitの返す配列に期待したものが、入りません。なぜか空文字("")が含まれます。 どうすれば、全角スペースに対応できるでしょうか?

    • ベストアンサー
    • 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スペース区切り、複数単語が検索できません

    お日ごろから大変お忙しい中、この投稿を見て頂きまして誠に有難うございます。私は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
  • AND検索がきちんとできません

    PHP、MYSQLの勉強を始めたばかりの者です。 AND検索をしたいのですが…… きちんと検索できません。 データの中身 データタイトル|キーワード A|テスト B|サンプル 以下のようにすると、「テ」「ス」でAのデータは出てくるのですが、 「テ」「サ」で検索すると、 一つもでてこないはずなのに、Bのデータが出てきます。 「サ」「テ」ですとAのデータがでてきてしまいます。 何故でしょうか。 自分なりに考えてはみたのですが、お手上げ状態です。 何卒、宜しくお願いします。 <form method="GET" action="sample.php"> <input type="text" name="q" size="20"> <input type="submit" value="search"> </form> <?php require_once 'dbmanager.php'; $pdo = getDb(); // クエリ設定 if (isset($_GET['q'])) { $q = htmlspecialchars($_GET['q']); //クエリを入力 $q = str_replace(" ", " ", trim($q)); $words = explode(" ",$q); } // 解析 $tmp = []; $wd = []; $i = 0; foreach($words as $word) { if(!empty($word)) { $tmp[] = " keyword LIKE :word".$i." "; $wd[] = '%'.$word.'%'; $i++; } } // SQL if(count($tmp) > 0){ $sql = "SELECT * FROM ttables WHERE (".implode("AND",$tmp).") ORDER BY id DESC"; $search_sql = $pdo->prepare($sql); foreach($wd as $key => $word){ $search_sql->bindParam(':word'.$key, $word); } $search_sql->execute(); // while while($row = $search_sql->fetch(PDO::FETCH_ASSOC)) { print"<li>{$row['keyword']}{$row['title']}</li>"; } }

    • ベストアンサー
    • PHP
  • PHP 下記エラーメッセージの解消について

    下記PHP エラーメッセージの解消方法と、正常にプログラムが動くための簡単なスクリプトも添えていただければ幸いです。よろしくお願い申し上げます。 ■エラーメッセージ (1)Notice: Undefined variable: error in C:\xampp on line 66 (2)Notice: Undefined variable: error in C:\xampp on line 69 ■スクリプト <body> <h1>ログインする</h1> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> ⇒(ここからPHP文です) <input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['email']); ?>" /> <?php if ($error['login'] == 'blank'): ?> <p class="error">* メールアドレスとパスワードをご記入ください</p> <?php endif; ?> <?php if ($error['login'] == 'failed'): ?> <p class="error">* ログインに失敗しました。正しくご記入ください。</p> <?php endif; ?> ⇒(ここまでPHP文です) </dd> <dt>パスワード</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['password']); ?>" /> </dd> ......省略 </form> なのですが、 下記エラーメッセージが出てしまいます。 (1)Notice: Undefined variable: error in C:\xampp on line 66 (2)Notice: Undefined variable: error in C:\xampp on line 69 これは、上記スクリプトのPHP文を指しております。 どのように初期化をすればよいかわからず、ここで立ち止まっておりました。 ☆どうすればこのエラーメッセージを解消でき、また、本スクリプトが正常に作動しますでしょうか? ☆初期化のためのスクリプトを添えて頂ければ嬉しく思います。 みなさまのお力を貸して頂ければ幸いでございます。 よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 冗長コードのfunction化と汎用化

    GETで検索文字列($_GET["q"])が入っていたら、その文字列を太字に変換しておく、その作業を複数のカラム($myval1~5)を対象に施したい、というようなことを 以下のコードでやっているつもりです。 他方、(お恥ずかしながら)最近、「冗長な繰り返しコードのfunction化」のメリットというのをようやく理解し始めましたが、下記のようなコードはfunction化に向いてますか? if (isset($_GET["q"]) and strlen($_GET["q"]) > 0) { if (! is_null($myval1) ) { $myval1 = ereg_replace(preg_quote($_GET["q"]), "<b>". "\\0" . "</b>", $myval1); } if (! is_null($myval2) ) { $myval1 = ereg_replace(preg_quote($_GET["q"]), "<b>". "\\0" . "</b>", $myval2); } if (! is_null($myval3) ) { $myval1 = ereg_replace(preg_quote($_GET["q"]), "<b>". "\\0" . "</b>", $myval3); } if (! is_null($myval4) ) { $myval1 = ereg_replace(preg_quote($_GET["q"]), "<b>". "\\0" . "</b>", $myval4); } if (! is_null($myval5) ) { $myval1 = ereg_replace(preg_quote($_GET["q"]), "<b>". "\\0" . "</b>", $myval5); } } また、「とうふ たまご」のように検索文字列がスペースで区切られていた場合に preg_split('/(\s| )+/', $_GET["q"]) こうやると分割できることはわかりましたが、これを上記に適用する方策がさっぱり思い浮かびません。foreachとかを使う?のでしょうか?

    • ベストアンサー
    • PHP
  • textareaの入力禁止文字チェック

    こんにちは。 初歩的なことかもしれませんが、不思議な現象?に困っています。 textareaから入力された文字列の中に入力禁止文字がないかどうかチェックしたいのですが、textareaで改行を行った場合、一番下の行のチェックしか出来ません。 ソースは以下です。 if (preg_match("/[$check_word]+$/",$text)){ $msg = '本文に入力禁止文字が含まれています'; } なお、改行コードを削除してからチェックしても、同じ現象が起こっています。 //$text = preg_replace("/\n|\r/","",$text); どなたか回避策などご存じないでしょうか><

    • ベストアンサー
    • PHP