PHP マニュアル
前のページ |  | 次のページ

# CXVII. PostgreSQL 関数

# 導入

PostgreSQL データベースはオープンソースの製品であり、無料で 使用可能です。Postgres は元々 UCB（カリフォルニア大学バークレイ校） コンピュータ・サイエンス学部で開発されたものです。この Postgres は、 現在いくつかの商用データベースにおいてサポートされつつある オブジェクトリレーショナルデータベース的概念の多くの先駆けでした。 Postgres は、SQL92/SQL99 言語サポート・トランザクション・参照整合性・ ストアドプロシージャ・拡張可能な型を提供しています。PostgreSQL は、 バークレイ校での Postgres のオリジナルコードの、オープンソースの 子孫にあたります。

# 要件

PostgreSQL サポートを使用するには、PostgreSQL 6.5 以降が必要です。 PostgreSQL 8.0 以降では PostgreSQL モジュールの全ての機能を使用可能 です。PostgreSQL は、マルチバイト文字エンコーディングを含む多くの 文字エンコーディングをサポートしています。現在のバージョン及び PostgreSQLに関するより詳細な情報は、 http://www.postgresql.org/ と PostgreSQL Documentation で入手可能です。

# インストール手順

PostgreSQLサポートを利用可能とするには、PHPコンパイル時に --with-pgsql[=DIR] を指定することが必要です。 共有オブジェクトモジュールが利用可能な場合、`php.ini` の extension ディレクティブ または dl() 関数によりPostgreSQLモジュール をロードすることが可能です。

# 実行時設定

`php.ini` の設定により動作が変化します。

表 1. PostgreSQL設定オプション

名前 | デフォルト | 変更の可否 | 変更履歴
--- | --- | --- | ---
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM |
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM |
pgsql.max_links | "-1" | PHP_INI_SYSTEM |
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM | PHP 4.2.0 以降で有効です。
pgsql.ignore_notice | "0" | PHP_INI_ALL | PHP 4.3.0 以降で有効です。
pgsql.log_notice | "0" | PHP_INI_ALL | PHP 4.3.0 以降で有効です。

PHP_INI_* 定数の詳細および定義については 付録G を参照してください。

以下に設定ディレクティブに関する 簡単な説明を示します。

pgsql.allow_persistent boolean

  持続的な Postgres 接続を可能にするかどうか。

pgsql.max_persistent integer

  プロセス毎の持続的 Postgres 接続の最大数。

pgsql.max_links integer

  持続的接続を含むプロセス毎の Postgres 接続の最大数。

pgsql.auto_reset_persistent integer

  pg_pconnect() で作成した持続的接続の障害を 検出する。少々のオーバーヘッドを要します。

pgsql.ignore_notice integer

  PostgreSQL バックエンドの通知メッセージを無視するかどうか。

pgsql.log_notice integer

  PostgreSQL バックエンドの通知メッセージをログに記録するかしないか。 ログに記録するには、PHP ディレクティブ pgsql.ignore_notice を off にする必要があります。

# リソース型

PostgreSQL モジュールで使用されるリソース型は 2 種類あります。ひとつは データベース接続のリンク ID で、もうひとつはクエリの結果を保持する リソースです。

# 定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

`PGSQL_ASSOC` (integer)

  pg_fetch_array() に渡します。 フィールド名と値の連想配列を返します。

`PGSQL_NUM` (integer)

  pg_fetch_array() に渡します。 フィールド番号と値の数値添字配列を返します。

`PGSQL_BOTH` (integer)

  pg_fetch_array() に渡します。 フィールド値の配列を、数値添字（フィールド番号で）と 連想配列（フィールド名で）の両方で返します。

`PGSQL_CONNECT_FORCE_NEW` (integer)

  pg_connect() に渡し、既存の同一接続を無視して 新しい接続を確立させるようにします。

`PGSQL_CONNECTION_BAD` (integer)

  pg_connection_status() から返され、データベースとの 接続が不正な状態になっていることを示します。

`PGSQL_CONNECTION_OK` (integer)

  pg_connection_status() から返され、データベースとの 接続が正常であることを示します。

`PGSQL_SEEK_SET` (integer)

  pg_lo_seek() に渡します。シーク操作は オブジェクトの先頭から始められます。

`PGSQL_SEEK_CUR` (integer)

  pg_lo_seek() に渡します。シーク操作は カレントの位置から始められます。

`PGSQL_SEEK_END` (integer)

  pg_lo_seek() に渡します。シーク操作は オブジェクトの最後から始められます。

