pg_last_error

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

pg_last_errorLiefert die letzte Fehlermeldung einer Verbindung

Beschreibung

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

pg_last_error() gibt die letzte Fehlermeldung der durch connection gegebenen Verbindung als String zurück.

Fehlermeldungen können durch interne PostgreSQL- (libpq) Funktionsaufrufe überschrieben werden. Falls mehrere Fehler innerhalb einer internen PostgreSQL-Funktion auftreten, wird möglicherweise keine passende Fehlermeldung angezeigt.

Verwenden Sie pg_result_error(), pg_result_error_field(), pg_result_status() und pg_connection_status() um genauere Fehlermeldungen zu erhalten.

Hinweis:

Diese Funktion ersetzt die Funktion pg_errormessage().

Parameter-Liste

connection

Eine PgSql\Connection-Instanz. Falls connection null ist, wird die Standardverbindung benutzt. Das ist die zuletzt mit pg_connect() oder pg_pconnect() aufgebaute Verbindung.

Warnung

Seit PHP 8.1.0 ist die Verwendung der Standardverbindung veraltet.

Rückgabewerte

Ein string, der die letzte Fehlermeldung der aktuellen connection enthält.

Changelog

Version Beschreibung
8.1.0 Der Parameter connection erwartet nun eine PgSql\Connection-Instanz; vorher wurde eine Ressource erwartet.
8.0.0 connection ist jetzt nullbar.

Beispiele

Beispiel #1 pg_last_error()-Beispiel

<?php
$dbconn
= pg_connect("dbname=publisher") or die("konnte nicht verbinden");

// Eine Abfrage, die fehlschlägt
$res = pg_query($dbconn, "select * from doesnotexist");

echo
pg_last_error($dbconn);
?>

Siehe auch

add a note add a note

User Contributed Notes 1 note

up
5
Tamas Bolner
14 years ago
From a practical view there are two types of error messages when using transactions:

-"Normal" errors: in this case, the application should stop the current process and show an error message to the user.

-Deadlock errors. This shows that the deadlock detection process of PostgreSQL found a circle of dependency, and broke it by rolling back the transaction in one of the processes, which gets this error msg. In this case, the application should not stop, but repeat the transaction.

I found no discrete way to find out which case are we dealing with. This interface doesn't support error codes, so we have to search for patterns in the message text.

Here is an example for PostgreSQL database connection class. It throws a PostgresException on "normal" errors, and DependencyException in the case of a broken deadlock, when we have to repeat the transaction.

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

It should be used in this way:

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

The normal errors should be caught at the frontend.

Tamas
To Top