トップ  »  コンピュータガイド  »  開発言語・スクリプト  »  PHP  »  PostgreSQLのデータを取得してHTML表示する(後編)

PostgreSQLのデータを取得してHTML表示する(後編)

実際の記述

では実際にPHPのPostgreSQL関数を使ってデータを参照してみましょう。
PostgreSQL関数によるデータの取得は、SQL文で指定した全てのデータをまとめて所得する方法(pg_fetch_all())と結果の行及びフィールド(カラム)を指定して取得する方法(pg_fetch_result())、結果を1行づつ所得する方法(pg_fetch_row())の3つが基本となります。
この3つ以外にもデータを取得する関数として"pg_fetch_assoc()"や"pg_fetch_object()"なども有りますが、まずは基本としてこの3つは押さえておきましょう。

以下は、PostgreSQLのシステムテーブルからデータベース名の一覧などを取得する例ですが、SQL文を置き換えればその他のテーブルからのデータ取得に応用できるはずです。
変数名も任意ですから、PHPの定義済の変数とバッティング等しなければ変更可能です。

見てお解りの通り、下記ソースはPHPのスクリプト部分だけですので実際にHTML出力する為には下記スクリプトの前後にHTMLタグの追記が必要です。
また、概要でも申し上げたとおり、データ参照の基本的な解説ですので実際の業務レベルで使用するにはエラー制御やエンコード、データ型に対する処理や表示に関する処理など色々しなくてはいけない事があります。
あくまで基礎である事をご理解の上、ご参照ください。

"pg_fetch_all()"によるデータ取得

"pg_fetch_all()"は結果をまとめて多次元配列にして返しますので、HTMLとして画面表示させるには取得した配列を展開しつつHTMLタグを付与するなどして出力する事になります。
以下の例では結果をHTMLテーブルとして出力するようにしています。

接続先ホスト名やユーザ名、パスワード等は実際の環境に合わせて変更してください。

<?php
  /* ### "pg_fetch_all()"によるデータ取得 ### */

  //pg_connect()に渡すパラメータの指定
  $constr = "host=localhost port=5432 dbname=template1 user=pguser password=passwd";

  //DBに接続
  $conn = pg_connect($constr);

  //SQLの実行
  $result = pg_query($conn, "SELECT * FROM pg_database ORDER BY datname");

  //データの取得
  $arr = pg_fetch_all($result);

  print "<table id=\"dblist\" summary=\"PostgreSQLのデータベースの一覧\">\n";
  print "<caption>PostgreSQL データベース一覧</caption>\n";

  //テーブルヘッダとしてフィールド(カラム)名を出力
  print "<tr>\n";
  $flds = pg_num_fields($result);
  for($i=0; $i<$flds; $i++){
    $field = pg_field_name($result, $i);
    printf("<th abbr=\"%s\">%s</th>\n", $field, $field);
  }
  print "</tr>\n";

  //データの出力
  foreach($arr as $rows){
    print "<tr>\n";
    foreach($rows as $value){
      printf("<td>%s</td>\n", $value);
    }
    print "</tr>\n";
  }

  print "</table>\n";

  //DBとの接続を閉じる
  pg_close($conn);
?>

"pg_fetch_result()"によるデータ取得

"pg_fetch_result()"は結果から行とフィールド(カラム)を指定して取得します。
つまり、データを狙い撃ちで取得する事になりますので、取得したい結果が特定できる場合などに有効です。
例えば、SQL文を「select count (*) from 〜」などとした場合、結果は1行、1フィールド(カラム)のはずです。
この様な場合、"pg_fetch_result()"を使えば、わざわざループ(繰り返し処理)させてデータを取得する必要は無いでしょう。
勿論、「select * from 〜」など取得する行数やフィールド(カラム)数が特定できない場合でも、"pg_num_fields()"や"pg_num_rows()"と組み合わせる事によって結果行数分、結果フィールド(カラム)分のループを回し、フィールド(カラム)を指定しながら取得する事も可能です。
まあ、百聞は一見に如かず、以下にその両方の例を示します。

まずは結果が「1行、1フィールド(カラム)」の場合です。
行番号もフィールド(カラム)番号も0(ゼロ)から始まりますので、この場合1行目の1フィールド(カラム)目を指定する為のパラメータはどちらも"0"(ゼロ)を渡してあげればOKです。
また、結果が「複数行、複数フィールド(カラム)」の場合でも取得するデータを特定出来るのであれば、その行番号とフィールド(カラム)番号を指定してあげれば良いのです。
例えば、必要なデータが3行目の2フィールド(カラム)目のデータであるなら、「pg_fetch_result($result, 2, 1)」といった感じで取得できるという事です。

