Drupalサイトのノード内で別サーバDBを読み込みたい。
何故こんなことするのかと言われれば、検索負荷でのサイトダウンを考慮して負荷分散したいから。
これでDrupal以外にもPHPでお手軽キーワード検索等に使えますね。
他のサーバからDBを読み込むには、読み込むサーバ側の設定が必要です。
データベース名がfugafuga
テーブル名はitems
検索はnameのみでの仕様です。
<form method="POST" action="http://●●/node/210978"> <h2>検索</h2> 名前:<input type="text" name="name" size="20" /> <input type="submit" value="検索" /> </form> <?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; } if ($_POST['name'] != '') { try { $db = getDb(); $stt = $db->prepare('SELECT * FROM items WHERE name LIKE ?'); $stt->bindValue(1, '%'.$_POST['name'].'%'); $stt->execute(); while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { echo '<table><tr><th>氏名</th><th>HOGE1</th><th>HOGE2</th><th>HOGE3</th><th>新</th><th>旧</th></tr>'; echo "<tr><td>" . $row["name"] . "</td>"; echo "<td>" . $row["change"] . "</td>"; echo "<td>" . $row["position"] . "</td>"; echo "<td>" . $row["category"] . "</td>"; echo "<td>" . $row["new"] . "</td>"; echo "<td>" . $row["old"] . "</td></tr>"; } print '</table>'; $db = NULL; } catch (PDOException $e) { print("エラーメッセージ:".$e->getMessage()); } } ?>
気が変わって複数のフィールドから検索させて表示させたい場合は
<form method="POST" action="http://●●/node/210978"> <h2>検索</h2> 名前:<input type="text" name="name" size="20" /> 新:<input type="text" name="new" size="20" /> 旧:<input type="text" name="old" size="20" /> <input type="submit" value="検索" /> </form> <?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; } if ($_POST['name'] != '') { try { $db = getDb(); $stt = $db->prepare('SELECT * FROM items WHERE name LIKE ?'); $stt->bindValue(1, '%'.$_POST['name'].'%'); $stt->execute(); while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { echo '<table><tr><th>氏名</th><th>HOGE1</th><th>HOGE2</th><th>HOGE3</th><th>新</th><th>前</th></tr>'; echo "<tr><td>" . $row["name"] . "</td>"; echo "<td>" . $row["change"] . "</td>"; echo "<td>" . $row["position"] . "</td>"; echo "<td>" . $row["category"] . "</td>"; echo "<td>" . $row["new"] . "</td>"; echo "<td>" . $row["old"] . "</td></tr>"; } print '</table>'; $db = NULL; } catch (PDOException $e) { print("エラーメッセージ:".$e->getMessage()); } } if ($_POST['new'] != '') { try { $db = getDb(); $stt = $db->prepare('SELECT * FROM items WHERE new LIKE ?'); $stt->bindValue(1, '%'.$_POST['new'].'%'); $stt->execute(); while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { echo '<table><tr><th>氏名</th><th>HOGE1</th><th>HOGE2</th><th>HOGE3</th><th>新</th><th>旧</th></tr>'; echo "<tr><td>" . $row["name"] . "</td>"; echo "<td>" . $row["change"] . "</td>"; echo "<td>" . $row["position"] . "</td>"; echo "<td>" . $row["category"] . "</td>"; echo "<td>" . $row["new"] . "</td>"; echo "<td>" . $row["old"] . "</td></tr>"; } print '</table>'; $db = NULL; } catch (PDOException $e) { print("エラーメッセージ:".$e->getMessage()); } } if ($_POST['old'] != '') { try { $db = getDb(); $stt = $db->prepare('SELECT * FROM items WHERE old LIKE ?'); $stt->bindValue(1, '%'.$_POST['old'].'%'); $stt->execute(); while ($row = $stt->fetch(PDO::FETCH_ASSOC)) { echo '<table><tr><th>氏名</th><th>HOGE1</th><th>HOGE2</th><th>HOGE3</th><th>新</th><th>旧</th></tr>'; echo "<tr><td>" . $row["name"] . "</td>"; echo "<td>" . $row["change"] . "</td>"; echo "<td>" . $row["position"] . "</td>"; echo "<td>" . $row["category"] . "</td>"; echo "<td>" . $row["new"] . "</td>"; echo "<td>" . $row["old"] . "</td></tr>"; } print '</table>'; $db = NULL; } catch (PDOException $e) { print("エラーメッセージ:".$e->getMessage()); } } ?>
3つ検索窓が出てきて、1つだけでも可能、複数でも絞り込んで検索可能。
随分手抜きだが、これで大丈夫なんじゃないかと・・・。