pg_connect

(PHP 4、PHP 5、PHP 7、PHP 8)

pg_connect打开 PostgreSQL 连接

描述

pg_connect(string $connection_string, int $flags = 0): PgSql\Connection|false

pg_connect() 打开到由 connection_string 指定的 PostgreSQL 数据库的连接。

如果对 pg_connect() 进行第二次调用,并且使用与现有连接相同的 connection_string,则将返回现有连接,除非您将 PGSQL_CONNECT_FORCE_NEW 作为 flags 传递。

具有多个参数的旧语法 $conn = pg_connect("host", "port", "options", "tty", "dbname") 已被弃用。

参数

connection_string

connection_string 可以为空以使用所有默认参数,或者可以包含一个或多个由空格分隔的参数设置。每个参数设置的形式为 keyword = value。等号周围的空格是可选的。要写入空值或包含空格的值,请用单引号将其括起来,例如 keyword = 'a value'。值中的单引号和反斜杠必须用反斜杠转义,即 \' 和 \\。

当前识别的参数关键字为:hosthostaddrportdbname(默认为 user 的值)、userpasswordconnect_timeoutoptionstty(忽略)、sslmoderequiressl(已弃用,请使用 sslmode 替代)和 service。这些参数中哪些存在取决于您的 PostgreSQL 版本。

options 参数可用于设置要由服务器调用的命令行参数。

flags

如果传递了 PGSQL_CONNECT_FORCE_NEW,则会创建一个新的连接,即使 connection_string 与现有连接相同。

如果提供了 PGSQL_CONNECT_ASYNC,则连接将异步建立。然后,可以通过 pg_connect_poll()pg_connection_status() 检查连接状态。

返回值

成功时返回一个 PgSql\Connection 实例,失败时返回 false

变更日志

版本 描述
8.1.0 现在返回一个 PgSql\Connection 实例;以前,返回的是一个 资源

示例

示例 #1 使用 pg_connect()

<?php
$dbconn
= pg_connect("dbname=mary");
// 连接到名为 "mary" 的数据库

$dbconn2 = pg_connect("host=localhost port=5432 dbname=mary");
// 连接到 "localhost" 上端口 "5432" 上名为 "mary" 的数据库

$dbconn3 = pg_connect("host=sheep port=5432 dbname=mary user=lamb password=foo");
// 连接到主机 "sheep" 上名为 "mary" 的数据库,使用用户名和密码

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_connect($conn_string);
// 连接到主机 "sheep" 上名为 "test" 的数据库,使用用户名和密码

$dbconn5 = pg_connect("host=localhost options='--client_encoding=UTF8'");
// 连接到 "localhost" 上的数据库,并设置命令行参数,指示编码为 UTF-8
?>

参见

添加注释

用户贡献的注释 26 个注释

13
lukasz dot wolczak at gmail dot com
8 年前
值得注意的是,您可以在连接字符串中设置 application_name,请考虑这个简单的示例

<?php
$appName
= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$connStr = "host=localhost port=5432 dbname=postgres user=postgres options='--application_name=$appName'";

// 简单检查
$conn = pg_connect($connStr);
$result = pg_query($conn, "select * from pg_stat_activity");
var_dump(pg_fetch_all($result));

?>

通过在 CLI 或 CGI 上进行此操作,您可以在 pgAdmin 中查看正在运行的脚本或正在数据库上运行的请求。您可以扩展 postgres 的配置以跟踪慢速查询并将应用程序名称打印到日志。对我来说,这对于找出应该优化什么以及在哪里非常有用。
5
Dave
11 年前
如果您使用 pgbouncer 和 Unix 套接字
并且您的 pgbouncer.ini 如下所示
listen_port = 6432
unix_socket_dir = /tmp

您这样连接

pg_connect('host=/tmp port=6432 dbname=DB user=USER password=PASS');
4
匿名
9 年前
获取 md5 密码很令人困惑,因为缺乏文档

- 设置您的 pg_hba.conf 以便使用 md5 密码而不是 'trust' 或 'ident'
- 检查您的 postgres.conf 是否有 'password_encryption=on'(取决于版本,这可能已经是 'on')。
- 确保重新启动 postgres 进程。
- 在 PHP 中,您只需以 _纯文本_ 形式提供用户名和密码
'host=localhost port=5432 dbname=megadb user=megauser password=holyhandbagsbatmanthispasswordisinplaintext'
postgres PHP 库会自动为您进行 md5 编码,无需您自己动手。
2
tim at buttersideup dot com
16 年前
这里没有明确说明,但您也可以通过将主机留空来通过 UNIX 域套接字连接到 PostgreSQL。与使用 TCP 相比,这应该具有更少的开销,例如

$dbh = new PDO('pgsql:user=exampleuser dbname=exampledb password=examplepass');

事实上,由于 C 库调用 PQconnectdb 是此实现的基础,因此您可以提供此库调用将接受的任何内容 - 在调用 PQconnectdb 之前,"pgsql:" 前缀会被剥离,如果您提供任何可选参数(例如用户),则这些参数将被添加到您提供的字符串中……查看与您相关的 PostgreSQL 客户端库的文档:例如

