Mors
Mors

Reputation: 35

PHP PDOException not catching

I need some guidance on PDO error handling.

I got this code:

<?php
$config = include('config.php');

try{
    $handler = new PDO('mysql:host-127.0.0.1;dbname=not_a_valid_dbname', $config->username, $config->password);
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Yup!';
}catch(PDOException $e){
    echo 'Caught! '.$e->getMessage();
}

As you can see I provided an unvalid db name. This page outputs 'Yup!' instead of letting me know that there is no such database. Same goes when changing 'mysql:not_valid_host'. Only when I change driver name it throws an error letting me know that there is no driver by that name.

I tried:

Checking php.ini for settigs (I have hard time getting around with this)

Adding

error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);

Adding

ini_set('display_errors',true);

Also tried adding a backslash in catch param:

catch(\PDOException $e)

Still the same result. Help me break my code :D

Upvotes: 1

Views: 192

Answers (1)

ishegg
ishegg

Reputation: 9927

The documentation is very unclear, but I've made some tests and drawn some conclusions. This is pure speculation. I'll try to back some of these claims up if I find further information.

  • If host is not present, localhost is then assumed.
  • Database name is not mandatory. This is, I imagine, so you can connect to a server and create a new database through PDO.
  • If you have a syntax error, the string will stop being considered thereafter.

With those suppositions, we can assume why your code is working the way it is. Your DSN is:

mysql:host-127.0.0.1;dbname=not_a_valid_dbname

Since there's a syntax error (- after host), neither of the parameters are considered, and there's no DB selected, with the host being localhost. This is why you get no errors. If you delete the host parameter, however:

mysql:dbname=not_a_valid_dbname

localhost is used as host (selected by default), but not_a_valid_dbname is tried as the database, which results in

Caught! SQLSTATE[HY000] [1049] Unknown database '1234'

mysql:not_valid_host would be the same case as the first example. The DSN is invalid so localhost is assumed with no database selected.

Further, you get no error because no actual DB is selected but you didn't try to run a query. As soon as you do,

try {
    $handler = new PDO('mysql:', "root", "root");
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $handler->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $handler->query("SELECT * FROM test");
    echo 'Yup!';
} catch(PDOException $e) {
    echo 'Caught! '.$e->getMessage();
}

You'll get an PDOException, as expected:

Caught! SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

Like I said, all of this is speculation as I couldn't really find concrete evidence on most of this. I hope this guides you in the right direction. I'll keep looking for more information and edit if I find anything.

Upvotes: 2

Related Questions