6.7 レコードの参照
■テーブルの全データの取得
テーブルに格納されているレコードのデータを取得するにはSQL文の「SELECT」文を使います。レコードデータを取得することをレコードの読み取りあるいはレコードの参照ともいいます。
テーブルのすべてのレコードのすべてのフィールドのデータを参照する場合は、以下のSELECT文を使います。「*」はワイルドカードといい、ここでは「すべてのフィールド」を意味します。
SELECT * FROM テーブル名;
サンプルファイル「select01.php」を以下に示します。
「select01.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select01.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// SQL文が正常に実行できなかった場合
if(!pg_result_status($rs) == PGSQL_TUPLES_OK)------@
{
print "Error: SQL文が正常に実行できませんでした。<bt>\n";
exit;
}
// SQL文が正常に実行できた場合
// SQL文の表示
print "SQL = \"" . $str_sql . "\"<br><br>\n";
// レコード数の取得
$count = pg_num_rows($rs);----------------------------A
// レコードがある場合
if($count > 0)------------------------------------------B
{
// 各レコードのデータを順次配列に格納
while($arr_record = pg_fetch_assoc($rs))-----------C
{
// 各フィールドのフィールド名とフィールド値の表示
foreach($arr_record as $field_name =>
$value)----D
{
print "[{$field_name}]={$value}<br>\n";---------E
}
print "<br>\n";
}
}
// レコードがない場合
else
{
print "Error: テーブル{$tbl_name}にレコードはありません。<bt>\n";
}
// データベースの切断
pg_close($db);
?>
</body>
</html>
@ SQL文が正常に実行できたかいなかを判定しています。
A、B テーブルにデータが書き込まれていない場合、レコード数は0になります。その場合は、その後のCで、$arr_recordが配列でなくなり空になるため、while文を実行するとエラーになります。それを防止するために、レコード数が1以上かいなかを判定しています。
C 結果リソース$rsから、1レコード分のデータを連想配列に格納します。連想配列のキー値は、フィールド名で、値はフィールド値になります。
D 連想配列から、キー値を$field_nameに、値を$valueに格納しています。
E フィールド名$field_nameとフィールド値$valueを表示します。
サンプルファイルへのアクセス例を下記に示します。

■エラー処理
ていねいなソースプログラムとしては、上記@〜Bのエラー処理を実施すべきですが、ここでは簡略化のために、以後割愛することとします。エラー処理を割愛した場合のソースプログラム「select02.php」を以下に示します。
「select02.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select01.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// SQL文の表示
print "SQL = \"" . $str_sql . "\"<br><br>\n";
// 各レコードのデータを順次配列に格納
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($db);
?>
</body>
</html>
■レコードの参照結果の表形式での表示
レコードの参照結果を一般的な表形式で表示する方法について示します。
テーブルタグ「<table>を使って、各レコードのフィールドデータを1行づつ表のセルに入れながら表示していきます。
サンプルファイル「select03.php」を以下に示します。
「select03.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select03.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// SQL文の表示
print "SQL = \"" . $str_sql . "\"<br><br>\n";
// 表の表示開始
print "<table border=1 celpadding=0
cellspacing=0>\n";
// 結果セットの各レコードを順次、連想記憶に格納する
while($arr_record = pg_fetch_assoc($rs))
{
// 行の表示の開始
print "<tr>\n";
foreach($arr_record as $field_name => $field_value)
{
// フィールド値をセル内に表示
print "<td>{$field_value}</td>\n"
;
}
// 行の表示の終わり
print "</tr>\n";
}
// 表の表示の終了
print "</tabale>\n";
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

■テーブルのヘッダー部の表示
上記の例では、テーブルのヘッダー部にフィールド名が表示されていません。以下に、表のヘッダー部にあらかじめフィールド名を表示する方法を示します。
MySQLには、mysql_list_fields()関数というテーブルのフィールド名一覧を取得する関数が用意されていますが、PostgreSQLにはありません。そこで、PostgreSQLのシステムカタログからテーブルのフィールド名を取得し配列を生成することとし、そのために、次のようなユーザ定義関数arr_fields_name()を作成します。この関数はインクルードファイルcommon_pgsql.phpに追加することとします。
function arr_fields_name($db,$tbl_name)
{
// テーブルのメタデータ取得
$arr_field = pg_meta_data($db,$tbl_name);
// テーブルのフィールド名の配列生成
return array_keys($arr_field);
}
ユーザ定義関数arr_fields_name()を使って、テーブルのヘッダーにフィールド名を表示するサンプルファイル「select04.php」を以下に示します。
「select04.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select04.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// SQL文の表示
print "SQL = \"" . $str_sql . "\"<br><br>\n";
$arr_field_name = arr_fields_name($db,$tbl_name);
// 表のヘッダー部表示
print "<table border=1 celpadding=0
cellspacing=0>\n";
print "<tr>\n";
foreach($arr_field_name as $field_name)
{
print "<td>{$field_name}</td>\n";
}
print "</tr>\n";
// 結果セットの各レコードを順次、連想記憶に格納する
while($arr_record = pg_fetch_assoc($rs))
{
// 行の表示の開始
print "<tr>\n";
foreach($arr_record as $field_value)
{
// フィールド値をセル内に表示
print "<td>{$field_value}</td>\n" ;
}
// 行の表示の終わり
print "</tr>\n";
}
// 表の表示の終了
print "</table>\n";
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

