TPSstar
TPSstar

Reputation: 881

How to get a query error from prepare() in PDO PHP?

    $st = $db->prepare("SELECT * FROM c6ode");

How can I check the intentional mysql error for the query in above case?

Upvotes: 82

Views: 141559

Answers (5)

VolkerK
VolkerK

Reputation: 96159

You need to set the error mode attribute PDO::ATTR_ERRMODE to PDO::ERRMODE_EXCEPTION.

And since you expect the exception to be thrown by the prepare() method, you should disable the PDO::ATTR_EMULATE_PREPARES feature. Otherwise the MySQL server doesn't "see" the statement until it's executed.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');

prints (or logs, depends on the PHP settings)

SQLSTATE[42S02]: Base table or view not found: 
1146 Table 'test.doesnotexist' doesn't exist

Upvotes: 79

Timothy Nwanwene
Timothy Nwanwene

Reputation: 1033

/* Provoke an error -- the BONES table does not exist */

$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();

echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);

output

Array
(
    [0] => 42S02
    [1] => -204
    [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N  "DANIELS.BONES" is an undefined name.  SQLSTATE=42704
)

Upvotes: 3

ladar
ladar

Reputation: 5876

I'm using this without any additional settings:

if (!$st->execute()) {
    print_r($st->errorInfo());
}

Upvotes: 56

Lan
Lan

Reputation: 1892

a quick way to see your errors whilst testing:

$error= $st->errorInfo();
echo $error[2];

Upvotes: 14

Steve Rukuts
Steve Rukuts

Reputation: 9367

I'm guessing that your complaint is that the exception is not firing. PDO is most likely configured to not throw exceptions. Enable them with this:

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

Upvotes: 25

Related Questions