I’m using PDO to re-write a website interface for a database. I used to use the mysql extension, but I had never bothered with error handling, and the few error handlers I had were basically copy-paste.
Now I’d like to do this right. However, I’m having issues catching the errors how I’d like (errors like “Duplicate Entry”, “Null Value” etc in MySQL). How much of my statement needs to be in the try block? Should all of it be in there? I’m using an Include()
to connect to my DB (which has its own error handling), so it’s only the query execution which has errors in this code. I can’t figure out why it’s not catching an error when executing the following code:
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(); }
So my questions: does ALL OF THAT have to be in the try block? Can I just put the execute in the try block? It should catch the error Duplicate value "John" in key "name"
, but instead goes through with the success message. (When trying to add two “John” users). I checked in PHPMyAdmin; the index is unique and does throw the error as expected, just not using this code.
Advertisement
Answer
You should look at the documentation. But If you dont find anything, you can add another catch :
<?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(); } ?>
This must work because all exceptions of PHP plugins herits from the Exception native PHP class. (Since 5.0 if my memory is well).