PHP连接PostgreSQL失败且pg_last_error返回空时如何获取错误信息
问题原因
pg_last_error() 函数需要传入有效的PostgreSQL连接资源作为参数才能返回对应连接的错误信息,当pg_connect()执行失败时,返回的是布尔值false,没有可用的连接资源传入,因此无法拿到错误内容;而pg_result_error()是针对查询结果资源返回错误的,本身就不适用于连接阶段的错误排查。
解决方法
- 方法1:调用无参数的
pg_last_error()/pg_last_error_msg()
PHP 5.1+ 支持无参数调用pg_last_error(),会返回最近一次任何PG连接操作产生的错误信息,PHP 7.0+ 还新增了pg_last_error_msg()专门用于获取全局的PG操作错误,连接失败时可以直接调用,修改后的代码参考:$sConn_string = "host=localhost port=5432 dbname=mydb user=postgres password=mypassword"; $db = pg_connect($sConn_string); if (!$db) { // PHP7+优先用pg_last_error_msg() echo "连接错误:" . pg_last_error_msg(); // 也可以无参数调用pg_last_error() // echo "连接错误:" . pg_last_error(); } - 方法2:开启PHP错误显示捕获连接警告
pg_connect()失败时默认会抛出E_WARNING级别的PHP警告,你可以临时开启错误显示直接拿到报错,在代码顶部添加以下配置:
执行后就能直接在输出中看到连接失败的具体原因,比如端口不通、账号密码错误、数据库不存在等。ini_set('display_errors', 1); error_reporting(E_ALL); - 方法3:查看PHP错误日志
如果是生产环境不方便开启错误显示,可以直接查看PHP的错误日志文件,连接失败的警告默认会写入日志,日志路径可以通过phpinfo()中的error_log配置项确认。
额外排查建议
- 连接字符串末尾不要留多余空格,避免部分低版本PG客户端解析异常
- 先在服务器本地用
psql命令行工具使用相同的连接参数测试连接,排除PG服务本身的问题 - 确认PHP的pgsql扩展已正确安装启用,可以用
extension_loaded('pgsql')做校验
内容的提问来源于stack exchange,提问作者Noroti
相关产品推荐
相关产品推荐

