pg_result_error does NOT work with prepared statements.(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_result_error — Lee el mensaje de error asociado a un resultado
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.
result
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.
| Versión | Descripción |
|---|---|
| 8.1.0 |
El parámetro result ahora espera una instancia de
PgSql\Result ; anteriormente, se esperaba un resource.
|
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);
?>
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;
}You can use pg_set_error_verbosity() to retrieve SQLSTATUS from pg_last_error().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.