とりあえずの備忘録

主にパソコンやインターネットに関するメモ

PHP データベースPostgreSQLを扱う

Linux(CentOS5)にデータベースPostgreSQLをインストールして、PHP側から操作できるようにしたときのメモです。

PHPからPostgreSQLを操作するための準備

モジュール「pgsql.so」を組み込む

「pgsql.so」をインストールする

# yum install php-pgsql

「pgsql.so」の場所を確認する

# find / -name pgsql.so
/usr/lib/php/modules/pgsql.so

php.iniにモジュール「pgsql.so」を設定する

# vi /etc/php.ini

;パス
extension_dir="/usr/lib/php/modules"
↓追加する
extension=pgsql.so

もしパスの場所が違うなら、php.iniで設定してあるパスへ「pgsql.so」を移動する。

PostgreSQLへ接続するときの認証の方法を設定する

暗号化無しパスワード認証で接続出来るようにする場合、"local all all ident sameuser"を"local all all password"に変更する。

# su - postgres
$ vi /var/lib/pgsql/data/pg_hba.conf

↓編集する
# "local" is for Unix domain socket connections only
#local all all ident sameuser
local all all password

無条件で接続を許可する場合は、"local all all trust"とする。

PostgreSQLに接続

テスト用のテーブルを作成する

会員ID(customer_id)、会員名(customers_name)、入会日(entry_date)のフィールドを持ち、会員IDを主キーとするcustomersテーブルを作成する。

create table customers (
  customers_id integer,
  customers_name varchar(64) not null,
  entry_date timestamp DEFAULT now() not null,
  primary key(customers_id)
);

作成したテーブルに3件のテスト用データを挿入する。

insert into customers values ('1','yamada',now());
insert into customers values ('2','sato',now());
insert into customers values ('3','suzuki',now());

データを確認する。

testdb => select * from customers;
customers_id customers_name entry_date
1 yamada 2009-02-20 16:33:08.339802
2 sato 2009-02-21 16:33:08.346658
3 suzuki 2009-02-22 16:33:08.350654

PHPからPostgreSQLに接続する

<?php
//データベース設定
define("DB_HOST", "localhost");
define("DB_PORT", "5432");
define("DB_DBNAME", "testdb");
define("DB_USER", "dbuser");
define("DB_PASSWORD", "dbpass");

//データベース接続情報
define("DB_CONNECT",
"host=" . DB_HOST .
" port=" . DB_PORT .
" dbname=" . DB_DBNAME .
" user=" . DB_USER .
" password=" . DB_PASSWORD);

//データベースに接続
$con = pg_connect(DB_CONNECT) or die('pg_connect is error');

//データベースを閉じる
pg_close($con);
?>

PostgreSQLからデータを取得

pg_fetch_array関数を使ってデータを取得する

<?php
//データベースへ接続
$con = pg_connect(DB_CONNECT) or die('pg_connect is error');

//SQL実行
$sql = "select * from customers";
$rs = pg_query($con, $sql) or die('pg_query is error');

//データ取得
while ($row = pg_fetch_array($rs)) {
  foreach($row as $key => $value) {
    echo "row['" . $key . "']=" . $value . "<br />";
  }
}

//データベースを閉じる
pg_close($con);
?>

「出力結果」

row['0']=1
row['customers_id']=1
row['1']=yamada
row['customers_name']=yamada
row['2']=2009-02-20 16:33:08.339802
row['entry_date']=2009-02-20 16:33:08.339802
row['0']=2
row['customers_id']=2
row['1']=sato
row['customers_name']=sato
row['2']=2009-02-21 16:33:08.346658
row['entry_date']=2009-02-21 16:33:08.346658
row['0']=3
row['customers_id']=3
row['1']=suzuki
row['customers_name']=suzuki
row['2']=2009-02-22 16:33:08.350654
row['entry_date']=2009-02-22 16:33:08.350654

pg_fetch_array関数を使うと、数値添字の配列と連想配列の両方でデータを返す。

