PHP Postgres DBアクセス

●接続

<?php
// ネイティブ
$db = pg_connect('host=hoge port=5432 dbname=hoge user=hoge password=hoge');

// PDO
$db = new PDO('pgsql:host=localhost;port=5432;dbname=hoge;user=hoge;password=hoge');

//※こっちでもよい?
$db = new PDO('pgsql:host=localhost;port=5432;dbname=hoge', 'hoge', 'hoge');

●文字列連結によるSQLの組み立て エスケープ・クオート

<?php
// ネイティブ
// クオートはしない
$sql = "SELECT * FROM hoge WHERE id = '". pg_escape_string($hoge_id)."'";
// クオートもするみたい (バージョン情報なし。おそらく SVN 版にしか存在しないでしょう)
$sql = 'SELECT * FROM hoge WHERE id = '. pg_escape_literal($hoge_id);

// PDO
$sql = 'SELECT * FROM hoge WHERE id = '. $db->quote($hoge_id);

SQL実行

<?php
// ネイティブ
$rs = pg_query($db, $sql);

// PDO
$sth = $db->query($sql);

●プリペアードクエリの実行

<?php
// ネイティブ
$sql = 'SELECT * FROM hoge WHERE id = $1';
$rs = pg_prepare($db, 'query1', $sql);
$rs = pg_execute($db, 'query1', array($hoge_id));

// PDO
$sql = 'SELECT * FROM hoge WHERE id = ?';
$sth = $db->prepare($sql);
$sth->execute(array($hoge_id));


// PDO プレースホルダに疑問符でなく名前 名前=>値の連祖配列を execute に渡す
$sql = 'SELECT * FROM hoge WHERE id = :id';
$sth = $db->prepare($sql);
$sth->execute(array(':id' => $hoge_id));


// PDO 名前付きパラメータ bindParam 使用
$sql = 'SELECT * FROM hoge WHERE id = :id';
$sth = $db->prepare($sql);
$sth->bindParam(':id', $hoge_id, PDO::PARAM_INT);
$sth->execute();


PDO::prepare
PDOStatement::execute
PDOStatement::bindParam
PDO 定義済み定数

●結果行を取得

<?php
// ネイティブ
while($row = pg_fetch_assoc($rs)){
  print_r($row);
}

// PDO
while($row = $sth->fetch(PDO::FETCH_ASSOC)){
  print_r($row);
}

●結果行すべてを配列として取得

<?php
// ネイティブ
$rows = pg_fetch_all($rs);

// PDO
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);

●切断

<?php
// ネイティブ ※1
pg_close($db);

// PDO ※2
$db = null;


※1「持続的でない接続はスクリプトの実行終了時に自動的にクローズされるため、 pg_close() は通常は必要ありません。」
※2 「明示的にこれを行わなかった場合は、スクリプトの終了時に自動的に 接続が閉じられます。」


トランザクション

<?php
// ネイティブ
pg_query($db, 'BEGIN');
pg_query($db, 'ROLLBACK');
pg_query($db, 'COMMIT');

// PDO
$db->beginTransaction();
$db->rollback();
$db->commit();




PDOリンク
接続、および接続の管理
トランザクションおよび自動コミット
プリペアドステートメントおよびストアドプロシージャ
エラーおよびエラー処理