PHPからPostgreSQL 9.3.2にPDO(PDO_PGSQL)を使用して接続する
PHPからPostgreSQLに接続して、データを取得してみます。
pg_connectではなくで、PDO(PHP Data Objects)を使ってみます。
PostgreSQL 関数 (PDO_PGSQL)
PDO使うの初めてです。
PHP拡張のインストール
FreeBSD 10でプログラムを動かします。
PHP拡張「PDO_PGSQL」のインストールはこちらで行いました。
FreeBSD 10.0のPHP5からPostgreSQLに接続する
接続、切断
データベースへの接続はPDOオブジェクトのインスタンスを作成することで行うようです。
引数は、
・接続文字列
・ユーザー名
・パスワード
$db = new PDO ($dsn, $user, $password);
接続文字列に従い、適切なドライバが自動的に選択される模様。
JDBCドライバとおんなじ感じだと理解しました。
接続文字列の形式はこんな感じ。
pgsql:dbname=mydb;host=localhost
詳細はこちらに記載されています。
PDO_PGSQL DSN
切断は、生成したPDOオブジェクトにnullを設定するか、unsetすればいいようです。
$db = null;
または
unset($db);
サンプルはこんな感じになりました。
getMessage();
}
?>
データの検索
事前に適当にテーブルを作成して、データを登録しておきました。
CREATE TABLE test (id int, name varchar(100))
INSERT INTO test VALUES (1, 'テスト1')
INSERT INTO test VALUES (2, 'テスト2')
INSERT INTO test VALUES (3, 'テスト3')
「query('sql')」で検索実行。
「fetchall()」で、一括で検索結果が取得できます。
PDOStatement::fetchAll
サンプルはこんな感じです。
query('SELECT * FROM test');
$rs = $stmt->fetchAll();
foreach ($rs as $row) {
echo $row['id'];
echo ':';
echo $row['name'];
echo '
';
}
// 切断
unset($db);
データが大量にあるときは、「fetch」を使って1行づつデータを取得すれば良さそうです。
PDOStatement::fetch
fethで書き換えたプログラムはこんな感じになりました。
query('SELECT * FROM test');
while($row = $stmt->fetch()) {
echo $row['id'];
echo ':';
echo $row['name'];
echo '
';
}
// 切断
unset($db);
名前付きパラメータを使用した検索
プリペアドステートメントを使用して、検索条件を指定しての検索を行なってみます。
PDO::prepare
idが2の列を検索してみます。
prepare('SELECT * FROM test WHERE id = :id');
$stmt->execute(array(':id' => 2));
$rs = $stmt->fetchAll();
foreach($rs as $row) {
echo $row['id'];
echo ':';
echo $row['name'];
echo '
';
}
// 切断
unset($db);
データの追加、更新
データの更新は「exec('sql')」で行います。
PDO::exec
追加、更新のサンプルはこんな感じになりました。
exec("INSERT INTO test (id, name) VALUES (4, 'テスト4')");
// データの更新
$db->exec("UPDATE test SET name = 'テスト2更新' WHERE id = 2");
// 切断
unset($db);
ちゃんと追加、更新されてます。
314_01.png
更新した行の検索結果が最後に表示されるのがPostgreSQLらしいなーと思いました。
名前付きパラメータを使用した追加、更新
検索と同じく、prepareでクエリを準備。
executeでパラメーターを指定しつつ、クエリを実行します。
prepare("INSERT INTO test (id, name) VALUES (:id, :name)");
$st->execute(array(':id' => 5, ':name' => 'テスト5'));
// データの更新
$st = $db->prepare("UPDATE test SET name = :name WHERE id = :id");
$st->execute(array(':id' => 2, ':name' => 'テスト2再更新'));
// 切断
unset($db);
想定通りの結果になりました。
314_02.png