Why PDO Exception Error Not Caught?

17,044

Solution 1

Your call to setAttribute() lacks the first parameter:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

If you didn't get a

Warning: PDO::setAttribute() expects exactly 2 parameters, 1 given

your error_reporting level is too low for a development server and/or you didn't keep an eye on the error log or didn't set display_errors=On (which ever you prefer; I prefer the error log over display_errors).


edit: please try

<?php
echo 'php version: ', phpversion(), "\n";

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');  
    echo 'client version: ', $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n";
    echo 'server version: ', $dbh->getAttribute(PDO::ATTR_SERVER_VERSION), "\n";
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch(PDOException $err) {
    var_dump($err->getMessage());
    die('...');
}

$id = 'foo';

try
{
    $stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE `non-existent_column`=?");
    $stmt->bindValue(1, $id, PDO::PARAM_INT);
    $stmt->execute();
    $row = $stmt->fetchColumn();
}
catch(PDOException $err)
{
    var_dump($err->getMessage());
    var_dump($dbh->errorInfo());
    die('....');
}

echo 'done.';

printed on my machine

php version: 5.3.5
client version: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $
server version: 5.5.8
string(94) "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'non-existent_column' in 'where clause'"
array(3) {
  [0]=>
  string(5) "42S22"
  [1]=>
  int(1054)
  [2]=>
  string(54) "Unknown column 'non-existent_column' in 'where clause'"
}
....

Solution 2

$stmt->blindValue(1, $id, PDO::PARAM_INT);

This should be $stmt->bindValue(1, $id, PDO::PARAM_INT);

You cannot catch Fatal Errors such as calling an undefined function/method.

Share:
17,044
Question Overflow
Author by

Question Overflow

I don't have any formal education on programming. I guess it is the passion that gets me started and keeps me going. Thanks everybody for sharing your knowledge. Don't worry, I am no critic. I see no wrong answer, only good and not so good answers. All are welcome to learn and to share.

Updated on June 14, 2022

Comments

  • Question Overflow
    Question Overflow almost 2 years

    I have a PHP script with two deliberate typo mistakes in the statement for an SQL query:

    try
    {
     $stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?");
     $stmt->blindValue(1, $id, PDO::PARAM_INT);
     $stmt->execute();
     $row = $stmt->fetchColumn();
    }
    catch(PDOException $err)
    {
     var_dump($err->getMessage());
     var_dump($dbh->errorInfo());
    }
    

    However, the script does not catch the error even after setting attribute to PDO::ERRMODE_EXCEPTION. What am I missing here?

    UPDATE:

    This is the full script. The second typo blindValue has been reverted back. The error remains uncaught:

    <?php
    
    $user= "user";
    $password = "password";
    $dsn = "mysql:dbname=Catalogue;host=localhost";
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ERRMODE_EXCEPTION); 
    $id = 1000;
    
    try
    {
     $stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?");
     $stmt->bindValue(1, $id, PDO::PARAM_INT);
     $stmt->execute();
     $row = $stmt->fetchColumn();
    }
    catch(PDOException $err)
    {
     echo "caught";
     var_dump($err->getMessage());
     var_dump($dbh->errorInfo());
     exit();
    }
    
    var_dump($stmt);
    var_dump($row);
    echo "uncaught";
    exit();
    
    ?>
    
  • Question Overflow
    Question Overflow over 12 years
    @ ThiefMaster, I have reverted blindValue back to bindValue. The error remains uncaught :(
  • N.B.
    N.B. over 12 years
    Works fine on my machine also. This is the right answer, because the only reason why an exception wouldn't be caught (when forced) is if PDO isn't in exception mode. This properly sets it in exception mode and works fine on my copy. +1 for a proper and detailed answer.
  • Question Overflow
    Question Overflow over 12 years
    It works fine for me too. But I couldn't find where I had gone wrong with my script. Anyway, thanks. I will look into it further.