Обсуждение: pg_last_error() doesn't return connection errors
Hi, I can successfully connect to PostgreSQL (pgsql extension). However, when I make a deliberate mistake, I'm unable to capture the connection error with pg_last_error() as one would with the *_last_error() functions of other database extensions. Here is an example: <?php $c = pg_connect('host=127.0.0.1 user=postgres password=xxx dbname=yyy') or var_dump( pg_last_error() ); ?> The following output (with warnings) is returned: Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: password authentication failed for user "postgres" in .. Warning: pg_last_error() [function.pg-last-error]: No PostgreSQL link opened yet in ... bool(false) One would expect pg_last_error() to return "password authentication failed" instead of FALSE! Best regards. Frank
On Thu, 2010-08-26 at 13:44 +0200, Frank Naude wrote: > Hi, > > I can successfully connect to PostgreSQL (pgsql extension). However, > when I make a deliberate mistake, I'm unable to capture the connection > error with pg_last_error() as one would with the *_last_error() > functions of other database extensions. > > Here is an example: > > <?php > $c = pg_connect('host=127.0.0.1 user=postgres password=xxx > dbname=yyy') or var_dump( pg_last_error() ); > ?> > > The following output (with warnings) is returned: > > Warning: pg_connect() [function.pg-connect]: Unable to connect to > PostgreSQL server: FATAL: password authentication failed for user > "postgres" in .. > Warning: pg_last_error() [function.pg-last-error]: No PostgreSQL link > opened yet in ... > bool(false) > > One would expect pg_last_error() to return "password authentication > failed" instead of FALSE! Hi Frank, Presumably pg_last_error() doesn't do anything useful until after the database connection has been made... That behaviour doesn't seem particularly unnatural to me, really, though this seems an unlikely place to be posting a bug about it. If it's a problem for you perhaps you should file a bug with the developer. Alternatively, does pg_errormessage() have the same flaw, or does that give you the error details that you're after? That's what I use in my own code, although I note that in my own code I only log the fact of connection failure, without logging the reason, and I use that for getting the error when a query fails. Perhaps something I should improve :-) Cheers, Andrew. -- ------------------------------------------------------------------------ andrew (AT) morphoss (DOT) com +64(272)DEBIAN Flexibility is overrated. Constraints are liberating. ------------------------------------------------------------------------
Вложения
Hi Andrew, Thank you very much for the reply! > Alternatively, does pg_errormessage() have the same flaw...? Unfortunately pg_errormessage() doesn't work either. It returns: Warning: pg_errormessage() [function.pg-errormessage]: No PostgreSQL link opened yet in... > That behaviour doesn't seem particularly unnatural to me,... It is inconsistent with how the other DB modules behave. I can provide you with some examples if it would help. Best regards. Frank
Hi
Try this function
/**
* @name pg_error
*
* @param pg resource result
* @param pg resource connection
*
* @return string content of the error pg
*
*/
function pg_error($result, $connection)
{
return ($result === false ? pg_last_error($connection) : pg_result_error($result));
}
Regards
Grzegorz Ornoch
On Fri, Aug 27, 2010 at 11:17 AM, Frank Naude <naudefj@gmail.com> wrote:
Hi Andrew,
Thank you very much for the reply!
> Alternatively, does pg_errormessage() have the same flaw...?
Unfortunately pg_errormessage() doesn't work either. It returns:
Warning: pg_errormessage() [function.pg-errormessage]: No PostgreSQL
link opened yet in...
> That behaviour doesn't seem particularly unnatural to me,...
It is inconsistent with how the other DB modules behave. I can provide
you with some examples if it would help.
Best regards.
Frank
--
Sent via pgsql-php mailing list (pgsql-php@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-php
Hi Grzegorz, On Fri, Aug 27, 2010 at 12:22 PM, Grzegorz Ornoch <yanegorz@gmail.com> wrote: > Try this function... Nice function, but since we cannot connect, and we do not have a connection, it wouldn't help much either. Best regards. Frank
Hi Andrew, On Fri, Aug 27, 2010 at 2:01 PM, Andrew McMillan <andrew@morphoss.com> wrote: > Since I've migrated to PDO, and only have a bit of legacy stuff around > that uses pg_* I don't think it will do me any good at all! I really > try to let other people do all of the coding against other databases, so > I can luxuriate in the One True SQL :-) I'm fully aware that the pdo_pgsql works as it should - here is an example: try { $c = new PDO('pgsql:host=127.0.0.1 user=postgres password=xxx dbname=yyy', 'postgres', 'xxx'); } catch (PDOException $e) { var_dump( $e->getMessage() ); } However, the pgsql driver needs some updating or should be deprecated. Best regards. Frank