PHP 8.4.0 RC4 available for testing

pg_result_error

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

pg_result_error Liefert die mit der Ergebniskennung verknüpfte Fehlermeldung

Beschreibung

pg_result_error(PgSql\Result $result): string|false

pg_result_error() gibt alle Fehlermeldungen zurück, die mit der result-Instanz verknüpft ist. Aus diesem Grund bekommt man mit pg_result_error() viel eher eine korrekte Fehlermeldung als mit pg_last_error().

Mit pg_result_error_field() bekommt man weitaus genauere Informationen über Fehler als mit pg_result_error().

Weil pg_query() bei einem Fehlschlag nur false zurückgibt, muss man pg_send_query() und pg_get_result() benutzen, um die Ergebniskennung zu erhalten.

Parameter-Liste

result

Eine PgSql\Result-Instanz, die von pg_query(), pg_query_params() oder pg_execute() (unter anderen) zurückgegeben wurde.

Rückgabewerte

Gibt einen string zurück. Ist kein Fehler aufgetreten, ist dies eine leere Zeichenkette. Falls ein Fehler mit dem Parameter result verknüpft ist wird false zurückgegeben.

Changelog

Version Beschreibung
8.1.0 Der Parameter result erwartet nun eine PgSql\Result-Instanz; vorher wurde eine Ressource erwartet.

Beispiele

Beispiel #1 pg_result_error()-Beispiel

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

if (!
pg_connection_busy($dbconn)) {
pg_send_query($dbconn, "select * from doesnotexist;");
}

$res1 = pg_get_result($dbconn);
echo
pg_result_error($res1);
?>

Siehe auch

add a note

User Contributed Notes 4 notes

up
5
spamuser at test dot com
13 years ago
pg_result_error does NOT work with prepared statements.
up
0
VLroyrenn
5 years ago
So considering pg_query and pg_query_params don't return results on error, and that this would be an extremely handy thing to have, I just ended up writing my own functions wrapping the pg_send_* ones to work like the aforementionned two <em>should</em>. There's not a whole lot of code to them, the comments are mostly references from the libPQ and PHP doc, to explain the behavior.

<?php

class PostgresConnectionError extends Exception {
public function
__construct($last_error) {
parent::__construct($message);
}
}

function
pg_send_query_sync($connection, string $query) {
// This function cannot work if any query is already running for that connection because the results may then get mixed up.
assert(pg_get_result($connection) === false);

$dispatch_ok = pg_send_query($connection, $query);

// The *only* case where nothing can be returned, when the connection fails to dispatch the initial query.
if (!$dispatch_ok) throw new PostgresConnectionError(pg_​last_​error($connection));

// From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done."

// In the case of pg_query/PQExec, which we're trying to emulate:
// "Note however that the returned PGresult structure describes only the result of the last command executed from the string."
// "Should one of the commands fail, processing of the string stops with it and the returned PGresult describes the error condition."

while ($result = pg_get_result($connection)) {
// Drain all results on the connection and only return the last one.
if ($last_result) pg_free_result($last_result);
$last_result = $result;
}

assert(is_resource($result) && get_resource_type($result) === "pgsql result");
return
$last_result;
}

function
pg_send_query_params_sync($connection, string $query, array $params) {
// This function cannot work if any query is already running for that connection because the results may then get mixed up.
assert(pg_get_result($connection) === false);

$dispatch_ok = pg_send_query_params($connection, $query, $params);

// The *only* case where nothing can be returned, when the connection fails to dispatch the initial query.
if (!$dispatch_ok) throw new PostgresConnectionError(pg_​last_​error($connection));

// From the libPQ doc : "PQgetResult must be called repeatedly until it returns a null pointer, indicating that the command is done."

// In the case of pg_query_params/PQExecParams, which we're trying to emulate:
// "Unlike PQexec, PQexecParams allows at most one SQL command in the given string. (There can be semicolons in it, but not more than one nonempty command.)"

while ($result = pg_get_result($connection)) {
// Drain all results on the connection, although there should only be one.
if ($last_result) pg_free_result($last_result);
$last_result = $result;
}

assert(is_resource($result) && get_resource_type($result) === "pgsql result");
return
$last_result;
}
up
0
axon dot wp at wp dot pl
18 years ago
You can use pg_set_error_verbosity() to retrieve SQLSTATUS from pg_last_error().
up
0
Anonymous
20 years ago
Because pg_query() returns FALSE if the query fails, you must must use pg_send_query() and pg_get_result() to get the result handle.

PostgreSQL 7.4 introduced a new function called PQresultErrorField() that can be used to get SQLSTATE code from a query, which is far more useful than the error string returned from pg_result_error().
http://www.postgresql.org/docs/7.4/static/libpq-exec.html
http://www.postgresql.org/docs/7.4/static/errcodes-appendix.html

Here's a patch that adds the pg_result_error_field() function to PHP:
http://collapsed.net/patches/php-4.3.5RC3-pg_result_error_field.diff
(To apply the patch cd into your php-4.3.5RC directory and type: patch -p1 </path/to/php-4.3.5RC3-pg_result_error_field.diff)

Example code:
<?php
if(!($db = pg_connect("user=foo password=bar dbname=foobar")))
die(
"pg_connect");

if(!
pg_send_query($db, "SELECT foo FROM bar"))
die(
"pg_send_query");

if(!(
$result = pg_get_result($db)))
die(
"pg_get_result");

echo(
pg_result_error($result) . "<br />\n");

/* only available if you have patched php */
if(function_exists("pg_result_error_field"))
{
$fieldcode = array(
"PGSQL_DIAG_SEVERITY", "PGSQL_DIAG_SQLSTATE",
"PGSQL_DIAG_MESSAGE_PRIMARY", "PGSQL_DIAG_MESSAGE_DETAIL",
"PGSQL_DIAG_MESSAGE_HINT", "PGSQL_DIAG_STATEMENT_POSITION",
"PGSQL_DIAG_CONTEXT", "PGSQL_DIAG_SOURCE_FILE",
"PGSQL_DIAG_SOURCE_LINE", "PGSQL_DIAG_SOURCE_FUNCTION");

foreach(
$fieldcode as $fcode)
{
printf("%s: %s<br />\n",
$fcode,
pg_result_error_field($result, constant($fcode)));
}

pg_free_result($result);
}
?>

<?php pg_result_error_field($result, PGSQL_DIAG_SQLSTATE); ?>
Returns the SQLSTATE code.
To Top