tag body attribute php sql exception-handling pdo

php - body - title html css



Preguntas de excepción de DOP-Cómo atraparlos (2)

Preguntas de excepción de DOP - Cómo atraparlos

Como una regla -

NO los atrapes .

Por ejemplo, su código aquí debe escribirse de esta manera

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

sin ningún intento o captura de llamadas. Debido a que no tiene un escenario particular para manejar una excepción aquí (un eco simple apenas cuenta como un escenario de manejo).

En lugar de eso, déjelo caer hasta el controlador de errores de toda la aplicación (no se asuste con el término, PHP ya tiene uno incorporado).

Sin embargo, tengo problemas para detectar los errores que me gustaría (errores como "Duplicar entrada", "Valor nulo", etc. en MySQL).

Solo en el caso de que tenga un escenario determinado , debe usar el operador try-catch, pero siempre debe verificar si el error que recibió es el que esperaba. De lo contrario, habrá que volver a lanzar una excepción:

try { $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data); } catch (PDOException $e) { if ($e->getCode() == 1062) { // Take some action if there is a key constraint violation, i.e. duplicate name } else { throw $e; } }

y por supuesto (ya que resultó ser el gran problema para esta pregunta), tiene que configurar PDO en modo de excepción, ya sea en un parámetro de constructor simplemente agregando el código

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

Justo después de conectar.

Estoy usando PDO para volver a escribir la interfaz de un 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 controladores de errores que tenía eran básicamente copiar y pegar.

Ahora me gustaría hacer esto bien. Sin embargo, tengo problemas para detectar los errores que me gustaría (errores como "Duplicar entrada", "Valor nulo", etc. en MySQL). ¿Qué parte de mi declaración debe estar en el bloque try? ¿Todo debería estar allí? Estoy usando un Include() para conectarme a mi base de datos (que tiene su propio manejo de errores), por lo que es solo la ejecución de la consulta la que tiene errores en este código. No puedo entender por qué no está detectando 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 LO QUE TIENE que estar en el bloque try? ¿Puedo poner la ejecución en el bloque try? Debería detectar el error. Duplicate value "John" in key "name" , pero en su lugar sigue adelante con el mensaje de éxito. (Al intentar agregar dos usuarios "John"). Me registré en PHPMyAdmin; el índice es único y lanza el error como se esperaba, pero no usa este código.


Debes mirar la documentación. Pero si no encuentras nada, puedes agregar otra captura:

<?php 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 "DataBase Error: The user could not be added.<br>".$e->getMessage(); } catch (Exception $e) { echo "General Error: The user could not be added.<br>".$e->getMessage(); } ?>

Esto debe funcionar porque todas las excepciones de los complementos de PHP vienen de la clase nativa de PHP Exception. (Desde 5.0 si mi memoria está bien).