<?php
  /* ### "pg_fetch_result()"によるデータ取得 ################ */
  /* ### 取得する結果が「1行、1フィールド(カラム)」の例 ### */

  //pg_connect()に渡すパラメータの指定
  $constr = "host=localhost port=5432 dbname=template1 user=pguser password=passwd";

  //DBに接続
  $conn = pg_connect($constr);

  //SQLの実行
  $result = pg_query($conn, "SELECT count(*) FROM pg_database");

  //データの取得
  $dbs = pg_fetch_result($result, 0, 0);

  //データの出力
  print "<p>作成済みのデータベースの数は「<strong>" . $dbs . "</strong>」です。</p>\n";

  //DBとの接続を閉じる
  pg_close($conn);
?>

続いて取得する結果が「複数行、複数フィールド(カラム)」の場合ですが、こちらも行番号とフィールド(カラム)番号を指定してデータ取得する事には変わりありません。
ただ、ループ(繰り返し処理)を利用する事でパラメータが可変になっているだけの事です。

<?php
  /* ### "pg_fetch_result()"によるデータ取得 ###################### */
  /* ### 取得する結果が「複数行、複数フィールド(カラム)」の例 ### */

  //pg_connect()に渡すパラメータの指定
  $constr = "host=localhost port=5432 dbname=template1 user=pguser password=passwd";

  //DBに接続
  $conn = pg_connect($constr);

  //SQLの実行
  $result = pg_query($conn, "SELECT * FROM pg_database ORDER BY datname");

  print "<table id=\"dblist\" summary=\"PostgreSQLのデータベースの一覧\">\n";
  print "<caption>PostgreSQL データベース一覧</caption>\n";

  //テーブルヘッダとしてフィールド(カラム)名を出力
  print "<tr>\n";
  $flds = pg_num_fields($result);
  for($i=0; $i<$flds; $i++){
    $field = pg_field_name($result, $i);
    printf("<th abbr=\"%s\">%s</th>\n", $field, $field);
  }
  print "</tr>\n";

  //データの出力
  $rows = pg_num_rows($result);
  for($i=0; $i<$rows; $i++){  //結果行数分のループ
    print "<tr>\n";
    for($j=0; $j<$flds; $j++){  //結果フィールド(カラム)数分のループ
      $value = pg_fetch_result($result, $i, $j);
      print "<td>" . $value . "</td>\n";
    }
    print "</tr>\n";
  }

  print "</table>\n";

  //DBとの接続を閉じる
  pg_close($conn);
?>

"pg_fetch_row()"によるデータ取得

"pg_fetch_row()"は結果を1行づつ配列にして返しますので、while文などを使って結果行数分のループを回しながら1行づつ取得し、取得した1行分の配列を展開しながらHTMLタグを付与するなどして出力する事になります。

<?php
  /* ### "pg_fetch_row()"によるデータ取得 ### */

  //pg_connect()に渡すパラメータの指定
  $constr = "host=localhost port=5432 dbname=template1 user=pguser password=passwd";

  //DBに接続
  $conn = pg_connect($constr);

  //SQLの実行
  $result = pg_query($conn, "SELECT * FROM pg_database ORDER BY datname");

  print "<table id=\"dblist\" summary=\"PostgreSQLのデータベースの一覧\">\n";
  print "<caption>PostgreSQL データベース一覧</caption>\n";

  //テーブルヘッダとしてフィールド(カラム)名を出力
  print "<tr>\n";
  $flds = pg_num_fields($result);
  for($i=0; $i<$flds; $i++){
    $field = pg_field_name($result, $i);
    printf("<th abbr=\"%s\">%s</th>\n", $field, $field);
  }
  print "</tr>\n";

  //データの出力
  while($rows=pg_fetch_row($result)){  //結果を1行づつ取得しながら終端までループ
    print "<tr>\n";
    foreach($rows as $value){  //結果フィールド(カラム)数分のループ
      print "<td>" . $value . "</td>\n";
    }
    print "</tr>\n";
  }

  print "</table>\n";

  //DBとの接続を閉じる
  pg_close($conn);
?>

トラックバック(0)

トラックバックURL: http://www.ezms.net/mt/mt-tb.cgi/30