推荐使用PDO连接PostgreSQL,因其更健壮、错误可控、支持预处理防SQL注入;pg_connect()数组参数在PHP 8.1+已弃用,且二者均依赖pgsql和pdo_pgsql扩展启用。

pg_connect() 和 PDO 都能用,但 PHP 8.5.5 下推荐用 PDO —— 它更健壮、错误可控、支持预处理防注入,且 pg_connect() 的数组参数形式已在 PHP 8.1+ 彻底弃用。
扩展没启,pg_connect() 和 PDO 都会直接报错
不是代码写错了,是 PHP 根本不认识这些函数或类:
• Call to undefined function pg_connect() → 缺 pgsql 扩展
• Driver not found 或 Class 'PDO' not found → 缺 pdo_pgsql 扩展
验证方式:php -m | grep -E '^(pdo_pgsql|pgsql)$',必须两行都输出。
常见修复路径:
• Ubuntu/Debian:sudo apt install php-pgsql,然后重启 php-fpm 或 apache2
• macOS(Homebrew):brew install php@8.5-pgsql,确认 extension=pdo_pgsql 和 extension=pgsql 在 php.ini 中已启用
• Docker:在 Dockerfile 中加 docker-php-ext-install pgsql pdo_pgsql
连接串写错,pg_connect() 返回 false 却不报错
pg_connect() 默认静默失败,只返回 false。最常踩的坑是:
• host=localhost → 可能走 Unix socket,而 PostgreSQL 默认不监听该路径;改用 host=127.0.0.1 强制 TCP
• 连接字符串里漏空格或等号:"host=localhost dbname=test user=postgres password=123" 错(缺空格),正确是:"host=127.0.0.1 port=5432 dbname=test user=postgres password='123'"
• dbname 必须显式指定,不能省略——PostgreSQL 不支持连接后 USE 切库
• 密码含特殊字符(如 @、/)必须 URL 编码,否则 DSN 解析失败
PDO 连接必须设异常模式,否则 SQL 错误不提示
默认 PDO::ERRMODE_SILENT 下,$stmt->execute() 失败只返回 false,页面空白、日志无记录,极难排查。
务必在创建实例后立刻设置:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
DSN 格式要完整:$dsn = "pgsql:host=127.0.0.1;port=5432;dbname=myapp;user=web;password={$_ENV['PG_PASS']}";
注意:
• host 和 127.0.0.1 不能写成 localhost
• charset 参数对 PostgreSQL 无效,删掉
• 生产环境禁用明文密码,从环境变量读取
查完数据不取,echo $result 只输出 Resource id #5
pg_query() 和 PDO::query() 返回的都不是数组,而是资源(PHP PgSql\Result 对象(PHP ≥ 8.1)。直接 echo 没意义。
取数据必须调用 fetch 函数:
• pg_fetch_assoc($result) → 关联数组,推荐
• pg_fetch_all($result) → 全部结果,大数据集慎用
• $pdo->fetch(PDO::FETCH_ASSOC) 或 $pdo->fetchAll(PDO::FETCH_ASSOC)
别忘了显式关闭连接(尤其 CLI 脚本):pg_close($conn) 或置 $pdo = null,避免连接数耗尽
立即学习“PHP免费学习笔记(深入)”;
PostgreSQL 的pg_hba.conf 放行规则、PHP 扩展加载状态、连接串中 host 和 dbname 的强制要求,这三点漏掉任一,都会导致“连不上”或“连上了却查不到”。它们比语法细节更关键,也最容易被跳过。



















