■データベースサーバへの接続とデータベースの選択
データベースサーバ(ホスト)への接続には、pg_connect()関数を使用します。同時に、使用するデータベースとユーザ名およびパスワードも指定します。ポート番号は'5432'とします。
接続リソース = pg_connect('host=データベースサーバ名 port=5432
dbname=データベース名 user=ユーザ名
password=パスワード')
ここでは、データベースサーバ名は'localhost'、データベース名は'db_hanbai'、ユーザ名は、4.1で作成したWebアプリケーション用ユーザ'webapl'とします。パスワードはwebapl用のパスワードです。
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_hanbai";
// Webアプリケーションユーザ名の設定
$user = "webapl";
// Webアプリケーションユーザパスワードの設定
$secure = "pass1234";
$str_connection = "host={$hostname} port=5432 dbname={$dbname}"
. "user={$user} password={$secure}";
// データベースに接続できなかった場合
if(!$db = pg_connect($str_connection))
{
print "Error: failed to connect to {$dbname}.<br>\n";
exit;
}
// データベースに接続できた場合
■SQL文の実行
接続したデータベースに対してSQL文を実行するには、pg_query()関数を使用します。
結果リソース = pg_query(接続リソース, SQL文)
ここでは、tbl_商品表テーブルからすべてのフィールドとすべてのレコードを表示するSQL文を実行します。
$str_sql = "select * from tbl_商品表";
$rs = pg_query($db,$str_sql);
戻り値には、SQL文の処理結果が格納されます。これを「結果リソース」あるいは「結果セット」と呼びます。
■レコードの読み取り
結果セットには現在のレコードを示すポインタがあります。最初は結果セットの第1レコードを示しています。現在のレコードのデータをフィールド名をキー値とする連想配列で読み出すには、pg_fetch_assoc()関数を使います。while文と組み合わせることにより、結果セット内のレコードを順次読み出すことができます。
while(pg_fetch_assoc(結果リソース))
{
各レコードごとの処理
}
各レコードごとに、フィールド名とその値を表示するソースコードの例を以下に示します。
while($arr_record= pg_fetch_assoc($rs))
{
foreach($arr_record as $field_name => $value)
{
print "[{$field_name}] = {$value}<br>\n";
}
print "<br>\n";
}
■データベースサーバへの接続の切断
データベースに対する処理がすべて終わったら、データベースサーバへの接続を切断します。
pg_close(接続リソース)
pg_close($db);
■データベースの一覧表示
接続したデータベースサーバ内にある利用可能なデータベースの一覧表示を行うこととします。MySQLには、mysql_list_dbs()関数というデータベースの一覧を取得する関数が用意されていますが、PostgreSQLにはありません。そこで、PostgreSQLのシステムカタログからデータベースの一覧用データを取得することとし、そのために、次のようなユーザ定義関数pg_list_dbs()を作成します。
function pg_list_dbs($db)
{
assert(is_resource($db));
$str_sql = 'select
d.datname as "名前",
u.usename as "所有者",
pg_encoding_to_char(d.encoding)
as "エンコーディング"
from pg_database d left join pg_user u
on d.datdba = u.usesysid
order by 1;
';
return pg_query($db,$str_sql);
}
このユーザ定義関数pg_list_dbs()を利用して、データベースの一覧表示を行うユーザ定義関数show_databases()を定義します。
サンプルファイル「show_databases.php」を以下に示します。
「show_databases.php」
<html>
<head>
<title>show_databases.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_hanbai";
// Webアプリケーションユーザ名の設定
$user = "webapl";
// Webアプリケーションユーザパスワードの設定
$secure = "pass1234";
$str_connection = "host={$hostname} port=5432 "
." dbname={$dbname} user={$user} password={$secure}";
// データベースに接続できなかった場合
if(!$db = pg_connect($str_connection))
{
print "Error: failed to connect to {$dbname}.<br>\n";
exit;
}
// データベースに接続できた場合
// データベースの一覧表示用ユーザ定義関数の呼び出し
show_databases($db);
// データベースの切断
pg_close($db);
// ----------------------------------------------
// データベースの一覧表示用ユーザ定義関数
function show_databases($db)
{
// データベース一覧表示用データを取得
$rs = pg_list_dbs($db);
print "データベースの一覧<br>\n";
print "<table border=1 cellspacing=0 cellpadding=0>";
print "<tr>\n";
print "<td>名前</td>\n";
print "<td>所有者</td>\n";
print "<td>エンコーディング</td>\n";
print "</tr>\n";
// 各レコードの読み取り
while($arr_record = pg_fetch_assoc($rs))
{
print "<tr>\n";
foreach($arr_record as $value)
{
print "<td>{$value}</td>\n";
}
print "</tr>\n";
}
print "</table>";
}
// ----------------------------------------------
//
function pg_list_dbs($db)
{
(略)
}
結果はたとえば、下記のようにデータベースの一覧が表示されます。

■テーブルの一覧表示
接続したデータベース内にあるテーブルの一覧表示を行うこととします。MySQLには、mysql_list_tables()関数というテーブルの一覧を取得する関数が用意されていますが、PostgreSQLにはありません。そこで、PostgreSQLのシステムカタログからテーブルの一覧用データを取得することとし、そのために、次のようなユーザ定義関数pg_list_tables()を作成します。
function pg_list_tables($db)
{
assert(is_resource($db));
$query = "SELECT c.relname as \"Name\",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
END as \"Type\",
u.usename as \"Owner\"
FROM pg_class c
LEFT JOIN pg_user u
ON c.relowner = u.usesysid
WHERE c.relkind IN('r','v','S','')
AND c.relname !~ '^pg_'
AND c.relnamespace = 2200
ORDER BY 1;
";
// SQL文の実行
return pg_query($db,$query);
}
このユーザ定義関数pg_list_tables()を利用して、テーブルの一覧表示を行うユーザ定義関数show_tables()を定義します。
サンプルファイル「show_tables.php」を以下に示します。
「show_tables.php」
<html>
<head>
<title>show_tables.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_hanbai";
// Webアプリケーションユーザ名の設定
$user = "webapl";
// Webアプリケーションユーザパスワードの設定
$secure = "pass1234";
$str_connection = "host={$hostname} port=5432 "
." dbname={$dbname} user={$user} password={$secure}";
// データベースに接続できなかった場合
if(!$db = pg_connect($str_connection))
{
print "Error: failed to connect to {$dbname}.<br>\n";
exit;
}
// データベースに接続できた場合
// テーブルの一覧表示
show_tables($db);
// データベースの切断
pg_close($db);
// ----------------------------------------------
// テーブルの一覧表示用ユーザ定義関数
function show_tables($db)
{
// データベース一覧表示用データを取得
$rs = pg_list_tables($db);
// レコード数の取得
$count = pg_num_rows($rs);
// レコードがある場合
if($count > 0)
{
print "【テーブル/ビューの一覧】<br>\n";
print "<table border=1 cellpadding=0 cellspacing=0>\n";
print "<tr>\n";
print "<td class=ac>名前</td>\n";
print "<td class=ac>型</td>\n";
print "<td class=ac>所有者</td>\n";
print "</tr>\n";
// 各レコードの読み取り
while($arr_record = pg_fetch_assoc($rs))
{
print "<tr>\n";
print "<td>{$arr_record['Name']}</td>\n";
print "<td>{$arr_record['Type']}</td>\n";
print "<td>{$arr_record['Owner']}</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
// レコードがない場合
else
{
print "テーブル/ビューはありません<br>\n";
}
}
// ----------------------------------------------
//
function pg_list_tables($db)
{
(略)
}
結果はたとえば、以下のようにテーブル一覧が表示されます。

■フィールド属性の一覧表示
テーブル内のフィールド属性の一覧を表示するには、pg_meta_data()関数を使います。
このpg_meta_data()関数を利用して、テーブルのフィールド属性の一覧表示を行うユーザ定義関数show_fields()を定義します。
サンプルファイル「show_fields.php」を以下に示します。
「show_fields.php」
<html>
<head>
<title>show_fields.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_hanbai";
// Webアプリケーションユーザ名の設定
$user = "webapl";
// Webアプリケーションユーザパスワードの設定
$secure = "pass1234";
$str_connection = "host={$hostname} port=5432 "
." dbname={$dbname} user={$user} password={$secure}";
// データベースに接続できなかった場合
if(!$db = pg_connect($str_connection))
{
print "Error: failed to connect to {$dbname}.<br>\n";
exit;
}
// データベースに接続できた場合
// フィールドの一覧表示
show_fields($db,'tbl_商品表');
// データベースの切断
pg_close($db);
// ----------------------------------------------
// テーブルの一覧表示用ユーザ定義関数
function show_fields($db,$table_name)
{
// データベース一覧表示用データを取得
$rs = pg_meta_data($db,$table_name);
print "【{$table_name}テーブルのフィールド一覧】<br>\n";
print "<table border=1 cellpadding=0 cellspacing=0>\n";
print "<tr>\n";
print "<td class=ac>番号</td>\n";
print "<td class=ac>名前</td>\n";
print "<td class=ac>型</td>\n";
print "<td class=ac>長さ</td>\n";
print "<td class=ac>値要求</td>\n";
print "<td class=ac>既定値</td>\n";
print "</tr>\n";
// 各フィールド属性の読み取り
foreach($rs as $key => $arr)
{
if($arr['not null'])
{
$not_null = 'yes';
}
else
{
$not_null = 'no';
}
if($arr['has default'])
{
$has_default = 'yes';
}
else
{
$has_default = 'no';
}
print "<tr>\n";
print "<td>{$arr['num']}</td>\n";
print "<td>{$key}</td>\n";
print "<td>{$arr['type']}</td>\n";
print "<td>{$arr['len']}</td>\n";
print "<td>{$not_null}</td>\n";
print "<td>{$has_default}</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
?>
</body>
</html>
結果はたとえば、以下のようにテーブルのフィールド属性の一覧が表示されます。

上記で作成した以下のユーザ定義関数をインクルードファイル「common_pgsql.php」に記述し、共用することとします。
db_connect()
show_databases()
show_fields()
show_tables()
pg_list_dbs()
pg_list_tables()
なお、データベースへの接続部分もユーザ定義関数db_connect()で処理することとします。
インクルードファイル「common_pgsql.php」を以下に示します。
「common_pgsql.php」
<?php
/*
PostgreSQL用共用関数
common_pgsql.php
2005-10-26 by T.YAMADA
*/
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_hanbai";
// Webアプリケーションユーザ名の設定
$user = "webapl";
// Webアプリケーションユーザパスワードの設定
$secure = "pass1234";
// ----------------------------------------------
//
function db_connect(&$dbname)
{
global $dbname;
global $user;
global $secure;
$str_connection = "port=5432 dbname={$dbname}
user={$user} password={$secure}";
$db = pg_connect($str_connection);
return $db;
}
// ----------------------------------------------
// データベース一覧データ取得用
function pg_list_dbs($db)
{
assert(is_resource($db));
$str_sql = 'select
d.datname as "名前",
u.usename as "所有者",
pg_encoding_to_char(d.encoding) as "エンコーディング"
from pg_database d left join pg_user u
on d.datdba = u.usesysid
order by 1;
';
return pg_query($db,$str_sql);
}
// ----------------------------------------------
// テーブル一覧データ取得用
function pg_list_tables($db)
{
assert(is_resource($db));
$query = "SELECT c.relname as \"Name\",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
END as \"Type\",
u.usename as \"Owner\"
FROM pg_class c LEFT JOIN pg_user u
ON c.relowner = u.usesysid
WHERE c.relkind IN('r','v','S','')
AND c.relname !~ '^pg_'
AND c.relnamespace = 2200
ORDER BY 1;
";
// SQL文の実行
return pg_query($db,$query);
}
// ----------------------------------------------
// データベースの一覧表示用
function show_databases($db)
{
// データベース一覧表示用データを取得
$rs = pg_list_dbs($db);
print "データベースの一覧<br>\n";
print "<table border=1 cellspacing=0 cellpadding=0>";
print "<tr>\n";
print "<td>名前</td>\n";
print "<td>所有者</td>\n";
print "<td>エンコーディング</td>\n";
print "</tr>\n";
while($arr_record = pg_fetch_assoc($rs))
{
print "<tr>\n";
foreach($arr_record as $value)
{
print "<td>{$value}</td>\n";
}
print "</tr>\n";
}
print "</table>";
}
// ----------------------------------------------
// テーブルのフィールド一覧表示用
function show_fields($db,$table_name)
{
// データベース一覧表示用データを取得
$rs = pg_meta_data($db,$table_name);
print "【{$table_name}テーブルのフィールド一覧】<br>\n";
print "<table border=1 cellpadding=0 cellspacing=0>\n";
print "<tr>\n";
print "<td class=ac>番号</td>\n";
print "<td class=ac>名前</td>\n";
print "<td class=ac>型</td>\n";
print "<td class=ac>長さ</td>\n";
print "<td class=ac>値要求</td>\n";
print "<td class=ac>既定値</td>\n";
print "</tr>\n";
// 各フィールド属性の読み取り
foreach($rs as $key => $arr)
{
if($arr['not null'])
{
$not_null = 'yes';
}
else
{
$not_null = 'no';
}
if($arr['has default'])
{
$has_default = 'yes';
}
else
{
$has_default = 'no';
}
print "<tr>\n";
print "<td>{$arr['num']}</td>\n";
print "<td>{$key}</td>\n";
print "<td>{$arr['type']}</td>\n";
print "<td>{$arr['len']}</td>\n";
print "<td>{$not_null}</td>\n";
print "<td>{$has_default}</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
// ----------------------------------------------
// テーブルの一覧表示用
function show_tables($db)
{
// データベース一覧表示用データを取得
$rs = pg_list_tables($db);
// レコード数の取得
$count = pg_num_rows($rs);
// レコードがある場合
if($count > 0)
{
print "【テーブル/ビューの一覧】<br>\n";
print "<table border=1 cellpadding=0 cellspacing=0>\n";
print "<tr>\n";
print "<td class=ac>名前</td>\n";
print "<td class=ac>型</td>\n";
print "<td class=ac>所有者</td>\n";
print "</tr>\n";
// 各レコードの読み取り
while($arr_record = pg_fetch_array($rs))
{
print "<tr>\n";
print "<td>{$arr_record['Name']}</td>\n";
print "<td>{$arr_record['Type']}</td>\n";
print "<td>{$arr_record['Owner']}</td>\n";
print "</tr>\n";
}
print "</table>\n";
}
// レコードがない場合
else
{
print "テーブル/ビューはありません<br>\n";
}
}
?>
先の、テーブル一覧表示のサンプルプログラムをインクルードファイル「common_pgsql.php」を用いて書き換えたサンプルファイル「show_tables2.php」を以下に示す。インクルードファイルを使うことにより、プログラムが非常にすっきりする。
「show_tables2.php」
<html>
<head>
<title>show_tables2.php for PostgreSQL8.2</title>
</head>
<body>
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
// データベースに接続できなかった場合
if(!$db = db_connect($dbname))
{
print "Error: failed to connect to {$dbname}.<br>\n";
exit;
}
// データベースに接続できた場合
// テーブルの一覧表示
show_tables($db);
$rs = pg_list_tables($db);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルプログラム「show_tables2.php」にアクセスした結果を下記に示します。正常に動作していることが確認できます。

|