node内で別サーバにあるDBを読み込んで表示させる。
前回のソースだと、複数条件の検索が出来なくて、ただ各検索窓の表示をするだけだった。
そんな訳で、1つの検索窓でフリーキーワード検索可能な大幅に改修。
↓参考にさせていただいたサイト
フリーワード検索時に使えるSQL「concat」 複数キーワードphpソース
これまでの検索では、「'(シングルクォート)」の1文字検索するとsqlエラーが出てしまうので指定文字を削除することで回避。
と思ったが、普通にエスケープ処理に変更。
何も入力しないと、何も表示しない。
全角・半角スペース・記号等で検索するとだと、削除されて「該当なし」と表示する。
検索したワードを表示するのと、該当件数を表示。
<?php require_once 'hogehoge.php'; $db = getDb(); $SQL = "SELECT * FROM items "; // 文字列が入っていれば。。 if( strlen( $_POST['keyword'] ) > 0 ){ try { $keyword_txt = htmlspecialchars($_POST['keyword'], ENT_QUOTES, $charset); //半角記号を削除 //$keyword_txt = preg_replace('/[][}{)(!"#$%&\'~|\*+,\/@.\^<>`;:?_=\\\\-]/i','',$_POST['keyword']); // 全角スペースを半角スペースに置換 $keyword_txt = str_replace( " " , " " , $keyword_txt ); // スペース区切りで文字列を配列分割 $keywordArr = explode( " " , $keyword_txt ); // SQL文 $SQL .= " WHERE ("; // キーワードをスペース区切りで配列、検索SQLを作る for( $i = 0; $i < count($keywordArr);$i++ ){ $SQL .= "concat(name_school,' ',new_school,' ',old_school) LIKE '%{$keywordArr[$i]}%' AND "; //var_dump($SQL); } $SQL = rtrim( $SQL , " AND " ); $SQL .= ")"; $stt = $db->prepare($SQL); $stt->bindValue(1, "%".$_POST['keyword']."%"); $stt->execute(); if(strstr($SQL, "%%")){ echo "検索条件では該当なしです<br>\n"; } else { switch ($row = $stt->fetch(PDO::FETCH_ASSOC)) { case empty($row); echo "検索条件では該当なしです<br>\n"; break; case TRUE: echo '<p>検索キーワード: ' . $keyword_txt . ' </p>'; echo '<table><tr><th>氏名</th><th>HOGE1</th><th>HOGE2</th><th>HOGE3</th><th>新</th><th>旧</th></tr>'; $stt->execute(); $i = 0; while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { echo "<tr><td>" . $row["name_school"] . "</td>"; echo "<td>" . $row["change_school"] . "</td>"; echo "<td>" . $row["position_school"] . "</td>"; echo "<td>" . $row["category_school"] . "</td>"; echo "<td>" . $row["new_school"] . "</td>"; echo "<td>" . $row["old_school"] . "</td></tr>"; } echo '</table>合計 ' . $i . '件 該当しました</body></html>'; break; default: echo "検索条件では該当なしです<br>\n"; break; }} $db = NULL; } catch (PDOException $e) { print("エラーメッセージ:".$e->getMessage()); } }
require_once 'hogehoge.php';には前回の記事と同様に下記の内容が入っている。
仮にDBの方のサーバが落ちても、エラー画面ではIPアドレスに接続出来ないと表示される。
<?php function getDb() { $dsn = 'mysql:dbname=fugafuga; host=***.***.***.***'; $usr = 'hage'; $passwd = 'pass'; try { $db = new PDO($dsn, $usr, $passwd); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec('SET NAMES utf8'); } catch (PDOException $e) { die("接続エラー:{$e->getMessage()}"); } return $db; }
こんな感じで、エラーとかは今のところなくなったし、本番で使ってもいいのではないか。