61

I can't seem to get any error message from PDO:

#$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
try {
  $sth = $dbh->prepare('@$%T$!!!');
  print_r($sth);
  print_r($dbh->errorInfo());
} catch (PDOException $e) {
    echo $e->getMessage();
}

It is giving out only:

PDOStatement Object
(
    [queryString] => @$%T$!!!
)
Array
(
    [0] => 00000
    [1] =>
    [2] =>
)

setAttribute doesn't help anything.

It's PHP 5.3.3 Apache 2.0 Handler
PDO Driver for MySQL enabled
Client API version mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $

What can I do to get error information?

2
  • What does print_r($sth->errorInfo()) prints out ? Commented Sep 16, 2010 at 12:21
  • @shamittomar I have tried it too, it giving out an array of 3 empty elements Commented Sep 16, 2010 at 12:27

4 Answers 4

65

setAttribute will cause PDO to throw up errors or exceptions - the latest when you execute the query.

For emulated prepared statements, there is no check in prepare():

Emulated prepared statements does not communicate with the database server so PDO::prepare() does not check the statement.

But there will be one in execute() when the query gets sent to the server.

However, the mySQL driver supports native prepared statements since mySQL 4.1 anyway, so this shouldn't apply. Using

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

must cause an exception for the query you use.

Sign up to request clarification or add additional context in comments.

6 Comments

man page example doesn't execute either: ru2.php.net/manual/en/pdo.errorinfo.php and with execute still no luck
@Col what if you set $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );?
@Col If you set ERRMODE_EXCEPTION and there are no exceptions neither from prepare() nor exec() then something else is wrong - in that case, I have no idea what
this one worked. Add it to the answer please, so I can accept it. though it still puzzling me, why errorInfo() doesn't work
Emulated prepare statements seems to be turned on by default for Mysql PDO.... for some reason. You have to explicitly turn emulation off.
|
5

I too was trying to get the information from errorInfo() at the database handle level, but I ended up getting the information from the statement level with PDOStatement::errorInfo()

Per PHP web site:

PDO::errorInfo() only retrieves error information for operations performed directly on the database handle. If you create a PDOStatement object through PDO::prepare() or PDO::query() and invoke an error on the statement handle, PDO::errorInfo() will not reflect the error from the statement handle. You must call PDOStatement::errorInfo() to return the error information for an operation performed on a particular statement handle.

Comments

4

This will print error code as well its corresponding detailed message.

Advice: this is just a demonstration. Just use for debugging purpose. Don't enable to show error messages to the public in a release version.

try{
connection=$this->get_connection();//here i brought my connection string
connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
/**
Do your works here..
//$statement=$connection->prepare($sql);
//if you are using errorInfo use after prepare statement before execute.here in this method i am not using it.
//print_r($statement->errorInfo());
**/

$statement->execute();
}
catch(PDOException $e) {
              //this will echo error code with detail
              //example: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'nasme' in 'field list'
              echo $e->getMessage();
            }
//$statement=null;

3 Comments

i don't understand why my answer was edited so badly n minus voted(-) as we know it was a demonstration of how to do something. its the only way to accomplish it while debugging the code. it shows detailed error message with error code.now i don't seem this answer is anything :/ why not delete it ..
Ah, you've restored the original code - fair enough. If it gets modified in a way that changes your intent again, please raise a moderator flag rather than engaging in an edit war - thanks. I'll fix the all-caps - we have a 'no shouting' rule here :-)
@YourCommonSense: please leave this answer alone. It already has a moderator report. If you have some feedback for the solution, feel free to expand upon the link you have provided in a comment.
3

You need to first execute the query and then check for errors: So do it like this:

 $sth->execute();

and then check for errors. Then you will get errors, if any.

1 Comment

which is, after all, what the question is about. Why was this posted as answer, and not a comment? And why did it get so many upvotes?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.