Windows+Apache+PHP+PostgreSQLによるWebアプリケーション
−入門編−

第6章 PostgreSQLによるWebアプリケーションの基礎

前へ | 目次へ |次へ  | YCポータルサイト

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>

 サンプルファイルへのアクセス例を下記に示します。

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2005年10月28日