statement handling error ejemplos clase php mysql pdo

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];