AND検索のスクリプト記述方法(PostgreSQL)

このQ&Aのポイント
  • PostgreSQLとPHPを連携させたデータベースを作成し、AND検索用のスクリプトの書き換え方を知りたい。
  • WHERE句のORをANDに変更するだけでは、すべての検索項目に検索語を入力しないと検索ができなくなってしまう。
  • この問題の解決策を教えてほしい。
回答を見る
  • ベストアンサー

AND検索のスクリプト記述方法(PostgreSQL)

PostgreSQLとPHPを連携させたデータベースを作成しております。 入門書のスクリプトを流用してOR検索はできるようになったのですが,AND検索用の書き換えが上手くいきません。 下記は関連すると思われるスクリプトの一部を抜き出したものです。 単純にWHERE句のORをANDに変更しますと,AND検索にはなるのですが,すべての検索項目に検索語を入力しないと検索ができなくなりました。 尚,検索項目はyear,client,titleの3つです。 下記1行目も影響していると思うのですが書き換え方がわかりません。 当方が不勉強であることは重々承知しておりますが,アドバイス等いただけると幸いです。 $year_cond = $client_cond = $title_cond = "false"; if ($year != "") { $year_cond = "year LIKE '%{$year}%'"; } if ($client != "") { $client_cond = "client LIKE '%{$client}%'"; } if ($title != "") { $title_cond = "title LIKE '%{$title}%'"; } $sql = <<<EOS SELECT id, year, client, title, summary, summarypass, fulltext FROM houkokusyo WHERE {$year_cond} OR {$client_cond} OR {$title_cond} ORDER BY id EOS;

  • impAT
  • お礼率100% (2/2)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shogo0809
  • ベストアンサー率47% (25/53)
回答No.1

$year_cond = $client_cond = $title_cond = "false"; ↓ $year_cond = $client_cond = $title_cond = "true"; false AND true AND true = false です。 false OR true OR true = trueです。

impAT
質問者

お礼

お世話になります。 ご回答と入門書を手掛かりに試行錯誤をしました。上記の回答への補足は的外れな内容だったようで大変失礼しました。 現時点で全件表示の回避はできておりませんが,AND検索の実装が優先でしたので,今回はこれで完成とします。 ありがとうございました。

impAT
質問者

補足

ご回答ありがとうございました。 早速書き換えて実行したところAND検索ができるようになりました。 ところが,3つある検索項目に何も入力せずに検索を実行するとすべてのレコードが表示されてしまいます。 何も入力しない場合はSQLを実行しないように冒頭に下記の記述をしております。 if (! isset($_POST['year']) || ! isset($_POST['client']) || ! isset($_POST['title'])) { exit; } 書き換える前のOR検索では,すべてブランクの時は実行されなかったのですが,AND検索時で同じ動作をさせるには何が足りないのでしょうか? ご教授いただければ幸いです。

