pg_result_error

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

pg_result_error Lee el mensaje de error asociado a un resultado

Descripción

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

pg_result_error() devuelve el mensaje de error asociado al resultado result. Por consiguiente, es probable que se obtenga un mensaje de error más apropiado que mediante pg_last_error().

La función pg_result_error_field() puede proporcionar muchos más detalles sobre los errores que pg_result_error().

Dado que pg_query() devuelve false si la consulta falla, se debe utilizar pg_send_query() y pg_get_result() para recuperar el recurso de resultado.

Parámetros

result

An PgSql\Result instance, returned by pg_query(), pg_query_params() or pg_execute()(among others).

Valores devueltos

Devuelve un string. Devuelve una cadena vacía si no hay ningún error. Si hay un error asociado con el parámetro result, se devolverá false.

Historial de cambios

Versión Descripción
8.1.0 The result parameter expects an PgSql\Result instance now; previously, a recurso was expected.

Ejemplos

Ejemplo #1 Ejemplo con pg_result_error()

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Conexión imposible");

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

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

Ver también

add a note

User Contributed Notes 4 notes

up
5
spamuser at test dot com
14 years ago
pg_result_error does NOT work with prepared statements.
up
0
VLroyrenn
6 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
19 years ago
You can use pg_set_error_verbosity() to retrieve SQLSTATUS from pg_last_error().
up
0
Anonymous
21 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