WindowsXP+Apache2.0+PHP5+PostgreSQL8.2によるWebアプリケーション
−入門編−

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

前へ | 目次へ |次へ  | Yamada-Lab

 

6.1 データベースにアクセスするための準備

 以下の作業は、第2章のpgADMINVを使ってGUIで行う方法と、第3章のpsqlを使ってラインコマンドで行う方法があります。PostgreSQLの機能、動作等を学習する観点から、後者のpsqlを使ってラインコマンドで行う方法で作業を進めていきます。

■psqlの起動

(1)psqlは、Windowsのエクスプローラからc:\Program Files\PostgreSQL\8.2\bin\psql.exeを選択し、起動します。

(2)詳細は、3.1 psqlの基本操作の項を参照してください。

■データベースの作成

(1)データベースはWebアプリケーションによりクライアント/サーバ形式で作成することもできますが、ここではpsqlによりローカルに作成することとします。

(2)データベースの作成には、psqlでSQLの「CREATE DATABASE」文(コマンド)を使用します。

(3)詳細は、3.2 データベースの操作の項を参照してください。

(4)以下、主にデータベース「db_test01」を使用します。

■テーブルの作成

(1)テーブルはWebアプリケーションによりクライアント/サーバ形式で作成することもできますが、ここではpsqlによりローカルに作成することとします。

(2)テーブルの作成には、psqlでSQLの「CREATE TABLE」文を使用します。

(3)詳細は、3.3 テーブルの操作の項を参照してください。

(4)以下、主にテーブル「tbl_test」および「tbl_試験」を使用します。

■データの入力

(1)テーブルへ具体的なデータを入力するにはWebアプリケーションによりクライアント/サーバ形式で行う方法と、psqlによりローカルで行う方法がありますが、ここでは、とりあえず後者でデータを入力済みとします。

(2)テーブルへデータを入力するには、psqlでSQLの「INSERT」文を使用します。

(3)詳細は、3.4 データの操作の項を参照してください。

■Webアプリケーション用ユーザの作成

 WebアプリケーションプログラムからPostgreSQLで作成したデータベースにアクセスできる権限を有するユーザを作成します。ここでは、そのユーザ名を「webapl」とします。PostgreSQLのスーパユーザpostgresは強力な権限を有していますので、Webアプリケーション用ユーザにも使うことは避けてください。

(1)ユーザの作成には、psqlでSQLの「CREATE USER」文を使用します。パスワードも一緒に設定する場合は以下の構文となります。

=# CREATE USER ユーザ名 WITH PASSWORD 'パスワード';

■Webアプリケーション用ユーザへの権限付与

 Webアプリケーションによりデータベースdb_test01にアクセスするユーザには、この後PHPプログラムにより「webapl」というユーザ名を使うことになります。データベース内のテーブル等にアクセス(参照、データ入力・更新・削除等)するためには、あらかじめアクセス種別ごとに権限を付与しておく必要があります。

 テーブル等へのアクセス権限を付与するにはSQLの「GRANT」文を使います。たとえば、テーブルにすべてのアクセス権限を付与する構文は以下のようになります。

=# GRANT ALL ON テーブル名 TO ユーザ名;

(1)Webアプリケーション用ユーザwebaplに、テーブルtbl_testに対するすべての権限を付与することとします。

(2)同様に、Webアプリケーション用ユーザwebaplに、テーブルtbl_試験に対するすべての権限も付与しておきます。

 

6.2 まずは、データベースにアクセス

 まずは、データベース「db_test01」にアクセスし、テーブル「tbl_test」の内容を表示してみましょう。

■テスト用プログラムの作成

 次のような内容のテスト用プログラム「test01.php」を作成します。

「test01.php」

<?php
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_test01";
// 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;
}

// データベースに接続できた場合
// テーブル名の設定
$tbl_name = "tbl_test";

// 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: could not execute SQL.<bt>\n";
 exit;
}

// SQL文ガ正常に実行できた場合
$arr_all = pg_fetch_all($rs);

// 配列変数のダンプ
var_dump($arr_all);

