PDOを使用し複数キーワードでOR条件のDB検索

このQ&Aのポイント
  • PDOを使用した複数キーワードでOR条件のDB検索をしたいです。対象レコード件数が少ないので「LIKE '%hoge%'」で書こうと思うのですが、ループで書くしかないのでしょうか。
  • シングルクオートなどエスケープの処理を別で考えなければならず、面倒なソースになってしまいます。他に良い方法があるのか考えています。
  • 初歩的な疑問ですが、どのようにすれば複数キーワードでOR条件のDB検索が簡単に行えるでしょうか?
回答を見る
  • ベストアンサー

PDOを使用し複数キーワードでOR条件のDB検索

PDOを使用した複数キーワードでOR条件のDB検索をしたいです。 対象レコード件数が少ないので「LIKE '%hoge%'」で書こうと思うのですが下記の様にループで 書くしかないのでしょうか。 シングルクオートなどエスケープの処理を別で考えなければならず面倒なソースになってしまい、 他に良い方法が有りそうだけど、、と考えています。 初歩的な疑問ですが宜しくお願いします。 $serch_input = array('hoge','foo','""""') $input[] = prode(" " ,$serch_input) $sql = 'SELECT * FROM hoge WHERE '; foreach($input as $w) { $sql .= 'OR hoge.text LIKE "%' . $w . '%"'; } $result = connect()->query($sql); return $result;

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

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

PDO を利用しているなら、プリペアードクエリを使うべきです。文字列のエスケープも適宜行ってくれますし。 like 比較対照にプレースホルダー「?」 を使うとすれば、str_repeat で条件節が作れます。 また、プレースホルダーへ与える文字に、ワイルドカード文字を追加するには、concatなどの文字列連結関数を使う必要があります。接続先のデータベースによって文字列連結用の関数や演算子が違うので、適宜置き換えてください。 $search_input =array('hoge','\%\_', '"', "'", '\\'); $sql = 'select * from tablename where columnname like concat("%", ?, "%") '. str_repeat( ' or columnname like concat("%", ?, "%") ' , count($search_input )-1 ); $stmt = $connect->prepare($sql); $stmt->execute($search_input );

tackn910
質問者

お礼

なるほど、このロジックならプリペアードクエリも使用することが出来ます。 str_repeatは知らなかったのですが、これも王道で適切ですね。 ご回答有り難う御座いました。

