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;
}
こんな感じで、エラーとかは今のところなくなったし、本番で使ってもいいのではないか。