// データベースの切断
pg_close($db);

?>

 この「test01.php」ファイルをユーザ「test」のホームディレクトリである「c:\Apache2\users\test\public_html」のフォルダにサブフォルダ「pg]を作成して保存します。

■テスト用プログラムへのアクセス

 Apacheプログラムを起動します。

 ブラウザを開き、URLに「http://localhost:8080/~test/pg/test01.php」と記入しアクセスします。以下のようにデータベース「db_test01」の中のテーブル「tbl_test」のすべてのレコードのすべてのフィールド名がダンプ形式で表示されます。

 データベース「db_test01」に接続され、テーブル「tbl_test」のすべてのレコードのデータが正常にダンプされたことがわかります。

■フィールド名とフィールド値の対応表示

 各レコードごとに、フィールド名とフィールドの値が対応してみやすく表示するように変更します。そのプログラムを次の「test02.php」に示します。なお、HTMLタグも最低限のタグを記述することとします。

「test02.php」

<html>
<head>
<title>test02.php for PostgreSQL8.0</title>
</head>
<body>

<?php
// ホスト名の設定
$hostname = "localhost";
// データベース名の設定
$dbname = "db_test01";
// 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;
}

// データベースに接続できた場合
// テーブル名の設定
$tbl_name = "tbl_test";

// 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: could not execute SQL.<bt>\n";
 exit;
}

// SQL文ガ正常に実行できた場合
// レコード数の取得
$count = pg_num_rows($rs);

if($count > 0)
{
 // 各レコードのデータを順次配列に格納
 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>

 「test02.php」にアクセスした結果は、次の通りです。

■日本語コード

 プログラム「test02.php」でデータベース名とテーブル名を表示すように変更します。ソースプログラムを「test03.php」に示します。

「test03.php」

<html>
<head>
<title>test03.php for PostgreSQL8.0</title>
</head>
<body>

<?php

(中略)

// データベースに接続できた場合
// テーブル名の設定
$tbl_name = "tbl_test";

print "データベース名={$dbname}<br>\n";
print "テーブル名={$tbl_name}<br><br>\n";

// SQL文の設定
$str_sql = "select * from {$tbl_name};";

(後略)

?>
</body>
</html>

 「test03.php」にアクセスした結果は、次の通りです。

 以上のデータベースでは、フィールド名およびフィールドの値はすべて半角の英数字でした。

 次に、フィールド名およびフィールドの値に日本語漢字コードが使用されている場合の例を示します。

 たとえば、データベース「db_hanbai」のテーブル「tbl_商品表」のデータを表示してみます。ソースプログラムの「test04.php」に示します。

「test04.php」

<html>
<head>
<title>test04.php for PostgreSQL8.0</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;
}

// データベースに接続できた場合
// テーブル名の設定
$tbl_name = "tbl_商品表";

print "データベース名={$dbname}<br>\n";
print "テーブル名={$tbl_name}<br><br>\n";

// 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: could not execute SQL.<bt>\n";
 exit;
}

// SQL文ガ正常に実行できた場合
// レコード数の取得
$count = pg_num_rows($rs);

if($count > 0)
{
 // 各レコードのデータを順次配列に格納
 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>


 以上 の環境では、PHPファイルに漢字を使う場合は 「EUCコード」 である必要があります。一般にWindows環境では、エディターは漢字コードとしてSHIFT-JIS(SJIS)コードを使用しています。

 したがって、たとえばエディターソフトの「秀丸」を使う場合は、作成したPHPファイル等を保存する場合は、以下のように「EUCコード」に設定して保存する必要があります。「名前をつけて保存」ダイアログボックスの下の「文字コード」で「EUC(改行コード=LF)」を選択し、「保存」ボタンをクリックします。

 「秀丸」のエディタ画面の右上に、現在使用中の文字コード「EUC」が表示されます。なお、シフトJISコードの場合は、表示されません。

 

 「test04.php」にアクセスした結果は、次の通りです。

 

 


前へ | 目次へ |次へ  | Yamada-Lab

執筆 山田豊通
更新日: 2007年8月30日