Обсуждение: pg_last_error() doesn't return connection errors

Поиск
Список
Период
Сортировка

pg_last_error() doesn't return connection errors

От
Frank Naude
Дата:
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

Re: pg_last_error() doesn't return connection errors

От
Andrew McMillan
Дата:
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.
------------------------------------------------------------------------


Вложения

Re: pg_last_error() doesn't return connection errors

От
Frank Naude
Дата:
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

Re: pg_last_error() doesn't return connection errors

От
Grzegorz Ornoch
Дата:
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

Re: pg_last_error() doesn't return connection errors

От
Frank Naude
Дата:
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

Re: pg_last_error() doesn't return connection errors

От
Frank Naude
Дата:
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