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 开始,使用默认连接已弃用。

返回值

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

变更日志

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

示例

示例 #1 pg_last_error() 示例

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Could not connect");

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

echo
pg_last_error($dbconn);
?>

参见

添加备注

用户贡献的备注 1 备注

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

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

-死锁错误。这表明 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("Can't connect to database server."));
}
}

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);
?>

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

Tamas
To Top