関連するQ&A

  • cakephpでキーワード検索

    すみません。いろいろやってみたんですが 断念して、ここに投稿しました。 検索キーワードでページングするための方法がわかりません。 例)東京 寿司屋 このようにスペースで単語ごとに区切ります。 一文字だけは成功しましたが、スペースを空けて単語を読みとる 方法が浮かびません。 $keyword = mb_convert_kana($this->data["Hoge"]["keyword"],'rnask'); $keywords = preg_split("/[\s]+/",$keyword); $set = array(); $set = array( 'OR' => array( 'Hoge.name LIKE' => '%'.$keywords[0].'%', 'Hoge.prefecture LIKE' => '%'.$keywords[0].'%', 'Hoge.job LIKE' => '%'.$keywords[0].'%', ), //'OR' => array( //'Hoge.name LIKE' => '%'.$keywords[1].'%', //'Hoge.prefecture LIKE' => '%'.$keywords[1].'%', //'Hoge.job LIKE' => '%'.$keywords[1].'%', //), // コメントをはずしてみると、案の定エラーこきます。 'Hoge.cp_flag' => 1, ); $this->set("hogehoes",$this->paginate('Hoge',$set,null)); お願いします。どなたかお助け下さい。

    • ベストアンサー
    • PHP
  • PDOでの検索システムについて

    プログラミング初学者です。 過去に検索システムを作る時にmysqlを使っていましたが、今回PDOを使った簡単な検索の仕組みを作ってみています。 実際に動作確認してみると検索結果で何もでず、var_dumpで確認してみるとNULLとなってしまいます。 いろいろ調べているのですが、PDOを使った場合の検索条件の部分の書き方がイマイチよくわかりません。 そしてだんだん深みにはまって迷走してしまっています。。。 アドバイスをいただけないでしょうか。 【検索フォーム(search.php)】 <form name="" method="POST" action="result.php"> <button type="submit" name="area" value="新宿">新宿</button> </form> 【検索結果(result.php)】 define('DB_HOST', 'localhost'); define('DB_USER', 'ユーザー名'); define('DB_PASSWORD', 'DBパスワード'); define('DB_NAME', 'DB名'); try { $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASSWORD); } catch (PDOException $e) { echo $e->getMessage(); exit; } $sql= "select * from shop where area='" . $_POST["area"] . "' "; $shop = array(); foreach ($dbh->query($sql) as $row) { array_push($shop, $row); } ?> <body> <?php foreach ($salon as $row) : ?> <?php echo htmlspecialchars($row['area'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['station'],ENT_QUOTES,'UTF-8'); ?> <?php endforeach; ?> </body> </html> ※ $sql= "select * from shop where area='" . $_POST["area"] . "' "; の部分に原因があるのかと私は考えています。 $sql= "select * from shop; とした場合は全件表示されるからです。 見難いコードで申し訳ありませんが、アドバイス頂ければ幸いです。

    • ベストアンサー
    • PHP
  • チェックボックスで複数選択した値をSQLへ

    次のような入力フォームから、SQLのテーブルに登録します。 <?php function connect() { return new PDO("mysql:dbname=★★★;host=★★★","★★★","★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); if (@$_POST['submit']) { $hoge = $_POST['hoge']; if (!$error) { $pdo->query("INSERT INTO ★(hoge) VALUES('$hoge')"); header('Location: example.php'); exit(); } } ?> <form action="insert.php" method="post"> <input type="checkbox" name="hoge[]" value="りんご"/>りんご<br> <input type="checkbox" name="hoge[]" value="みかん" />みかん<br> <input type="checkbox" name="hoge[]" value="いちご" />いちご <input class="submit" type="submit" name="submit" value="登録"> </form> これで、例えば「りんご」と「みかん」をチェックして登録ボタンを押すと 受け取りのexample.phpにはArrayと表示され、SQLに反映されません。 よい方法があったら教えてください。

    • ベストアンサー
    • PHP
  • like検索の複数キーワードで、プレースホルダを利

    like検索の複数キーワードで、プレースホルダを利用するやり方が分からないので教えてください <やりたいこと> ・複数キーワード検索(東京 hoge) <現状、出来ていること> ・1単語キーワード検索(東京) <分からないこと> ・配列として処理すれば良いみたいなのですが、プレースホルダとの絡みでどうすればよいのか分かりません <環境> ・MySQL ・PDO <現状コード抜粋> public function search($keyword)  {  $sql = "   SELECT a.*     FROM hoge a      WHERE (honbun LIKE :keyword)      ";  $keyword ="%".$keyword."%";

    • ベストアンサー
    • PHP
  • ダブルクォートで囲まれた文字列の取り出し

    Windows環境でRuby 1.8.7を使用しております。 ----sample1.txt----- hoge"foo\"bar\"foo"hage"bar\"baz\"bar"hoge ------------------ ファイルから1行ずつテキストを読み込んで処理を行います。上のsample.txtの様な行を読み込んだ場合にダブルクォートで囲まれた部分 foo\"bar\"foo bar\"baz\"bar を取り出すのにはどの様な正規表現を用いればよろしいでしょうか? エスケープされたダブルクォートを除ける上手い方法がわかりません。 また、ダブルクォートで囲まれた部分が複数行にまたがる場合はどの様に処理をすれば良いでしょうか? -----sample2.txt----- hoge"foo \"bar\" baz" hage ---------------------- -----sample3.txt----- hoge"foo \"ba r\"baz" hage ---------------------- 最初の例のように1行の場合は File.foreach(file) do | line | …… end で良いのですが、複数行の場合には同じように単純には行きません。 ダブルクォートの数を数えて、奇数の場合は偶数になるまで次行をくっつける様な処理を考えているのですが、もっと適切な方法はありますか? 宜しくお願いします。

  • PHP+PDO+MYSQL で実行されたSQL文の取得について

    PHP+PDO+MYSQL で実行されたSQL文の取得について PEARのDBからPDOへの移行をしていましてデバック用のSQL文取得で困っています。 $sql = "SELECT * FROM sample where id = ? And id2 = ?" PEARのDBでは $db->query($sql,array(1,5)); $db->last_query; で実行したSQL文を取得することは可能でした。 PDOの場合 $sql_result = $pdo->prepare($sql); $sql_result->execute(array(1,5)); でリプレースフォルダ(クォート処理?)を利用してSQLを実行出来るようですが、 実行したSQLを確認する方法がマニュアル等を読みましたがどうしても分かりません。 どなたかご存知の方がいらっしゃいましたらご教授お願い致します。

    • ベストアンサー
    • PHP
  • mysql_queryでDB検索をしたいが、結果が表示できない

    MYSQL関数の練習で、以下のソースを実行しました。selectDBなどの部分は省いております。 $sql_keyword = ereg_replace("[[:blank:]]+","%\" and name LIKE \"%",trim($word)); $sql = "SELECT * FROM shop where name LIKE \"%$sql_keyword%\""; $result = mysql_query($sql) or die('Query failed: ' . mysql_error()); echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo convert("\t\t<td>$col_value</td>\n"); } echo "\t</tr>\n"; } echo "</table>\n"; mysql_free_result($result); で行うも、エラーなども無く、結果がブランクになってしまいます。 検索する文字列($WORD)に該当するレコードは複数存在します。 エラーなどもないため、原因がわかりません。皆様のお力をお借りできればと存じます。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PDOでDB ページング

    一覧画面と検索画面を一緒にしています 一覧画面は10件表示にし、テキストになにも入力されてなかったらデータを全件表示したいです また、1 l 2 l 3 のようにページを表示し、また何件中何件目データですと表示したいです <!--一覧画面 index.php--> <html> <head> <title>一覧画面</title> </head> <body> <br><br> <blockquote> 一覧画面 <br><br> <?php if ($_GET) { // データがGETされていたら $event = isset($_GET['event']) ? $_GET['event'] : ''; // 取得 if (isset ($_GET['page'])==false) { $page=0; } else { //そうでなければpageパラメータの値をpage変数にセット $page = $_GET['page']; } } ?> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $name=isset($_GET['name'])?$_GET['name']:""; $sql ="select * from tbl_test where "; $sql.="`氏名` like concat('%',?,'%') "; $sql.="or `住所` like concat('%',?,'%') "; $sql.= " limit " . $page*10 . ", 10" ; $stmt = $pdo->prepare( $sql); $stmt->execute(array($name,$name)); $count = $stmt->rowCount(); if($count>0){ print "<table border=1>" ; print "<tr>"; print "<th>番号</th>"; print "<th>氏名</th>"; print "<th>住所</th>"; print "<th>操作</th>"; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ print "</tr>"; $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td></tr>"; }; print "</table>" ; }else{ print "該当するデータがありません"; } ?> <br><br><br> <form action = "index.php" method="GET"> <input type="hidden" name="event" value="find"> <input type="text" name="name"style ="font-size:20px;width: 400px; height: 40px"> <input type="submit" value="検索" style ="font-size:20px;width: 100px; height: 40px"> </form> <br><br> <form action = "regist.php" method="GET"> <input type="hidden" name="event" value="regist"> <input type = "submit" value = "新規登録" style ="font-size:20px;width: 100px; height: 40px"> </form> <input type="hidden" name="page" value="0"> </blockquote> </body> </html> 検索のテキストボックスが空だったら全件表示したいのですが今10件しか出ません limitの書く場所が原因でしょうか? またこのように一覧画面と検索結果画面が一緒じゃまずいですかね? 検索結果を別ウインドウじゃなく自分に返したいと思いこのやり方にしたのですがよくないですか?

    • ベストアンサー
    • MySQL
  • checkboxで複数選択して,OR検索を行うことができなくて困っています.

    HTML,PHPとMYSQLを用いて 企業の求人情報を検索するフォームを作成しています. HTMLの入力フォームは ・キーワード入力(企業名) ・プルダウンから選択(業種選択) ・チェックボックスで複数選択(職種選択) の構成です. 検索を行う際は{企業名 AND 業種 AND (職種[1]OR[2]・・・)}というように職種の部分のみOR検索という構成で考えています. しかし,職種を複数選択して検索を行うことが出来なくて非常に困っています. 以下が現在作成中のコードです. HTMLはチェックボックスの部分のみ貼りますね serch_form.html <form action="library_search.php" method="post"> <input type="checkbox" name="box[]" value="プログラマー">プログラマー <input type="checkbox" name="box[]" value="システムエンジニア">システムエンジニア <br> <input type="checkbox" name="box[]" value="ネットワークエンジニア">ネットワークエンジニア <input type="checkbox" name="box[]" value="その他情報系">その他情報系 library_search.php <html> <head><title>検索結果</title></head> <meta http-equiv="Content-Type" content="text/html charset=EUC-JP"> <body> <?php //POST表示用 print_r($_POST); $where = array(); $host = "localhost"; if (!$conn = mysql_connect($host, "usr", "passwd")){ die("データベース接続エラー.<br />"); } mysql_select_db("db", $conn); $condition = ""; if(isset($_POST["title"]) && ($_POST["title"] != "")){ $title = mysql_escape_string( $_POST["title"]); $title = str_replace("%", "\%", $title); if ($condition == ""){ $condition = "WHERE cname LIKE \"%".$title."%\""; } else{ $condition .= "AND cname LIKE \"%".$title."%\""; } } if(isset($_POST["pdown"]) && ($_POST["pdown"] != "")){ $pdown = mysql_escape_string( $_POST["pdown"]); $pdown = str_replace("%", "\%", $pdown); if ($condition == ""){ $condition = "WHERE gyousyu LIKE \"%".$pdown."%\""; } else{ $condition .= "OR gyousyu LIKE \"%".$pdown."%\""; } } if(isset($_POST["box"]) && ($_POST["box"] != "")){ //foreach($_POST["box"] as $val){ $where = mysql_escape_string( $_POST["box"]); $where = str_replace("%", "\%", $where); //} if ($condition == ""){ $condition = "WHERE job LIKE \"%".$where."%\""; } else{ //$where = inplode(' or ' ,$where); $condition .= "AND job LIKE \"%".$where."%\""; } } $sql = "SELECT * FROM job_table ".$condition." ORDER BY id LIMIT 50"; $res = mysql_query($sql, $conn); print("<table border=\"1\">"); print("<tr><td>企業名</td><td>業種</td><td>募集職種</td></tr>"); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["cname"]."</td>"); print("<td>".$row["gyousyu"]."</td>"); print("<td>".$row["job"]."</td>"); print("</tr>"); } print("</table>"); mysql_free_result($res); ?> </body> </html> 特にforeach文を使って,POSTに格納されたjob[]を分解して格納する方法がわかりません. PHP初心者で汚いコードですが,どうかお願い致します.

    • 締切済み
    • PHP
  • PDOを使用しているのですが・・・

    環境: PostgreSQL7.4 PHP5.2 PDOを使用してデータベースにアクセスして 一旦テーブル名を取得しのちに SELECT文を用いて選択されたテーブルの内容をすべて表示したいのですが テーブルの内容を表示する部分で Fatal error: Call to a member function query() on a non-object と表示されてうまくいきません。 <?php $dns='pgsql:host=;dbname=;user=;password='; try{ $dbh=new PDO($dns); $list = "<option>select</option>\n"; foreach ($dbh->query("SELECT * FROM pg_tables WHERE tableowner='db';", PDO::FETCH_COLUMN,1) as $row) { $arr= array($row); foreach($arr as $value) { $list .= "<option value=\"$value\">".$value."</option>\n"; } } $dbh=null; }catch (PDOException $e){ print 'エラー!: '. $e->getMessage(); die(); } ?> <form action="database.php" method="post"> <P> <select name="test"> <?php echo "$list";?> </select> </P> <input type="submit" value="送信!"> </form> <?php $born = $_POST['test']; $search =$dbh->query("SELECT * FROM $born"); // この部分 echo $search; ?>

    • 締切済み
    • PHP

専門家に質問してみよう