If your query is successful, PDO::errorInfo() still returns an array. For MySQL 5.x, I get the following...
Array
(
[0] => 00000
[1] =>
[2] =>
)(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDOStatement::errorInfo β ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠ΅ΠΉ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° PDOStatement
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
PDOStatement::errorInfo() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° PDOStatement. ΠΠ°ΡΡΠΈΠ² ΡΠΎΡΡΠΎΠΈΡ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ:
| ΠΠ»Π΅ΠΌΠ΅Π½Ρ | ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ |
|---|---|
| 0 | ΠΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ SQLSTATE (ΠΏΡΡΠΈΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Π±ΡΠΊΠ² ΠΈ ΡΠΈΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ ANSI SQL). |
| 1 | ΠΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ. |
| 2 | Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ. |
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠ²ΠΎΠ΄ ΠΏΠΎΠ»Π΅ΠΉ errorInfo() ΠΏΡΠΈ PDO_ODBC ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊ DB2
<?php
/* Π‘ΠΏΡΠΎΠ²ΠΎΡΠΈΡΡΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ -- ΡΠ°Π±Π»ΠΈΡΡ BONES Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ */
$sth = $dbh->prepare('SELECT skull FROM bones');
$sth->execute();
echo "\nPDOStatement::errorInfo():\n";
$arr = $sth->errorInfo();
print_r($arr);
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
PDOStatement::errorInfo():
Array
(
[0] => 42S02
[1] => -204
[2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704
)
If your query is successful, PDO::errorInfo() still returns an array. For MySQL 5.x, I get the following...
Array
(
[0] => 00000
[1] =>
[2] =>
)Seriously errorInfo is your friend. Use it.
If these look like your google searches then you need errorInfo
"no database error showing in php"
"pdo selects from database but wont insert"
"pdo insert not working"
"isnt pdo just a big hype, should I go back to mysql?"
"how much do surgeons make?"
Trust me it will definitely save you hours of insanity if you make it a habit to use it in development. Forget E-ALL, it failed me since well, E-ALL apparently doesn't know that I didn't set a default value in my MySQL table and my query wasnt adding anything to it. So always do this
<?php
$sql = 'do something on a mysql table where foo = :bar';
$stmt = prepare($sql);
$stmt->bindValue(':bar', $foo, PDO::PARAM_[DATA TYPE]);
$stmt->execute();
// very important during development. But take it off in production
$foo_arr = $stmt->errorInfo();
print_r($foo_arr);
//Sample print_r return
/*
Array(
[0] => HY000
[1] => 1364
[2] => Field 'phone' doesn't have a default value
)
Never have I been so happy to see an error
*/
?>
While its common practice for any decent developer to always watch out and try to catch for errors, even the best of us make mistakes. This is not a replacement for exceptions, but the simplicity is priceless.Ansi sql state Error codes can be found here:
https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm