PHP Manual
后退 |  | 前进

# CI. PostgreSQL 数据库函数库

# 简介

PostgreSQL 是一个开放源码的免费数据库系统。Postgres 最初由加州大学伯克利分校计算机科学系开发，倡导了很多关系对象的观念，这些观念现在已经用在一些商业数据库系统中。它提供了 SQL92/SQL99 语言支持，事务处理，引用集成，存储过程以及类型扩展。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] 选项。如果可以用共享模块方式，PostgreSQL 模块可以在 `php.ini` 用 extension 指令或者 dl() 函数加载。

# 运行时配置

这些函数的行为受 `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 连接数目，包括持久连接。

pgsql.auto_reset_persistent integer

  检测用在 pg_pconnect() 上的中断了的持久连接。需要一些损耗。

pgsql.ignore_notice integer

  是否忽略 PostgreSQL 后端的通告。

pgsql.log_notice integer

  是否记录 PostgreSQL 后端的通告消息。要记录通告消息日志，PHP 指令 pgsql.ignore_notice 必须为 off。

# 使用方法及提示

警告
由于 notice message handling 代码中的 bug，不推荐在 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 的版本和编译方法有关。如果编译源代码时少了一个函数，那么 libpq 就不支持需要该函数的功能。

不要使用比 PostgreSQL 服务器连接所接受更旧版本的 libpq 也很重要。如果你用的 libpq 版本比 PostgreSQL 服务器预期的低就可能出现问题。

PostgreSQL 在 6.3 (03/02/1998) 版之后默认使用 unix domain sockets，默认状态下不会打开 TCP 端口。下面这张表说明了各种新建连接的可能性。TCP/IP socket 放在 `/tmp/.s.PGSQL.5432`。该选项可用 postmaster 中的 '-i' 参数打开，它表示“监视 TCP/IP 端口以及 Unix domain socket”。

表格 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.php 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 Programmers's Manual (libpq - Environment Variables)。

确认已经给适当的用户设置了环境变量。用 $_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 的数据。在老版本中则限制为一个块的大小（默认 8KB，最大 32KB，编译时指定）。

要使用 large object (lo) 接口，需要把 large object 函数放在一个事务段中。事务段以 SQL 语句 BEGIN 开始，如果该事务合法，以 COMMIT 或者 END结束，如果该事务失败，则以 ROLLBACK 或者 ABORT结束。

例子 2. 使用 Large Object

`<?php $database = pg_connect ("dbname=jacarta"); pg_query ($database, "begin"); $oid = pg_lo_create ($database); echo "$oid\n"; $handle = pg_lo_open ($database, $oid, "w"); echo "$handle\n"; pg_lo_write ($handle, "large object data"); pg_lo_close ($handle); pg_query ($database, "commit"); ?>`

在关闭 large object 之前不应关闭到 PostgreSQL 服务器的连接。

后退 | 起点 | 前进
pfpro_version | 上一级 | pg_affected_rows