Estoy usando PDO para volver a escribir una interfaz de sitio web para una base de datos. Solía usar la extensión mysql, pero nunca me había molestado con el manejo de errores, y los pocos manejadores de errores que tenía eran básicamente copiar y pegar.PDO Exception Questions - Cómo atraparlos
Ahora me gustaría hacer esto bien. Sin embargo, tengo problemas para detectar los errores de la forma en que me gustaría (errores como "Entrada duplicada", "Valor nulo", etc. en MySQL). ¿Cuánto de mi declaración debe estar en el bloque de prueba? ¿Debería estar todo allí? Estoy usando un Include()
para conectarme a mi DB (que tiene su propio manejo de errores), por lo que solo la ejecución de la consulta tiene errores en este código. No puedo entender por qué no se captura un error al ejecutar el siguiente código:
try {
$stmt = $db->prepare("INSERT INTO tbl_user (id, name, password, question, answer) VALUES (NULL, :name, :password, :question, :answer)");
$stmt->bindValue(":name", $_POST['name']);
$stmt->bindValue(":password", $_POST['password']);
$stmt->bindValue(":question", $_POST['question']);
$stmt->bindValue(":answer", $_POST['answer']);
$stmt->execute();
echo "Successfully added the new user " . $_POST['name'];
} catch (PDOException $e) {
echo "The user could not be added.<br>".$e->getMessage();
}
Así que mis preguntas: ¿Todo eso tiene que estar en el bloque try? ¿Puedo poner la ejecución en el bloque de prueba? Debería detectar el error Duplicate value "John" in key "name"
, pero en su lugar continúa con el mensaje de éxito. (Al intentar agregar dos usuarios "John"). Revisé en PHPMyAdmin; el índice es único y arroja el error como se esperaba, simplemente no usa este código.
Si aún no lo ha hecho, tendrá que configurar '$ db''s' PDO :: ATTR_ERRMODE' a 'PDO :: ERRMODE_EXCEPTION' para que arroje excepciones en los errores. – FtDRbwLXw6
Debe verificar la documentación o el código fuente y ver qué funciones arrojan la 'PDOException'. Entonces sabrá qué partes del código poner en el bloque try :) –
Me siento tonto ... estableciendo el 'ATTR_ERRMODE' solucionado. Entonces, ¿cuánto de la declaración debería estar en el bloque try? El código podría reutilizarse (solo tal vez algunas declaraciones bindValue() cambiarían, luego la ejecución). ¿Hay algún beneficio en tener la declaración completa en el bloque de prueba o solo es necesario ejecutar()? – StuckAtWork