PHP连PostgreSQL必须同时启用pgsql扩展、连接字符串中明确指定dbname、用pg_fetch_*函数获取结果,缺一不可;否则会出现“无报错但查不到数据”或“undefined function”等静默失败。

PHP 连 PostgreSQL 不是“写对字符串就能通”,而是必须同时满足三件事:扩展已启用、连接串带 dbname、结果用 pg_fetch_* 取——漏掉任一环节,都会表现为“没报错但查不到数据”或“函数未定义”。
pg_connect() 报 “undefined function” 是扩展没开
这不是代码写错了,是 PHP 根本不认识这个函数。pg_connect() 依赖 pgsql 扩展,而它默认不启用。
- 运行
php -m | grep pgsql,无输出就说明没加载 - Debian/Ubuntu:装
php-pgsql包,再重启apache2或php-fpm - MAMP 用户:Preferences → PHP → 勾选
pgsql和pdo_pgsql,然后必须重启 MAMP(只刷新网页无效) - Docker 用户:
docker-php-ext-install pgsql pdo_pgsql,别漏掉pdo_pgsql(PDO 连接要用它)
连接成功但查不到表,大概率是 dbname 漏了或写错了
PostgreSQL 不支持连接后 USE db_name 切库,dbname 是连接串的必需项。漏掉就默认连到 postgres 或同名系统用户库,自然找不到你的表。
- 错误写法:
"host=localhost user=web password=123"(缺dbname) - 正确写法:
"host=localhost port=5432 dbname=myapp user=web password=123" -
dbname区分大小写;含短横线(如my-db)时,DSN 里不能加引号,得在 SQL 里用双引号引用表名 - 本地开发别省略
host,写host=localhost比空着更稳——空着可能走 Unix socket,路径因 PG 版本/系统而异
echo $result 只输出 “Resource id #5”,是因为没取数据
PostgreSQL 查询返回的是 PgSql\Result 对象(PHP 8.1+)或 resource(旧版),不是数组。直接 echo 它毫无意义。
立即学习“PHP免费学习笔记(深入)”;
- 要取一行关联数组:
pg_fetch_assoc($result)(推荐,字段名作 key) - 要取所有行:
pg_fetch_all($result)(大数据集慎用,会吃内存) - 查单条记录常用写法:
if ($row = pg_fetch_assoc($result)) { echo $row['name']; } - 忘了
pg_close($conn)不会立刻出问题,但长期运行的脚本(如 CLI)可能耗尽连接数
PDO 连接失败却没报错,多半是 PDO::ATTR_ERRMODE 没设
默认模式 PDO::ERRMODE_SILENT 下,$stmt->execute() 失败只返回 false,不抛异常也不提示原因。你看到空白页面,其实只是 SQL 执行失败了。
- 创建
PDO实例后立刻加:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) - DSN 必须显式写全:
"pgsql:host=db.example.com;port=5433;dbname=myapp;user=api;password=xxx" - 密码含
@、/等字符要 URL 编码,比如pass@123得写成pass%40123 - 云服务(如 Neon、Supabase)常限制非超级用户访问
pg_catalog,报错可能是permission denied for schema public,不是表不存在
最易被忽略的点:扩展是否启用,只能靠 phpinfo() 或 php -m 验证,光看 PostgreSQL 服务在运行、或者 pgAdmin 能连上,不代表 PHP 能连。连不上先查扩展,再查连接串,最后才怀疑网络或权限。



















