php - handling - pdo:: error
Cómo ver el error de consulta en PHP PDO (6)
try {
$db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW);
$st = $db->prepare("SELECT * FROM c6ode");
}
catch (PDOException $e){
echo $e->getMessage();
}
¿Cómo puedo verificar el error de mysql para la consulta en el caso anterior?
/ * Provocar un error - la tabla BONES no existe * /
$sth = $dbh->prepare(''SELECT skull FROM bones'');
$sth->execute();
echo "/nPDOStatement::errorInfo():/n";
$arr = $sth->errorInfo();
print_r($arr);
salida
Array
(
[0] => 42S02
[1] => -204
[2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704
)
Debe establecer el atributo de modo de error PDO :: ATTR_ERRMODE a PDO :: ERRMODE_EXCEPTION.
Y dado que espera que el método prepare () arroje la excepción, debe desactivar la función PDO :: ATTR_EMULATE_PREPARES *. De lo contrario, el servidor MySQL no "ve" la declaración hasta que se ejecuta.
<?php
try {
$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 (?)'');
}
catch(Exception $e) {
echo ''Exception -> '';
var_dump($e->getMessage());
}
impresiones (en mi caso)
Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found:
1146 Table ''test.doesnotexist'' doesn''t exist"
ver http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
EMULATE_PREPARES = true parece ser la configuración predeterminada para el controlador pdo_mysql en este momento. La caché de consultas ha sido arreglada / cambiada desde entonces y con el controlador mysqlnd no tuve problemas con EMULATE_PREPARES = false (aunque solo soy un aficionado de php, no confío en mi palabra ...)
*) y luego está PDO::MYSQL_ATTR_DIRECT_QUERY - Debo admitir que no entiendo la interacción de esos dos atributos (¿todavía?), así que los configuro a ambos, como
$pdo = new PDO(''mysql:host=localhost;dbname=test;charset=utf8'', ''localonly'', ''localonly'', array(
PDO::ATTR_EMULATE_PREPARES=>false,
PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));
Estoy usando esto sin ninguna configuración adicional:
if (!$st->execute()) {
print_r($st->errorInfo());
}
Supongo que su queja es que la excepción no es el despido. PDO probablemente está configurado para no lanzar excepciones. Habilítelos con esto:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
esto funciona para mí si obtienes este error:
Error fatal: llamada al método indefinido mysqli :: error ()
if(! empty( $db->error ) ){
echo $db->error; // <- this is not a function call error()
}
https://.com/a/32045823
una forma rápida de ver tus errores mientras pruebas:
$error= $st->errorInfo();
echo $error[2];