https://postgresql.ac.cn/docs/8.3/static/libpq-connect.html

如果你需要,可以使用 ';' 来分隔你的参数 - 这些在调用 PQconnectdb 之前会转换为空格。

Tim。
2
thakur at corexprts dot com
13 年前
要记住,在尝试使用 pg_connect 时,要添加 timeout 参数。

<?php
$d
=pg_connect('host=example.com user=pgsql dbname=postgres connect_timeout=5');
?>
1
matias at nospam dot projectcast dot com
22 年前
至少在 Postgres 7.2 中,连接到本地 postgres 数据库需要数据库中有一个与运行 apache 的用户同名的用户,否则连接会失败。
2
bgalloway at citycarshare dot org
16 年前
小心编写类似以下内容的代码:
<?php
function getdb_FAILS() {
return
pg_connect("...") or die('connection failed');
}
?>

它将返回一个布尔值。如果你不使用返回值作为数据库连接句柄,这似乎没问题,但如果你使用,它将失败。

相反,使用:
<?php
function getdb() {
$db = pg_connect("...") or die('connection failed');
return
$db;
}
?>

它实际上返回一个句柄。
0
VLroyrenn
5 年前
值得注意的是,虽然 PHP 通常会为你处理连接重用,只要你一直使用相同的连接字符串,比如以下示例

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 耗时约 0.03 秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 耗时 0 秒
?>

...但和你想的一样好,这对于异步连接并不适用;你必须自己管理它们,而且你不能在异步连接之后再进行阻塞连接作为一种简单的方法来等待连接过程完成再发送查询。

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
sleep(1);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 耗时约 1 秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 耗时约 0.025 秒
?>
0
leace at post dot cz
24 年前
如果你使用 PostgreSQL 用户来认证到你的 pg 数据库,而不是使用你自己的认证,请始终在 pg_connect 中指定 host 指令,并编辑 pg_hba.conf 以便从该主机进行相应的认证。否则,PHP 将以 'local' 的身份使用 UNIX 域套接字进行连接,该套接字在 pg_hba.conf 中默认设置为 'trust'(因此你可以使用 psql 在控制台中连接而无需指定密码),每个人都可以_无密码_ 连接到数据库。
-1
Anonymous
19 年前
pg_connect 的 sslmode 参数接受的值为:disable、allow、prefer、require
-1
gutostraube at gmail dot com
14 年前
可以通过以下两种方法使用 pg_connect() 函数通过 Unix 套接字连接到 PostgreSQL 数据库。

1) 使用套接字路径

<?php
$conn
= pg_connect('host=/var/run/postgresql user=username dbname=databasename');
?>

2) 省略主机名/路径

<?php
$conn
= pg_connect('user=username dbname=databasename');
?>

注意:在这种情况下(省略主机值),将使用默认套接字路径。
-1
phpnet at benjamin dot schulz dot name
19 年前
如果你需要打开一个新的连接句柄(例如,对于多个 pg_send_query()),请将 PGSQL_CONNECT_FORCE_NEW 作为 pg_connect() 的第二个参数。
-1
xzilla at users dot sourceforge dot net
20 年前
关于 matias at nospam dot projectcast dot com 的备注
在 2002 年 2 月 12 日 01:16,你不需要数据库中有一个与你的 web 用户同名的用户,无论 postgresql 的版本如何。唯一需要这样做的就是当你将你的 postgresql 服务器设置为只允许基于 IDENT 的身份验证时(据我所知,这是 Red Hat 系统的默认设置,这可能是造成混淆的原因)。有关 postgresql 允许的各种身份验证方法的更多信息,请查看 https://postgresql.ac.cn/docs/7.4/static/client-authentication.html
-3
Sohel Taslim
17 年前
我遇到了同样的问题,但我必须用不同的方法解决它。
在我的 postgresql.conf 文件中,以下内容被注释掉了。
因此,我在连接设置下激活了它 -

# - 连接设置 –
tcpip_socket = true
-2
floriparob at gmail dot com
8 年前
使用 "service" 参数作为连接字符串 - 我们发现以下函数:

putenv("PGSERVICEFILE=/path/to/your/service/file/pg_service.conf");
$connect_string = ("service=testdb");
try {
$pgconn_handle = pg_connect($connect_string);
. . . . . etc.

注意:-
1) 环境变量必须指向路径和文件名。
2) 该文件必须可被 Apache 读取。

查看:-

https://postgresql.ac.cn/docs/9.6/static/libpq-pgservice.html

