Tôi đang sử dụng PDO để viết lại giao diện trang web cho cơ sở dữ liệu. Tôi sử dụng để sử dụng phần mở rộng mysql, nhưng tôi chưa bao giờ làm phiền với xử lý lỗi, và một vài trình xử lý lỗi mà tôi đã có được về cơ bản là sao chép-dán.Câu hỏi ngoại lệ PDO - Cách bắt chúng
Bây giờ tôi muốn làm điều này đúng. Tuy nhiên, tôi đang gặp vấn đề bắt lỗi như thế nào tôi muốn (lỗi như "Duplicate Entry", "Null Value" vv trong MySQL). Bao nhiêu tuyên bố của tôi cần phải ở trong khối thử? Tất cả có nên ở trong đó không? Tôi đang sử dụng một Include()
để kết nối với DB của tôi (trong đó có xử lý lỗi riêng của nó), do đó, nó chỉ thực hiện truy vấn có lỗi trong mã này. Tôi không thể tìm ra lý do tại sao nó không gặp lỗi khi thực thi mã sau:
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();
}
Vì vậy, câu hỏi của tôi: CÓ TẤT CẢ CÓ phải trong khối thử không? Tôi có thể đặt lệnh thực hiện trong khối thử không? Nó sẽ bắt lỗi Duplicate value "John" in key "name"
, nhưng thay vào đó là thông báo thành công. (Khi cố gắng thêm hai người dùng "John"). Tôi đã kiểm tra trong PHPMyAdmin; chỉ mục này là duy nhất và có lỗi như mong đợi, không sử dụng mã này.
Nếu bạn chưa có, bạn sẽ cần đặt 'PDO :: ATTR_ERRMODE' thành' PDO :: ERRMODE_EXCEPTION' để nó ném ngoại lệ về lỗi. – FtDRbwLXw6
Bạn nên kiểm tra tài liệu hoặc mã nguồn và xem các hàm nào sẽ ném 'PDOException'. Sau đó, bạn sẽ biết những phần mã nào được đặt trong khối try :) –
Tôi cảm thấy ngớ ngẩn .. thiết lập 'ATTR_ERRMODE' đã sửa nó. Vì vậy, bao nhiêu của các tuyên bố nên được trong khối thử? Mã này có thể được tái sử dụng (chỉ có thể một vài câu lệnh bindValue() sẽ thay đổi, sau đó thực thi). Có bất kỳ lợi ích nào để có toàn bộ câu lệnh trong khối thử hay chỉ là lệnh execute() cần thiết? – StuckAtWork