ConFoo 2025

pg_result_error

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

pg_result_error Obtém mensagem de erro associada ao resultado

Descrição

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

pg_result_error() retorna qualquer mensagem de erro associada à instância de result. Portanto, o usuário tem mais chances de receber a mensagem de erro correta do que com pg_last_error().

A função pg_result_error_field() pode fornecer muito mais detalhes sobre erros de resultados do que pg_result_error().

Porque pg_query() retorna false se a consulta falhar, você deverá usar pg_send_query() e pg_get_result() para obter o identificador do resultado.

Parâmetros

result

Uma instância de PgSql\Result, retornada por pg_query(), pg_query_params() ou pg_execute() (entre outras).

Valor Retornado

Retorna uma string. Retorna uma string vazia se não houver erro. Se houver um erro associado ao parâmetro result, retorna false.

Registro de Alterações

Versão Descrição
8.1.0 O parâmetro result agora espera uma instância de PgSql\Result; anteriormente, um resource era esperado.

Exemplos

Exemplo #1 Exemplo de pg_result_error()

<?php
$dbconn
= pg_connect("dbname=publisher") or die("Não foi possível conectar");

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

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

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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