`PGSQL_EMPTY_QUERY` (integer)

  pg_result_status() から返されます。 サーバに送信された文字列が空でした。

`PGSQL_COMMAND_OK` (integer)

  pg_result_status() から返されます。 コマンドは正常に終了し、何もデータを返しませんでした。

`PGSQL_TUPLES_OK` (integer)

  pg_result_status() から返されます。 コマンドは正常に終了し、データを返しました （SELECT や SHOW など）。

`PGSQL_COPY_OUT` (integer)

  pg_result_status() から返されます。 （サーバからの）データのコピーが始まりました。

`PGSQL_COPY_IN` (integer)

  pg_result_status() から返されます。 （サーバへの）データのコピーが始まりました。

`PGSQL_BAD_RESPONSE` (integer)

  pg_result_status() から返されます。 サーバからの応答を判別できませんでした。

`PGSQL_NONFATAL_ERROR` (integer)

  pg_result_status() から返されます。 致命的ではないエラー（通知や警告など）が発生しました。

`PGSQL_FATAL_ERROR` (integer)

  pg_result_status() から返されます。 致命的なエラーが発生しました。

`PGSQL_TRANSACTION_IDLE` (integer)

  pg_transaction_status() から返されます。 接続は現在アイドル状態で、トランザクション内ではありません。

`PGSQL_TRANSACTION_ACTIVE` (integer)

  pg_transaction_status() から返されます。 接続内でコマンドを実行中です。クエリが接続を通じて送信され、 まだ完了していません。

`PGSQL_TRANSACTION_INTRANS` (integer)

  pg_transaction_status() から返されます。 接続は現在アイドル状態で、トランザクションブロック内にあります。

`PGSQL_TRANSACTION_INERROR` (integer)

  pg_transaction_status() から返されます。 接続は現在アイドル状態で、トランザクション処理に失敗しています。

`PGSQL_TRANSACTION_UNKNOWN` (integer)

  pg_transaction_status() から返されます。 接続が正常ではありません。

`PGSQL_DIAG_SEVERITY` (integer)

  pg_result_error_field() に渡します。 深刻度です。その内容は ERROR、 FATAL、あるいは PANIC （エラーメッセージ内）、あるいは WARNING、 NOTICE、DEBUG、 INFO、あるいは LOG （通知メッセージ内）、あるいはこれらの各国語版のうちのどれかです。 常に存在します。

`PGSQL_DIAG_SQLSTATE` (integer)

  pg_result_error_field() に渡します。 エラーの SQLSTATE コードです。SQLSTATE コードは発生したエラーの種別を 特定します。これは、データベースエラーに対してフロントエンドの アプリケーションが適切な操作（エラー処理など）をできるようにするために 使用されます。このフィールドはローカライズされていません。また、 常に存在します。

`PGSQL_DIAG_MESSAGE_PRIMARY` (integer)

  pg_result_error_field() に渡します。 人間が判読できる最初のエラーメッセージ（たいてい 1 行）です。常に存在します。

`PGSQL_DIAG_MESSAGE_DETAIL` (integer)

  pg_result_error_field() に渡します。 オプションの 2 番目のエラーメッセージで、問題に対する詳細な情報を 含みます。複数行にまたがることもあります。

`PGSQL_DIAG_MESSAGE_HINT` (integer)

  pg_result_error_field() に渡します。 オプションのメッセージで、問題に対してどのように対応すべきかを指摘 します。エラーの詳細情報と違う点は、発生した事実ではなくアドバイス （時に不適切な場合もある）をするところです。複数行にまたがることも あります。

`PGSQL_DIAG_STATEMENT_POSITION` (integer)

  pg_result_error_field() に渡します。 エラーカーソルの位置を、もとのステートメント中の位置として表す 整数値を保持する文字列です。 最初の文字の位置は 1 で、それ以降（バイト数ではなく）文字数で 位置を数えます。

`PGSQL_DIAG_INTERNAL_POSITION` (integer)

  pg_result_error_field() に渡します。 `PG_DIAG_STATEMENT_POSITION` と同じ定義ですが、 こちらはカーソル位置が内部で生成されたコマンドを参照している場合に 使用されます。このフィールドが存在する場合は、常に `PG_DIAG_INTERNAL_QUERY` フィールドも存在します。

