pg_last_error() doesn't return connection errors

Lists: Postg윈 토토SQL : Postg윈 토토SQL 메일 링리스트 : 2010-08-26 이후 PGSQL-PHP
From: Frank Naude <naudefj(at)gmail(dot)com>
To: pgsql-php(at)postgresql(dot)org
Subject: pg_last_error() doesn't return connection errors
Date: 2010-08-26 11:44:44
Message-ID: AANLkTikUeGfaaOwsDav2GyD=tq7__70jQT_G4KhQbA8n@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg윈 토토SQL : Postg윈 토토SQL 메일 링리스트 : 2010-08-26 이후 PGSQL-PHP

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


From: Andrew McMillan <andrew(at)morphoss(dot)com>
To: Frank Naude <naudefj(at)gmail(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: pg_last_error() doesn't return connection errors
Date: 2010-08-26 22:44:33
Message-ID: 1282862673.3487.3674.camel@happy.home.mcmillan.net.nz
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-php

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.
------------------------------------------------------------------------


From: Frank Naude <naudefj(at)gmail(dot)com>
To: Andrew McMillan <andrew(at)morphoss(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: pg_last_error() doesn't return connection errors
Date: 2010-08-27 09:17:18
Message-ID: AANLkTikSx4sAmvPb0Wwo01JTnN+WPFXC2ZzNtS1Kw=f=@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-php

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


From: Grzegorz Ornoch <yanegorz(at)gmail(dot)com>
To: Frank Naude <naudefj(at)gmail(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: pg_last_error() doesn't return connection errors
Date: 2010-08-27 10:22:40
Message-ID: AANLkTinGNuVN3wWe2u08x5MhWtBOV--=71FCCMvrbksv@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-php

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(at)gmail(dot)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(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-php
>


From: Frank Naude <naudefj(at)gmail(dot)com>
To: Grzegorz Ornoch <yanegorz(at)gmail(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: pg_last_error() doesn't return connection errors
Date: 2010-08-27 12:26:33
Message-ID: AANLkTi=tc8audB46SdQqnmnNLPhvo9Dp-z0ONMxdLBUO@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-php

Hi Grzegorz,

On Fri, Aug 27, 2010 at 12:22 PM, Grzegorz Ornoch <yanegorz(at)gmail(dot)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


From: Frank Naude <naudefj(at)gmail(dot)com>
To: Andrew McMillan <andrew(at)morphoss(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: pg_last_error() doesn't return connection errors
Date: 2010-08-27 12:33:41
Message-ID: AANLkTikf8JXMHqWg060jmcqyNBv+deSAs-m5nOnak_GH@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-php

Hi Andrew,

On Fri, Aug 27, 2010 at 2:01 PM, Andrew McMillan <andrew(at)morphoss(dot)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