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

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つだけでも可能、複数でも絞り込んで検索可能。

随分手抜きだが、これで大丈夫なんじゃないかと・・・。