Do chế độ lỗi được đề xuất nhiều nhất cho PDO ERRMODE_EXCEPTION
, không có execute()
xác minh kết quả trực tiếp nào hoạt động . Vì việc thực thi mã thậm chí sẽ không đạt được điều kiện được cung cấp trong các câu trả lời khác.
Vì vậy, có ba trường hợp có thể xảy ra để xử lý kết quả thực thi truy vấn trong PDO:
- Để cho biết thành công, không cần xác minh. Chỉ cần tuân theo quy trình chương trình của bạn.
- Để xử lý lỗi không mong muốn, hãy giữ nguyên tương tự - không cần mã xử lý ngay lập tức. Một ngoại lệ sẽ được đưa ra trong trường hợp có lỗi cơ sở dữ liệu và nó sẽ xuất hiện trong trình xử lý lỗi trên toàn trang web và cuối cùng sẽ dẫn đến một trang lỗi chung 500.
- Để xử lý lỗi mong đợi, chẳng hạn như khóa chính trùng lặp và nếu bạn có một tình huống nào đó để xử lý lỗi cụ thể này, hãy sử dụng
try..catch
toán tử.
Đối với một người dùng PHP thông thường, nó có vẻ hơi xa lạ - thế này, không phải để xác minh kết quả trực tiếp của thao tác? - nhưng đây chính xác là cách hoạt động của các ngoại lệ - bạn kiểm tra lỗi ở một nơi khác. Một lần cho tất cả. Tiện lợi vô cùng.
Vì vậy, tóm lại: trong một mã thông thường, bạn không cần phải xử lý lỗi nào cả. Chỉ cần giữ nguyên mã của bạn:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever
Khi thành công, nó sẽ cho bạn biết như vậy, nếu có lỗi, nó sẽ hiển thị cho bạn trang lỗi thường xuyên mà ứng dụng của bạn đang hiển thị cho một trường hợp như vậy.
Chỉ trong trường hợp bạn có một tình huống xử lý khác ngoài việc báo cáo lỗi, hãy đặt câu lệnh chèn của bạn vào một try..catch
toán tử, kiểm tra xem đó có phải là lỗi bạn mong đợi hay không và xử lý nó; hoặc - nếu lỗi là bất kỳ khác nào - hãy ném lại ngoại lệ, để trình xử lý lỗi trên toàn trang có thể xử lý theo cách thông thường. Dưới đây là mã ví dụ từ bài viết của tôi về xử lý lỗi với PDO :
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;
}
}
echo "Success!";
Trong đoạn mã trên, chúng tôi đang kiểm tra lỗi cụ thể để thực hiện một số hành động và ném lại ngoại lệ cho bất kỳ lỗi nào khác (không có bảng nào như vậy chẳng hạn) sẽ được báo cáo cho lập trình viên.
Trong khi một lần nữa - chỉ để nói với người dùng điều gì đó như "Chèn của bạn đã thành công" thì không cần điều kiện nào.