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

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

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

6.5 データベースの操作

 以下、6.3で作成したPostgreSQLデータベースのメタデータ表示用のユーザ定義関数やデータベース接続部分をインクルードファイル「common_pgsql.php」内に記述し、利用することとします。

■データベースの作成、削除

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

CREATE DATABASE データベース名;

 データベースの削除には、SQLコマンドの「DROP DATABASE」文を使用します。

DROP DATABASE データベース名;

 サンプルファイル「database01.php」を以下に示します。

(注)Webアプリケーションでデータベースの生成・削除を行うには、Webアプリケーション用ユーザはPostgreSQLのスーパユーザ権限を持つ必要があります。これは、セキュリティ上極めて危険なので、推奨できません。データベースの生成・削除は対話型インタフェースpsqlを使うよう推奨します。

「database01.php」

<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>database01.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);

// データベースの一覧表示
show_databases($db);

$dbname_new = "db_テスト";

// SQL文の設定
$str_sql = "CREATE DATABASE {$dbname_new};";

// SQL文の実行
$rs = pg_query($db,$str_sql);

// SQL文の実行がNGの場合
if(!pg_result_status($rs) == PGSQL_COMMAND_OK)
{
 print "Error: failed to execute SQL.<br>\n";
 exit;
}

// SQL文の実行がOKの場合
print "データベース「{$dbname_new}」を作成しました。<br>\n";

// データベースの一覧表示
show_databases($db);

// SQL文の設定
$str_sql = "DROP DATABASE {$dbname_new};";

// SQL文の実行
$rs = pg_query($db,$str_sql);

// SQL文の実行がNGの場合
if(!pg_result_status($rs) == PGSQL_COMMAND_OK)
{
 print "Error: failed to execute SQL.<br>\n";
 exit;
}

// SQL文の実行がOKの場合
print "データベース「{$dbname_new}」を削除しました.<br>\n";

// データベースの一覧表示
show_databases($db);

// データベースの切断
pg_close($db);
?>
</body>
</html>

 サンプルファイルへのアクセス結果は次のようになります。

■SQL文の実行結果の判定

 SQL文が正常に実行されたたか否かは、pg_result_status()関数で評価します。

$status = pg_result_status(結果リソース);

 pg_result_status()関数は、結果リソースのステータスを返します。 結果リソースのステータスは種々ありますが、一般的には、概略以下のような戻り値となります。

PGSQL_TUPLES_OK:  テーブルやビューからレコードの集合(TUPLES)を生成するSQL文が正常に生成された場合。
PGSQL_COMMAND_OK:レコードの集合(TUPLES)の生成以外のSQL文の実行が正常に実行された場合。

 したがって、上のサンプルリストのように、データベースの生成削除のSQL文の実行結果が正常か否かの判定は、以下のように行います。

// SQL文の実行がNGの場合
if(!pg_result_status($rs) == PGSQL_COMMAND_OK)
{
 print "Error: failed to execute SQL.<br>\n";
 exit;
}
// SQL文の実行がOKの場合

 SELECT文のようにレコードの集合(TUPLES)の生成を行うSQL文の実行結果が正常か否かの判定は、以下のように行います。

// SQL文の実行がNGの場合
if(!pg_result_status($rs) == PGSQL_TUPLES_OK)
{
 print "Error: failed to execute SQL.<br>\n";
 exit;
}
// SQL文の実行がOKの場合

 

6.6 テーブルの操作

■テーブルの作成

 テーブルを作成するには、SQLコマンドの「CREATE TABLE」文を実行します。

CREATE TABLE テーブル名
(
 フィールド名1 データ型1,
 フィールド名2 データ型2,
   :
 PRIMARY KEY(フィールド名n)
);

 テーブルを削除するには、SQL文の「DROP TABLE」文を実行します。

DROP TABLE テーブル名;

  以下にサンプルファイル「create_table.php」を示します。テーブルがデータベース内に存在するかチェックするユーザ定義関数table_exists()関数を定義して使用しています。

「create_table.php」

<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>database01.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);

// テーブルの一覧表示
show_tables($db);

$tbl_name = "tbl_テスト";

// テーブルが存在しない場合
if(!table_exists($db,$tbl_name))
{
 // テーブル作成用SQL文
 $str_sql = "CREATE TABLE {$tbl_name}
       (
        商品コード CHAR(4),
        商品名 CHAR(16),
        単価 INTEGER,
        PRIMARY KEY(商品コード)
       );
";

 // SQL文の実行
 pg_query($db,$str_sql);
 print "テーブル「{$tbl_name}」を作成しました。<br><br>\n";

 // テーブルの一覧表示
 show_tables($db);
 print "<br>\n";

 // フィールド属性の一覧表示
 show_fields($db,$tbl_name);
 print "<br>\n";
}

// テーブルが存在する場合
else
{
 print "テーブル「{$tbl_name}」は作成済みです。<br>\n";
}

// テーブルが存在する場合
if(table_exists($db,$tbl_name))
{
 // テーブル削除用SQL文
 $str_sql = "DROP TABLE {$tbl_name};";

 // SQL文の実行
 pg_query($db,$str_sql);
 print "テーブル「{$tbl_name}」を削除しました。<br><br>\n";

 // テーブルの一覧表示
 show_tables($db,$db_name);
 print "<br>\n";
}

// テーブルが存在しない場合
else
{
 print "テーブル「{$tbl_name}」はありません。<br>\n";
}

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

// ----------------------------------------------
//
function table_exists($db,$table_name)
{
 // テーブル一覧データの取得
 $rs = pg_list_tables($db);

 // レコード数の取得
 $count = pg_num_rows($rs);

 // レコードがある場合
 if($count > 0)
 {
  while($arr_record = pg_fetch_assoc($rs))
  {
   $name = trim($arr_record['Name']);
   if($name == $table_name)
   {
    return true;
   }
  }
  return false;
 }
 else
 {
  return false;
 }
}
?>
</body>
</html>

 サンプルファイルの実行結果を下記に示します。

【注意】以後、テーブルの存在チェック関数「table_exists()」はインクルードファイル「common_pgsql.php」内に追加して記述することとします。

 


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

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