¿Cómo obtener un error de consulta de prepare () en PDO PHP?

2 minutos de lectura

Avatar de usuario de TPSstar
TPS estrella

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

¿Cómo puedo verificar el error mysql intencional para la consulta en el caso anterior?

Avatar de usuario de VolkerK
VolkerK

Debe establecer el atributo de modo de error PDO::ATTR_ERRMODE a PDO::ERRMODE_EXCEPTION.

Y dado que espera que la excepción sea lanzada por el prepare() método, debe deshabilitar el PDO::ATTR_EMULATE_PREPARES característica. De lo contrario, el servidor MySQL no “verá” la declaración hasta que se ejecute.

<?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 (?)');

imprime (o registra, depende de la configuración de PHP)

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

  • ¿Por qué usar Try/Catch cuando PDO atrapa el error de todos modos?

    – Chiwda

    26 de junio de 2022 a las 17:46

avatar de usuario de ladar
ladar

Estoy usando esto sin ninguna configuración adicional:

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

  • Sigue siendo la mejor respuesta 8 años después.

    – Petro

    4 de diciembre de 2020 a las 14:18

  • Perfecto para 2021

    – Arun Maurya

    1 de junio de 2021 a las 7:48

  • @Petro en ninguna parte es el “mejor” tan pronto como terminas tu sandbox de aprendizaje y te das cuenta de que en el producción el código debe ser nada como eso.

    – Tu sentido común

    hace 2 días

Supongo que su queja es que la excepción no se dispara. Lo más probable es que PDO esté configurado para no generar excepciones. Habilítelos con esto:

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

  • No, todavía no funciona, sé que mi consulta es incorrecta, pero quiero mostrar ese error.

    – TPS estrella

    8 de enero de 2012 a las 8:48

  • Es posible que encuentre que hay un error con la llamada a new PDO(... sí mismo. Intente aumentar el nivel de error_reporting estableciendo, por ejemplo, error_reporting(E_ALL).

    –Steve Rukuts

    8 de enero de 2012 a las 8:49

una forma rápida de ver sus errores mientras prueba:

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

/* 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);

producción

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

  • Error no detectado: llamada a función indefinida errorInfo ()

    – Kwnstantinos Nikoloutsos

    14 dic 2019 a las 15:00

  • Error no detectado: llamada a función indefinida errorInfo ()

    – Kwnstantinos Nikoloutsos

    14 dic 2019 a las 15:00

¿Ha sido útil esta solución?