node内で他のDBを読み込みたい(2)

前回の続き

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;
}

こんな感じで、エラーとかは今のところなくなったし、本番で使ってもいいのではないか。