PHP Conference Japan 2024

pg_last_error

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_last_error获取连接的最后一条错误消息字符串

描述

pg_last_error(?PgSql\Connection $connection = null): string

pg_last_error() 返回给定 connection 的最后一条错误消息。

内部 PostgreSQL (libpq) 函数调用可能会覆盖错误消息。如果在 PostgreSQL 模块函数内发生多个错误,它可能无法返回合适的错误消息。

使用 pg_result_error()pg_result_error_field()pg_result_status()pg_connection_status() 可获得更好的错误处理。

注意:

此函数以前称为 pg_errormessage()

参数

connection

一个 PgSql\Connection 实例。当 connectionnull 时,使用默认连接。默认连接是 pg_connect()pg_pconnect() 最后建立的连接。

警告

从 PHP 8.1.0 开始,使用默认连接已弃用。

返回值

一个 string,包含给定 connection 上的最后一条错误消息。

变更日志

版本 描述
8.1.0 connection 参数现在需要一个 PgSql\Connection 实例;以前需要一个 resource
8.0.0 connection 现在可以为空。

范例

示例 #1 pg_last_error() 示例

<?php
$dbconn
= pg_connect("dbname=publisher") or die("无法连接");

// 查询失败
$res = pg_query($dbconn, "select * from doesnotexist");

echo
pg_last_error($dbconn);
?>

参见

添加注释

用户贡献的注释 1 条注释

5
Tamas Bolner
14 年前
从实际角度来看,使用事务时存在两种类型的错误消息

-“普通”错误:在这种情况下,应用程序应停止当前进程并向用户显示错误消息。

-死锁错误。这表明 PostgreSQL 的死锁检测过程发现了一个依赖循环,并通过回滚其中一个进程中的事务来打破它,该进程会收到此错误消息。在这种情况下,应用程序不应停止,而应重复事务。

我没有找到区分这两种情况的明确方法。此接口不支持错误代码,因此我们必须在消息文本中搜索模式。

这是一个 PostgreSQL 数据库连接类的示例。它在“普通”错误时抛出 PostgresException,在死锁中断时(需要重复事务)抛出 DependencyException。

postgres.php
<?php
class PostgresException extends Exception {
function
__construct($msg) { parent::__construct($msg); }
}

class
DependencyException extends PostgresException {
function
__construct() { parent::__construct("deadlock"); }
}

class
pg {
public static
$connection;

private static function
connect() {
self::$connection = @pg_connect("dbname=foodb user=foouser password=foopasswd");
if (
self::$connection === FALSE) {
throw(new
PostgresException("无法连接到数据库服务器。"));
}
}

public static function
query($sql) {
if (!isset(
self::$connection)) {
self::connect();
}

$result = @pg_query(self::$connection, $sql);
if (
$result === FALSE) {
$error = pg_last_error(self::$connection);
if (
stripos($error, "deadlock detected") !== false) throw(new DependencyException());

throw(new
PostgresException($error.": ".$sql));
}

$out = array();
while ( (
$d = pg_fetch_assoc($result)) !== FALSE) {
$out[] = $d;
}

return
$out;
}
}
?>

它应该以这种方式使用

test.php
<?php
include("postgres.php");

do {
$repeat = false;
try {
pg::query("begin");

...

$result = pg::query("SELECT * FROM public.kitten");

...

pg::query("commit");
}
catch (
DependencyException $e) {
pg::query("rollback");
$repeat = true;
}
} while (
$repeat);
?>

正常的错误应该在前端捕获。

塔马什
To Top