저는 PDO를 사용하여 데이터베이스의 웹 사이트 인터페이스를 다시 작성하고 있습니다. 이전에 mysql 확장을 사용 했었지만 오류 처리에 신경을 쓰지 않았고 기본적으로 복사 - 붙여 넣기가 가능한 오류 처리기는 거의 없었습니다.PDO 예외 질문 - 캐치 방법
이제이 작업을 수행하고 싶습니다. 그러나, 내가 원하는 오류 (예 : "중복 항목", "Null 값"등의 오류)을 잡는 데 문제가 있습니다. 내 진술 중 어느 정도가 try 블록에 있어야합니까? 그것 모두가 거기에 있어야합니까? Include()
을 사용하여 (자체 오류 처리 기능이있는) 내 DB에 연결하므로이 코드에 오류가있는 쿼리 만 실행됩니다.
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();
}
그래서 내 질문 :이이 모든이 try 블록에있을 않는 다음 코드를 실행할 때이 오류를 잡는하지 왜 나는 알아낼 수 없습니다? execute 블록을 try 블록에 넣을 수 있습니까? 오류 Duplicate value "John" in key "name"
을 catch해야하지만 대신 성공 메시지가 표시됩니다. (두 명의 "John"사용자를 추가하려고 할 때). PHPMyAdmin을 체크인했습니다. 색인은 고유하며이 코드를 사용하지 않고 예상대로 오류를 던집니다.
'$ db'의''PDO :: ATTR_ERRMODE''를'PDO :: ERRMODE_EXCEPTION'으로 설정하여 에러시 예외를 던질 필요가 있습니다. – FtDRbwLXw6
문서 또는 소스 코드를 확인하고 어떤 함수가'PDOException'을 던지는지 확인해야합니다. 그럼 당신은 코드의 어떤 부분을 try 블록에 넣을 지 알게 될 것입니다. –
'ATTR_ERRMODE'를 고치면 바보가됩니다. 그러면 명령문의 어느 부분이 try 블록에 있어야합니까? 코드가 재사용 될 수 있습니다 (단지 몇 개의 bindValue() 문이 변경되고 execute가 변경 될 수 있습니다). try 블록에 전체 문장을 사용하면 어떤 이점이 있습니까? 아니면 execute() 만 필요합니까? – StuckAtWork