php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #64705 errorInfo property of PDOException is null when PDO::__construct() fails
Submitted: 2013-04-24 17:11 UTC Modified: 2017-10-24 08:29 UTC
Votes:6
Avg. Score:4.0 ± 0.8
Reproduced:3 of 4 (75.0%)
Same Version:0 (0.0%)
Same OS:1 (33.3%)
From: christian dot lawrence at calorieking dot com Assigned:
Status: Closed Package: PDO related
PHP Version: 5.3.24 OS:
Private report: No CVE-ID: None
 [2013-04-24 17:11 UTC] christian dot lawrence at calorieking dot com
Description:
------------
PDO::__construct() will always throw a PDOException if the connection fails regardless of which PDO::ATTR_ERRMODE is currently set.  The PDOException has a public property $errorInfo which corresponds to PDO::errorInfo() or PDOStatement::errorInfo().

When PDO::__construct() throws a PDOException say, because of a database server issue, the public property PDOException::$errorInfo is set to NULL and the return value from PDOException::getCode() is not the expected string SQLSTATE error code.

I would have expected a non-NULL PDOException::$errorInfo to be set when the exception is caught.

Test script:
---------------
<?php

// Valid DSN, but with wrong password to trigger the exception
$dsn = 'pgsql:host=localhost;dbname=test;user=foo;password=wrongpass';
try {
  $pdo = new \PDO($dsn, null, null);
} catch (\PDOException $e) {
  var_dump($e->errorInfo);
  var_dump($e->getCode());
  var_dump($e->getMessage());
}

?>

Expected result:
----------------
array(3) {
  [0] =>
  string(5) "08006"
  [1] =>
  int(7)
  [2] =>
  string(53) "FATAL:  password authentication failed for user "foo""
}
string(5) "08006"
string(73) "SQLSTATE[08006] [7] FATAL:  password authentication failed for user "foo""


Actual result:
--------------
NULL
int(7)
string(73) "SQLSTATE[08006] [7] FATAL:  password authentication failed for user "foo""


Patches

Pull Requests

Pull requests:

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2014-01-01 12:32 UTC] felipe@php.net
-Package: PDO related +Package: PDO PgSQL
 [2014-06-04 09:12 UTC] mbeccati@php.net
-Status: Open +Status: Verified -Package: PDO PgSQL +Package: PDO Core
 [2014-06-04 09:12 UTC] mbeccati@php.net
I started writing a new common phpt file in order to check the behaviour of drivers other then pgsql and it seems that pdo_sqlite and pdo_mysql are affected too, so I'm changing the bug type to PDO Core.
 [2017-10-24 08:29 UTC] kalle@php.net
-Package: PDO Core +Package: PDO related
 [2019-02-17 22:36 UTC]
The following pull request has been associated:

Patch Name: Fix #64705 PDO driver constructor throw PDOException but not setting errorInfo
On GitHub:  https://github.com/php/php-src/pull/3843
Patch:      https://github.com/php/php-src/pull/3843.patch
 [2020-08-10 13:28 UTC] corey dot taylor dot fl at gmail dot com
I've run into this same issue recently. When Azure Sql Databases is "paused", the only way to get that error is through the db code. However errorInfo is not set when this PDOException is thrown from PDO::__construct().

I see there is a PR associated. Is there any chance the issue with that PR can be solved for 8.0 if there is an ABI issue?
 [2020-08-11 15:16 UTC] nikic@php.net
Automatic comment on behalf of email@ahmed.ro
Revision: http://git.php.net/?p=php-src.git;a=commit;h=2fe2e5b48f8cf9a45ac2530dd0e2dca8f4287e01
Log: Fix #64705 errorInfo property of PDOException is null when PDO::__construct() fails
 [2020-08-11 15:16 UTC] nikic@php.net
-Status: Verified +Status: Closed
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 15:01:29 2024 UTC