了解如何创建你的 pg_service.conf
-2
jtate at php dot net
21 年前
如果你在连接到 7.1 之后版本的 PostgreSQL 数据库时在 pg_connect 字符串中使用 host=HOSTNAME,你需要确保你的 postmaster 守护进程是用 "-i" 选项启动的。否则连接将失败。有关客户端身份验证文档,请查看 https://postgresql.ac.cn/idocs/index.php?client-authentication.html
-2
kayotix at yahoo dot com
23 年前
安装说明中隐藏了一个小细节。在 Php 3 中,通过将 --with-postgresql=[DIR] 添加到传递给 ./configure 的选项中来激活 PostgreSQL 支持。在 Php 4.0.2(在 Linux 上)中,参数是 --with-pgsql。我唯一找到这个参数的地方是在手册的“在 Unix 上安装 PHP”部分。
-11
Anonymous
9 年前
如果你收到以下警告
"警告:pg_connect():无法连接到 PostgreSQL 服务器:无法将主机名 "server.your.trying.to.connect.to" 转换为地址:"
并且你尝试连接的服务器正常,并且连接本身应该正常工作,
可能是 PHP 的 postgres 扩展对某些东西感到困惑。
尝试重启你的 Apache 以重新初始化扩展。
-5
derry at siliconriver.com dot au
21 年前
pg_connect 似乎支持 SSL 连接,在 Postgres 已用 ssl 编译的系统上,我假设这是因为 psql 使用 libpq 进行连接。
pg_connect 可以成功连接,并使用 "requiressl" 参数。
-3
rolf at sir-wum dot de
22 年前
pg_connect() 无法使用 pg_hba.conf 中的 'crypt' 身份验证方法。我花了一个小时才弄清楚,直到我记起一些关于 Windows 缺少 crypt() 调用的其他问题。
-13
Cybertinus
20 年前
如果你使用 pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname') 并且你收到以下错误
"警告:pg_connect():无法连接到 PostgreSQL 服务器:无法连接到服务器:连接被拒绝服务器是否在主机 localhost 上运行并接受端口 5432 上的 TCP/IP 连接?"
那么,您应该尝试在连接字符串中省略 `host=` 和 `port=` 部分。这听起来很奇怪,但这是 PostgreSQL 的一种“选项”。如果您没有在 `postgresql.conf` 中启用 TCP/IP 端口,那么 PostgreSQL 不会接受来自 TCP/IP 端口的任何传入请求。如果您在连接字符串中使用 `host=`,您将通过 TCP/IP 连接到 PostgreSQL,因此这将不起作用。如果您从连接字符串中省略 `host=` 部分,您将通过 Unix 域套接字连接到 PostgreSQL,这更快也更安全,但您无法通过其他任何 PC 连接到数据库,因为 localhost 仅限于本地主机。
-9
xourge
16 年前
请记住,当您使用空密码时,由于以下原因会发生错误:
password= dbname= (...)
要解决此问题,请在您的 `$options` 变量中使用 `''`
示例

$options = " host='localhost' port='5432' user='postgres' password='' dbname='test' ";
pg_connect($options);

*** 注意:我在 `password=` 后使用了双引号 `''`,而不是 `"`
-5
borovik -at- gmail
17 年前
"如果您使用 `pg_connect('host=localhost port=5432 user=my_username password=my_password dbname=my_dbname')` 并收到以下错误
"警告:pg_connect():无法连接到 PostgreSQL 服务器:无法连接到服务器:连接被拒绝服务器是否在主机 localhost 上运行并接受端口 5432 上的 TCP/IP 连接?"
"
我通过在 `postgresql.conf` 文件中设置 `listen_addresses = '*'` 来解决此错误。此错误很可能发生在 `host` 参数中指定的名称解析为 localhost 之后,但依然存在问题。因此,您可以将主机设置在 `pg_connect()` 函数中。
-16
dreamsoundaudio at gmail dot com
12 年前
Ubuntu/Debian 用户,特别是服务器版本:如果您使用 Tasksel 构建 PostgreSQL,并且您遇到了“Fatal error: Call to undefined function pg_connect()”错误,请检查 `php5-pgsql` 是否已安装。

Tasksel 似乎没有安装它。
-16
Anonymous
6 年前
<?php

class Baza {
const
DNS='mysql:host=localhost;dbname=news;charset=utf8';
const
UZYTKOWNIK='root';
const
HASLO='';

public
$klient;

function
__construct(){
$this->polacz();
}
public function
polacz(){
try{
$this->klient=new PDO(
self::DNS,
self::UZYTKOWNIK,
self::HASLO
);
}
catch (
PDOException $e){
die(
'Wystąpił następujący błąd bazy danych: '.$e->getMessage());
}
return
true;
}
}
-26
infotirona at yahoo dot com
13 年前
奇怪的是,这个“Fatal error: Call to undefined function pg_connect()”错误(当其他一切正常时)在 PHP 版本 5.3.3 中发生。

我第一次尝试连接到我的数据库时收到了这个错误消息。我的扩展路径是正确的,`pgsql` 扩展应该已经从 `php.ini` 中加载(我之前已经启用了它),Apache 启动没有错误,但是当我尝试连接时,我还是收到了“Fatal error: Call to undefined function pg_connect()”消息。
在周围搜索了一番之后,我发现了一些关于 dll 库无法正常工作的消息,因此我删除了新的 5.3.3 版本,下载了 PHP 5.2.5 并配置了它。

我使用的是 Windows XP Home SP3,Apache 2.2,PHP 5.2.5,现在一切正常... ;)
To Top