pg_fetch_row関数を使ってデータを取得する。

データ取得の処理以外は上記のスクリプトと一緒なので省略。

<?php
//データ取得
while ($row = pg_fetch_row($rs)) {
  foreach($row as $key => $value) {
    echo "row['" . $key . "']=" . $value . "<br />";
  }
 }
?>

「出力結果」

row['0']=1
row['1']=yamada
row['2']=2009-02-20 16:33:08.339802
row['0']=2
row['1']=sato
row['2']=2009-02-21 16:33:08.346658
row['0']=3
row['1']=suzuki
row['2']=2009-02-22 16:33:08.350654

pg_fetch_row関数を使うと、数値添字の配列としてデータを返す。
pg_fetch_array($rs, NULL, PGSQL_NUM)としても同じ処理になる。

pg_fetch_assoc関数を使ってPostgreSQLからデータを取得する

データ取得の処理以外は上記のスクリプトと一緒なので省略。

<?php
//データ取得
while ($row = pg_fetch_assoc($rs)) {
  foreach($row as $key => $value) {
    echo "row['" . $key . "']=" . $value . "<br />";
  }
}
?>

「出力結果」

row['customers_id']=1
row['customers_name']=yamada
row['entry_date']=2009-02-20 16:33:08.339802
row['customers_id']=2
row['customers_name']=sato
row['entry_date']=2009-02-21 16:33:08.346658
row['customers_id']=3
row['customers_name']=suzuki
row['entry_date']=2009-02-22 16:33:08.350654

pg_fetch_assoc関数を使うと、連想配列としてデータを返す。
pg_fetch_array($rs, NULL, PGSQL_ASSOC)としても同じ処理になる。

PostgreSQLから行やフィールドを指定してデータを取得

PostgreSQLから取得したデータの行数を取得する

<?php
$con = pg_connect(DB_CONNECT) or die('pg_connect is error');
$sql = "select * from customers";
$rs = pg_query($con, $sql) or die('pg_query is error');

//データの行数を取得
$row_sum = pg_num_rows($rs);
echo 'row_sum=' . $row_sum . '<br />';

pg_close($con);
?>

「出力結果」

row_sum=3

PostgreSQLから取得したデータのフィールド情報を取得する

<?php
$con = pg_connect(DB_CONNECT) or die('pg_connect is error');
$sql = "select * from customers";
$rs = pg_query($con, $sql) or die('pg_query is error');

//フィールド数を取得
$field_sum = pg_num_fields($rs);
echo 'field_sum=' . $field_sum . '<br />';

//フィールド名を取得
for ($i=0; $i<$field_sum; $i++) {
  echo pg_field_name($rs, $i) . ', ';
}
echo '<br />';

pg_close($con);
?>

「出力結果」

field_sum=3
customers_id, customers_name, entry_date,

PostgreSQLから行とフィールド位置を指定してデータを取得する

<?php
$con = pg_connect(DB_CONNECT) or die('pg_connect is error');
$sql = "select * from customers";
$rs = pg_query($con, $sql) or die('pg_query is error');

//行数とフィールド数を取得
$row_sum = pg_num_rows($rs);
$field_sum = pg_num_fields($rs);

//最初の行の最初のフィールドのデータを取得
echo pg_fetch_result($rs, 0, 0) . '<br />';

//最後の行の最後のフィールドのデータを取得
echo pg_fetch_result($rs, $row_sum-1, $field_sum-1) . '<br />';

pg_close($con);
?>

「出力結果」

1
2009-02-22 16:33:08.350654

行番号とフィールド番号は0から始まる。

改訂新版 PostgreSQL オフィシャルマニュアル

改訂新版 PostgreSQL オフィシャルマニュアル

  • 作者: PostgreSQL Global Development Group,日本PostgreSQLユーザー会
  • 出版社/メーカー: インプレス
  • 発売日: 2005/04/29
  • メディア: 単行本
  • 購入: 1人 クリック: 5回
  • この商品を含むブログ (6件) を見る