■テーブルの全レコード表示用ユーザ定義関数「show_records()」
テーブルの全レコード表示はテーブルデータの確認用によく使うので、ユーザ定義関数 show_records()として定義しておくこととします。この関数はインクルードファイルcommon_pgsql.phpに追加することとします。
function show_records($db,$tbl_name)
{
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// フィールド名配列の取得
$arr_field_name = arr_fields_name($db,$tbl_name);
// 表のヘッダー部表示
print "<table border=1 celpadding=0 cellspacing=0>\n";
print "<tr>\n";
foreach($arr_field_name as $field_name)
{
print "<td>{$field_name}</td>\n";
}
print "</tr>\n";
// 結果セットの各レコードを順次、連想配列に格納する
while($arr_record = pg_fetch_assoc($rs))
{
// 行の表示の開始
print "<tr>\n";
foreach($arr_record as $field_value)
{
// フィールド値をセル内に表示
print "<td>{$field_value}</td>\n" ;
}
// 行の表示の終わり
print "</tr>\n";
}
// 表の表示の終了
print "</table>\n";
return;
}
テーブルの全レコード表示用ユーザ定義関数show_records()を使用したサンプルファイル「select05.php」を以下に示します。
「select05.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select05.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
print "「{$tbl_name}」<br>\n";
// 全レコードの一覧表示
show_records($db,$tbl_name);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

■結果リソースの全レコード表示用ユーザ定義関数「show_rs()」
結果リソースの全レコード表示関数をテーブルの全レコード表示関数 show_records()と同様に、ユーザ定義関数show_rs()
として定義しておくこととします。そのために、結果リソースのフィールド名配列を取得するユーザ定義関数arr_fields_name_rs()も作成します。これらの関数はインクルードファイルcommon_pgsql.phpに追加することとします。
function show_rs($rs)
{
// フィールド名配列の取得
$arr_field_name = arr_fields_name_rs($rs);
// 表のヘッダー部表示
print "<table border=1 celpadding=0 cellspacing=0>\n";
print "<tr>\n";
foreach($arr_field_name as $field_name)
{
print "<td>{$field_name}</td>\n";
}
print "</tr>\n";
// 結果セットの各レコードを順次、連想配列に格納する
while($arr_record = pg_fetch_assoc($rs))
{
// 行の表示の開始
print "<tr>\n";
foreach($arr_record as $field_value)
{
// フィールド値をセル内に表示
print "<td>{$field_value}</td>\n" ;
}
// 行の表示の終わり
print "</tr>\n";
}
// 表の表示の終了
print "</table>\n";
return;
}
function arr_fields_name_rs($rs)
{
// 結果リソースの最初のレコードを連想配列に取得
$arr_record = pg_fetch_assoc($rs);
// 結果リソースのポインタを最初に戻す
pg_result_seek($rs,0);
// フィールドがある場合
if(is_array($arr_record))
{
// フィールド名の配列を生成
$arr_field_name = array_keys($arr_record);
}
else
{
$arr_field_name = FALSE;
}
return $arr_field_name;
}
テーブルの全レコード表示用ユーザ定義関数「show_rs()」を使用したサンプルファイル「select06.php」を以下に示します。
「select06.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select06.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// SQL文の設定
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
print "「{$tbl_name}」<br>\n";
// 結果リソースの全レコードの一覧表示
show_rs($rs);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

■テーブルの一部のデータを表示
すべてのレコードの指定したフィールド名のみを参照したい場合は、以下のSELECT文を使います。
SELECT フィールド名1, フィールド名2,・・・,フィールド名n FROM テーブル名;
特定の条件を満たすレコードのすべてのフィールドを参照する場合は、SELECT文に条件を記述するWHERE句を付加します。
SELECT * FROM テーブル名 WHERE 条件式;
特定の条件を満たすレコードの指定のフィールドを参照する場合は、以下のようなSELECT文を使います。
SELECT フィールド名1, フィールド名2,・・・,フィールド名n
FROM テーブル名
WHERE 条件式;
サンプルファイル「select07.php」を以下に示します。
「select07.php」
<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
<title>select07.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 参照するテーブル名の設定
$tbl_name = "tbl_商品表";
// 全レコード、全フィールド表示用SQL文の作成
$str_sql = "SELECT * FROM {$tbl_name};";
// SQL文の実行
$rs = pg_query($db,$str_sql);
// 結果リソースの表示
print "SQL = \"" . $str_sql . "\"<br>\n";
show_rs($rs);
print "<br>\n";
// 結果セットの解放
pg_free_result($rs);
// 指定したフィールドのみを参照するSQL文の作成
$str_sql2 = "SELECT 商品名,単価 FROM {$tbl_name};";
// SQL文の実行
$rs2 = pg_query($db,$str_sql2);
// 結果リソースの表示
print "SQL = \"{$str_sql2}\"<br>\n";
show_rs($rs2);
print "<br>\n";
// 結果セットの解放
pg_free_result($rs2);
// 条件にあったレコードのみを抽出するSQL文の作成
$str_sql3 = "SELECT * FROM {$tbl_name}"
. " WHERE 商品コード = '1002'";
// SQL文の実行
$rs3 = pg_query($db,$str_sql3);
// 結果リソースの表示
print "SQL = \"{$str_sql3}\"<br>\n";
show_rs($rs3);
print "<br>\n";
// 結果セットの解放
pg_free_result($rs3);
// 条件にあったレコードの指定のフィールド名みを抽出するSQL文の作成
$str_sql4 = "SELECT 商品名,単価 FROM {$tbl_name}"
. " WHERE 商品名 = '海の幸御膳'";
// SQL文の実行
$rs4 = pg_query($db,$str_sql4);
// 結果セットの表示
print "SQL = \"{$str_sql4}\"<br>\n";
show_rs($rs4);
print "<br>\n";
// 結果セットの解放
pg_free_result($rs4);
// データベースの切断
pg_close($db);
?>
</body>
</html>
サンプルファイルへのアクセス例を下記に示します。

|