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