`PGSQL_DIAG_INTERNAL_QUERY` (integer)

  pg_result_error_field() に渡します。 失敗した内部生成コマンドのテキストです。例としては、PL/pgSQL 関数で 発行された SQL クエリなどがあてはまります。

`PGSQL_DIAG_CONTEXT` (integer)

  pg_result_error_field() に渡します。 エラーが発生した状況を指定します。現在ここに含まれているのは、 アクティブなプロシージャの関数や内部生成クエリのコール履歴です。 これはエントリごとに 1 行のデータとなっており、直近のデータが 先頭にきます。

`PGSQL_DIAG_SOURCE_FILE` (integer)

  pg_result_error_field() に渡します。 エラーが報告された箇所の、PostgreSQL ソースコードでのファイル名です。

`PGSQL_DIAG_SOURCE_LINE` (integer)

  pg_result_error_field() に渡します。 エラーが報告された箇所の、PostgreSQL ソースコードでの行番号です。

`PGSQL_DIAG_SOURCE_FUNCTION` (integer)

  pg_result_error_field() に渡します。 エラーが報告された箇所の、PostgreSQL ソースコードでの関数名です。

`PGSQL_ERRORS_TERSE` (integer)

  pg_set_error_verbosity() に渡します。 返されるメッセージを指定します。ここには深刻度・短い説明および 発生位置のみを含めます。通常は 1 行に収まるでしょう。

`PGSQL_ERRORS_DEFAULT` (integer)

  pg_set_error_verbosity() に渡します。 デフォルトで返されるメッセージで、上の内容に加えて詳細・ ヒントあるいは詳細情報を含めます（複数行にまたがるかもしれません）。

`PGSQL_ERRORS_VERBOSE` (integer)

  pg_set_error_verbosity() に渡します。 詳細モードでのメッセージで、有効なフィールドをすべて含めます。

`PGSQL_STATUS_LONG` (integer)

  pg_result_status() に渡します。 結果として数値が要求されていることを示します。

`PGSQL_STATUS_STRING` (integer)

  pg_result_status() に渡します。 結果としてテキストのコマンドタグが要求されていることを示します。

`PGSQL_CONV_IGNORE_DEFAULT` (integer)

  pg_convert() に渡します。 変換時に、テーブルのデフォルト値を無視します。

`PGSQL_CONV_FORCE_NULL` (integer)

  pg_convert() に渡します。 空文字列に対して、SQL の NULL を使用します。

`PGSQL_CONV_IGNORE_DEFAULT` (integer)

  pg_convert() に渡します。 `NULL` を SQL の NOT NULL に変換しないように します。

# 注意

> 注意: すべての関数がすべての構築環境でサポートされるわけではありません。 サポートされる関数は、使用する libpq（PostgreSQL の C クライアント ライブラリ）のバージョンと libpq のコンパイル方法に依存します。 もし PHP の PostgreSQL 拡張モジュールに足りない関数がある場合、 その原因は libpq はその関数をサポートしていないことです。

> 注意: ほとんどの PostgreSQL 関数は、オプションの第 1 引数として connection を受け付けます。もしこれを 指定しなかった場合、直近にオープンされた接続を使用します。 そのような接続が存在しなかった場合、関数は `FALSE` を返します。

> 注意: PostgreSQL は、オブジェクトの生成時やクエリの実行時に 識別子（例: テーブル名・カラム名）を自動的に小文字に変換します。 この自動変換を防ぐには、識別子をダブルクォート（""）でエスケープする 必要があります。

> 注意: PostgreSQL には、データベースのスキーマ情報（例: データベース内の すべてのテーブルなど）を取得するための特別なコマンドがありません。 その代わりに、PostgreSQL 7.4 以降では information_schema という標準スキーマが存在し、必要な情報が検索しやすい形式で格納されています。 詳しい情報は PostgreSQL ドキュメンテーション を参照ください。

# 例

この例では、PostgreSQL への接続・クエリの実行・結果の表示 そして切断の方法を説明します。

例 1. PostgreSQL 拡張モジュールの概要

`<?php
// 接続し、データベースを選択する
$dbconn = pg_connect("host=localhost dbname=publishing user=www password=foo")
or die('Could not connect: ' . pg_last_error());
// SQL クエリを実行する
$query = 'SELECT * FROM authors';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
// 結果を HTML で表示する
echo "<table>\n";
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";
// 結果セットを開放する
pg_free_result($result);
// 接続をクローズする
pg_close($dbconn);
?>`

前のページ | ホーム | 次のページ
sql_regcase | 上に戻る | pg_affected_rows