関連するQ&A

  • AND検索

    アクセスでフォームを作成し、入力項目を5箇所用意しました。 その入力項目によって、OR検索とAND検索を行わせたいと思っています。 OR検索に関しては問題無いのですが、AND検索をさせた場合、5箇所全てを埋めないと結果が得られません。 AND検索で5項目の内3項目が空でも残りの2項目が該当すればデータを表示させたいのですが、方法がわかりません。 アクセス2000を使っています。 よろしくお願いいたします。

  • 以下のアクセスの検索フォームで。。。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If '項目 If Me!Koumoku1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 like '*" & Me!Koumoku1.Value & "*')" condKoumoku2 = "(T_マスタ.項目2 like '*" & Me!Koumoku1.Value & "*')" condSKoumoku3 = "(T_マスタ.項目3 like '*" & Me!Koumoku1.Value & "*')" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempComd = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '(OR((T_マスタ.項目1 like …')の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? (項目を含まない状態ではうまく検索できてました。) Access2000です。

  • 複合語検索で・・・

    自分用の蔵書検索システムを作ってるのですが、 キーワード検索でつまづいてしまいました。 単一のキーワードでの検索は実装できたので、 こんどはスペース区切りによる複合語検索に挑戦しました。 (検索タイプはAND検索のみです) $array = explode(" ", $_GET['keyword']); $cnt = count($array); $where = " WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "title LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" AND "; } } 以上のようにして、なんとかできました。 これを著者テーブルにも対応させたいのです。 たとえば、検索キーワードに 「太郎 物語」 と入力したとすると、 書籍テーブルか著者テーブルのいずれかに、 「太郎」および「物語」が含まれるものを表示したいのです。 つまり、 「太郎物語」というタイトルの書籍や、 「~物語」というタイトルで著者が「~太郎」という書籍などを表示するようにしたいです。 ORでつなげたりしてみたのですが、 どうもうまくいきませんでした。 また、もっとスマートなやりかたがあったら ぜひ教えてください。 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP
  • PHP+MYSQLで検索画面を作成しています。プルダウンとキーワードを使用していますがうまくいきません。

    住所録を作成し、プルダウンとキーワードで作成しましたがうまくいきません。実行すると最後に記載のエラーがでます。教えてください。フリーワードだけの検索はうまくいきましたが。 ---kensaku.php--- <?php extract($_POST); $dfrom = sprintf("%04d-%02d-%02d",$year1,$mon1,$date1); $dto = sprintf("%04d-%02d-%02d",$year2,$mon2,$date2); if($kai == ''){ }else{ $jouken = "(ocrdate between '$dfrom' and '$dto')"; if ($kai <> "*"){ $jouken = "$jouken and kai like '%$kai%'"; } if ($fuk <> "*"){ $jouken = "$jouken and fuk like '%$fuk%'"; } if ($jic <> "*"){ $jouken = "$jouken and jic like '%$jic%'"; } if ($key1 <> ""){ $jouken = "$jouken and (keyword like '%$key1%' or detail like '%$key1%' or treat like '%$key1%' or remark like '%$key1%')"; if (key2 <> ""){ $jouken = "$jouken and (keyword like '%$key2%' or detail like '%$key2%' or treat like '%$key2%' or remark like '%$key2%')"; if (key3 <> ""){ $jouken = "$jouken and (keyword like '%$key3%' or detail like '%$key3%' or treat like '%$key3%' or remark like '%$key3%')"; } } } mysql_connect('localhost','***','****'); mysql_select_db('****'); $sql = "select * from jyusho where $jouken"; $result = mysql_query($sql); $num = mysql_num_rows($result); if ($num == 0){ echo "該当データがありません<br>"; exit; }else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>加入日</th>\n"; echo "<th>加入地域<br></th>\n"; echo "<th>加入県</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<td align=\"right\"><a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["kai"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jic"]; echo "</td></tr>"; }(ここまで170行目、次は、/htmlとなっています) ---ここまで--- エラーは、「Parse error: parse error, unexpected $end in c:\(省略)\kensaku.php on line 171」

  • 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
  • 曖昧検索LikeのOR条件

    アクセスでSQLを作成してます。 プロンプトで3つ項目を入力(未入力時はその分を考慮しない) して一致するのを検索する場合 --------------------------- select * from TABLE where 項目名 in ([項目1],[項目2],[項目3]) --------------------------- とする事で出来ました。 ただ、今検索を曖昧検索にしようとしています。 --------------------------- select * from TABLE where 項目名 like ("*" & [項目名1] & "*") or 項目名 like ("*" & [項目名2] & "*") or 項目名 like ("*" & [項目名3] & "*") --------------------------- 上記のようにするとプロンプトで未入力(リターン押下)時に 全てを検索対象にしてしまいます 未入力時は、そのプロンプトの条件自体を無効にしたいです。 何か良い方法はありますでしょうか?

  • 検索ワードを(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
  • Accessの検索フォーム(CLng)で。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 (項目1-5は数値データなのであいまい検索はしたくありません。) 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If If Me!項目1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 = " & CLng(Me!項目1.Value) & ")" condKoumoku2 = "(T_マスタ.項目2 = " & CLng(Me!項目1.Value) & ")" condKoumoku3 = "(T_マスタ.項目3 = " & CLng(Me!項目1.Value) & ")" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempCond = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '((OR OR))' の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? Access2000です。

  • 条件のAND検索??

    条件のAND検索?? 現在 □豊岡市 □神戸市 □篠山町 みたいなチェックボックスの検索システムが有ります。 これを 地域(カラム=jyusyo) □豊岡市 □神戸市 □篠山町 予算(カラム=kakaku) [ 円]~[ 円](option属性) と新たに付け加えたいです。 現在の検索システムのソースは $jyusyo=$_POST["jyusyo"]; $jyusyonum=array("豊岡市","養父市","朝来市","神戸市","姫路市"); $query = "select name,jyusyo,kakaku,gazou,link from kensaku where"; if($jyusyo != "") { foreach ($jyusyo as $value) { $like .= "'" . $value . "',"; } //最後の , を削除 $like = substr($like, 0, -1); $query = $query . " jyusyo in ($like) "; } をどのように変更したら良いですか?? 試行錯誤しましたが、それらをここで説明したら長くなるので書きませんが丸投げしてるわけでは御座いません。よろしくお願いします。

    • ベストアンサー
    • PHP