2011-11-18 28 views
6

Tengo un script PHP con dos errores tipográficos deliberados en la declaración de una consulta SQL:¿Por qué no se detecta el error de excepción de PDO?

try 
{ 
$stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?"); 
$stmt->blindValue(1, $id, PDO::PARAM_INT); 
$stmt->execute(); 
$row = $stmt->fetchColumn(); 
} 
catch(PDOException $err) 
{ 
var_dump($err->getMessage()); 
var_dump($dbh->errorInfo()); 
} 

Sin embargo, el script no detectar el error, incluso después de ajustar atributo a PDO::ERRMODE_EXCEPTION. ¿Que me estoy perdiendo aqui?

ACTUALIZACIÓN:

Este es el guión completo. El segundo error tipográfico blindValue ha sido revertido. El error permanece no detectada:

<?php 

$user= "user"; 
$password = "password"; 
$dsn = "mysql:dbname=Catalogue;host=localhost"; 
$dbh = new PDO($dsn, $user, $password); 
$dbh->setAttribute(PDO::ERRMODE_EXCEPTION); 
$id = 1000; 

try 
{ 
$stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE non-existent_column=?"); 
$stmt->bindValue(1, $id, PDO::PARAM_INT); 
$stmt->execute(); 
$row = $stmt->fetchColumn(); 
} 
catch(PDOException $err) 
{ 
echo "caught"; 
var_dump($err->getMessage()); 
var_dump($dbh->errorInfo()); 
exit(); 
} 

var_dump($stmt); 
var_dump($row); 
echo "uncaught"; 
exit(); 

?> 
+1

Si la excepción termina con el controlador de error predeterminado, ¿puede mostrar el mensaje? También tienes un error tipográfico en '-> blindValue'. Eso llevaría a un error fatal, no una excepción. – mario

+0

@mario, ¿quiere decir el valor predeterminado como en '$ err' agregado anteriormente? Agregué ese también, no hay mensaje de error. La secuencia de comandos omite todo el bloque catch. –

+0

@mario, sí, ese es el segundo error tipográfico. El primero es la columna inexistente. –

Respuesta

11

Su llamada a setAttribute() le falta el primer parámetro:

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

Si no recibió un

Warning: PDO::setAttribute() expects exactly 2 parameters, 1 given 

su error_reporting level es demasiado bajo para un servidor de desarrollo y/o no lo hiciste No pierdas de vista the error log o no configures display_errors=On (siempre que prefieras, prefiero el registro de errores en display_errors).


edit: por favor intente

<?php 
echo 'php version: ', phpversion(), "\n"; 

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    echo 'client version: ', $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n"; 
    echo 'server version: ', $dbh->getAttribute(PDO::ATTR_SERVER_VERSION), "\n"; 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
} 
catch(PDOException $err) { 
    var_dump($err->getMessage()); 
    die('...'); 
} 

$id = 'foo'; 

try 
{ 
    $stmt = $dbh->prepare("SELECT COUNT(*) FROM Product WHERE `non-existent_column`=?"); 
    $stmt->bindValue(1, $id, PDO::PARAM_INT); 
    $stmt->execute(); 
    $row = $stmt->fetchColumn(); 
} 
catch(PDOException $err) 
{ 
    var_dump($err->getMessage()); 
    var_dump($dbh->errorInfo()); 
    die('....'); 
} 

echo 'done.'; 

impreso en mi máquina

php version: 5.3.5 
client version: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $ 
server version: 5.5.8 
string(94) "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'non-existent_column' in 'where clause'" 
array(3) { 
    [0]=> 
    string(5) "42S22" 
    [1]=> 
    int(1054) 
    [2]=> 
    string(54) "Unknown column 'non-existent_column' in 'where clause'" 
} 
.... 
+0

Lo intenté, todavía no está capturado. –

+0

ver edición. Funciona bien en mi máquina ... – VolkerK

+0

También funciona bien en mi máquina. Esta es la respuesta correcta, porque la única razón por la cual una excepción no lo haría t ser capturado (cuando es forzado) es si PDO no está en modo de excepción. Esto lo configura correctamente en modo de excepción y funciona bien en mi copia. +1 para una respuesta adecuada y detallada. –

3
$stmt->blindValue(1, $id, PDO::PARAM_INT); 

Ésta debe ser $stmt->bindValue(1, $id, PDO::PARAM_INT);

No se puede coger errores fatales tales como llamar a una función/método no definido.

+0

@ ThiefMaster, he revertido blindValue a bindValue. El error sigue sin detectarse :( –

-2

He experimentado esto y se dio cuenta que era mi archivo de configuración de PHP.

xdebug.show_exception_trace = 1

excepciones siempre aparecerá si esto es cierto.

Cuestiones relacionadas