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

# LXXXV. PostgreSQL 関数

# 導入

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

# 要件

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

# インストール手順

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
pgsql.ignore_notice | "0" | PHP_INI_ALL
pgsql.log_notice | "0" | PHP_INI_ALL

PHP_INI_* 定数の詳細と定義については、 ini_set()を参照して下さい。

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

`pgsql.allow_persistent` boolean

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

`pgsql.max_persistent` integer

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

`pgsql.max_links` integer

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

# 使用法およびヒント

警告
通知メッセージを処理するコードにバグがあるため、PHP 4.0.6で PostgreSQLモジュールを使用することは推奨されません。 4.1.0以降を使用してください。

警告

PostgreSQLモジュールの関数名は、現在のコーディング標準に準拠する ために 4.2.0以降変更されます。新しい関数名の多くには、 pg_lo_open()のようにアンダースコアが付きます。 いくつかの関数は、pg_exec()からpg_query()というように、統一を とるために関数名が変更されます。 古い名前も4.2.0とそれに続くいくつかのバージョンで使用可能ですが、 将来的には削除される可能性があります。

表 2. 変更された関数名

古い関数名 | 新しい関数名
--- | ---
pg_exec() | pg_query()
pg_getlastoid() | pg_last_oid()
pg_cmdtuples() | pg_affected_rows()
pg_numrows() | pg_num_rows()
pg_numfields() | pg_num_fields()
pg_fieldname() | pg_field_name()
pg_fieldsize() | pg_field_size()
pg_fieldnum() | pg_field_num()
pg_fieldprtlen() | pg_field_prtlen()
pg_fieldisnull() | pg_field_is_null()
pg_freeresult() | pg_free_result()
pg_result() | pg_fetch_result()
pg_loreadall() | pg_lo_read_all()
pg_locreate() | pg_lo_create()
pg_lounlink() | pg_lo_unlink()
pg_loopen() | pg_lo_open()
pg_loclose() | pg_lo_close()
pg_loread() | pg_lo_read()
pg_lowrite() | pg_lo_write()
pg_loimport() | pg_lo_import()
pg_loexport() | pg_lo_export()

従来のpg_connect()()/pg_pconnect()() 構文は、将来的に非同期接続 機能をサポートするために過去のものとなる可能性があります。 pg_connect()、pg_pconnect() では、接続文字列を使用してください。

全ての関数が全ての構築環境でサポートされるわけではありません。サ ポートされる関数は、使用するlibpq(PostgreSQLのCクライアントインター フェイス)のバージョンとlibpqのコンパイル方法に依存します。足りな い関数がある場合、libpqはその関数を必要とする機能をサポートしませ ん。

接続するPostgreSQLサーバーよりも新しいlibpqを使用することも重要で す。使用するlibpqのバージョンがPostgreSQLサーバが期待するよりも古 い場合、問題を生じる可能性があります。

バージョン6.3(1998/3/2)以降、PostgreSQLはUNIXドメインソケットを 使用しています。これらの新しいコネクションの使用例を以下に示す表に 示します。このソケットは`/tmp/.s.PGSQL.5432`に あります。このオプションはpostmasterに対して'- i'フラグを指定することで有効となります。これは "Unixドメインソケッ ト以外のTCP/IPソケットもlisten する"という意味です。

表 3. postmasterとPHP

postmaster | PHP | ステータス
--- | --- | ---
postmaster & | pg_connect("dbname=MyDbName"); | OK
postmaster -i & | pg_connect("dbname=MyDbName"); | OK
postmaster & | pg_connect("host=localhost dbname=MyDbName"); | Unable to connect to PostgreSQL server: connectDB() failed: Is the postmaster running and accepting TCP/IP (with -i) connection at 'localhost' on port '5432'? in /path/to/file.php3 on line 20.
postmaster -i & | pg_connect("host=localhost dbname=MyDbName"); | OK

PostgreSQL サーバへの接続は、以下のようにコマンド文字列の中に 値の組を羅列することにより、確立することができます。 $conn = pg_Connect("host=myHost port=myPort tty=myTTY options=myOptions dbname=myDB user=myUser password=myPassword");

以前の構文: $conn = pg_connect ("host", "port", "options", "tty", "dbname") は古い構文であり、推奨されません。

環境変数は、PostgreSQLサーバ/クライアントの動作に影響を与えます。 例えば、PostgreSQLモジュールは、ホスト名が接続文字列で省略された場 合、環境変数PGHOSTを探します。サポートされる環境変数は、バージョン 毎に異なります。詳細は、PostgreSQLプログラマ用マニュアル(libpq - 環境変数)を参照下さい。

適切なユーザ用に環境変数が設定されていることを確認して下さい。 カレントのプロセスで利用可能な環境変数を確認するには、 `$_ENV` または getenv() を使用して下さい。

例 1. デフォルトのパラメータを設定する

    PGHOST=pgsql.example.com
    PGPORT=7890
    PGDATABASE=web-system
    PGUSER=web-user
    PGPASSWORD=secret
    PGDATESTYLE=ISO
    PGTZ=JST
    PGCLIENTENCODING=EUC-JP

    export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD PGDATESTYLE PGTZ PGCLIENTENCODING

# 定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

`PGSQL_ASSOC` (integer)

`PGSQL_NUM` (integer)

`PGSQL_BOTH` (integer)

`PGSQL_CONNECTION_BAD` (integer)

`PGSQL_CONNECTION_OK` (integer)

`PGSQL_SEEK_SET` (integer)

`PGSQL_SEEK_CUR` (integer)

`PGSQL_SEEK_END` (integer)

`PGSQL_ESCAPE_STRING` (integer)

`PGSQL_ESCAPE_BYTEA` (integer)

`PGSQL_EMPTY_QUERY` (integer)

`PGSQL_COMMAND_OK` (integer)

`PGSQL_TUPLES_OK` (integer)

`PGSQL_COPY_OUT` (integer)

`PGSQL_COPY_IN` (integer)

`PGSQL_BAD_RESPONSE` (integer)

`PGSQL_NONFATAL_ERROR` (integer)

`PGSQL_FATAL_ERROR` (integer)

# 例

PostgreSQL 7.1.0から、textデータ型の最大サイズは1GBとなっています。 古いPostgreSQLのtextデータ型はブロックサイズ(デフォルトは8KB、最大 32KBをコンパイル時に定義可能)の制限を受けていました。

ラージオブジェクト(lo)インターフェースを使用するには、そのクエリーを トランザクション・ブロックの中に入れてやる必要があります。 トランザクション・ブロックはBEGINで始まり、 そのトランザクションが有効な場合はCOMMITまたは ENDで終わります。トランザクションが失敗した場合、 そのトランザクションはROLLBACKまたは ABORTにより閉じる必要があります。

例 2. ラージオブジェクトの使用例

`<?php $database = pg_connect ("dbname=jacarta"); pg_exec ($database, "begin"); $oid = pg_locreate ($database); echo ("$oid\n"); $handle = pg_loopen ($database, $oid, "w"); echo ("$handle\n"); pg_lowrite ($handle, "large object data"); pg_loclose ($handle); pg_exec ($database, "commit"); ?>`

ラージオブジェクトリソースを閉じる前にPostgreSQLサーバへの接続を 閉じないようにして下さい。

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