Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Phương pháp tốt nhất để xử lý lỗi bằng PDO

Đó là một câu hỏi rất hay, nhưng có một tiền đề sai ngay từ đầu:bạn đang sử dụng báo cáo lỗi cho PDO tách biệt với báo cáo lỗi trên toàn trang web. Điều này rất có ý nghĩa:lỗi PDO theo mọi cách cũng giống như các lỗi khác - lỗi hệ thống tệp, lỗi HTTP, v.v. Do đó, không có lý do gì trong việc thiết lập báo cáo lỗi chỉ dành cho PDO. Tất cả những gì bạn cần là đặt đúng cách báo cáo lỗi trên toàn trang web.

Ngoài ra còn có một giả định sai liên quan đến tính không thể truy cập php.ini:bạn luôn có thể đặt bất kỳ chỉ thị cấu hình nào bằng cách sử dụng hàm ini_set (). Vì vậy, đây không phải là một lý do duy nhất trong việc đặt error_reporting thành mức tai hại là 0.

Để trả lời những câu hỏi còn lại, tất cả những gì bạn cần là một chút hiểu biết chung.

Bạn nghĩ gì về bản thân? Nó có tốt không khi hiển thị thông báo lỗi hệ thống cho người dùng? Nó có hiển thị tốt nội bộ hệ thống cho người dùng độc hại không?

Bạn có phản đối điều này không?

Bạn có nghĩ rằng đó là một ý tưởng khá mâu thuẫn - đăng nhập các lỗi cơ sở dữ liệu vào cơ sở dữ liệu?

Bạn đã hiển thị nó rồi:hiển thị trong nhà phát triển và đăng nhập sản phẩm. Tất cả đều được kiểm soát trên toàn bộ trang web thông qua một số tùy chọn cấu hình đơn giản.

KHÔNG sử dụng khối try-catch để báo cáo lỗi. Bạn sẽ không viết một khối bắt với thông báo lỗi thân thiện cho mọi truy vấn trong ứng dụng của bạn , như nó được đề xuất trong câu trả lời khác, bạn có phải không?

Vì vậy, mã của bạn phải là

<?php
  // Error handling
  error_reporting(-1);
  ini_set('display_errors',0);
  ini_set('log_errors',1);

  // Get credentials from outside document root
  require_once('../settings.php');

  // Tests connection to database
    $dbh = new PDO(
            sprintf(
              'mysql:host=%s;dbname=%s;port=%s;charset=%s',
              $settings['host'],
              $settings['name'],
              $settings['port'],
              $settings['charset']
            ),
            $settings['username'],
            $settings['password']
    );
    // Prevents emulated prepares and activates error handling
    // PDO::ERRMODE_EXCEPTION
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Bây giờ đến câu hỏi bạn đã nêu trong nhận xét.

Màn hình lỗi tùy chỉnh là một vấn đề rất khác và mã của bạn đặc biệt tệ với nó. Đó không phải là lỗi 404 hay phải sử dụng chuyển hướng HTTP (điều đó rất có hại cho SEO).

Để tạo trang lỗi tùy chỉnh, bạn phải sử dụng các tính năng của máy chủ web (ưu tiên) hoặc trình xử lý lỗi trong tập lệnh PHP.

Khi gặp phải lỗi nghiêm trọng (và một ngoại lệ không phải là một), PHP phản hồi không phải với trạng thái HTTP 200 OK mà với trạng thái 5xx. Và mọi máy chủ web đều có thể bắt được trạng thái này và hiển thị một trang lỗi tương ứng. Ví dụ. đối với Apache thì nó sẽ là

ErrorDocument 503 server_error.html

nơi bạn có thể viết bất cứ lời bào chữa nào bạn muốn.

Hoặc bạn có thể thiết lập trình xử lý lỗi tùy chỉnh trong PHP để xử lý tất cả các lỗi PHP, bạn có thể xem một ví dụ trong bài viết tôi đã viết về vấn đề này: Cách sử dụng try..catch đúng cách.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngoại lệ kết nối Grails và MySQL

  2. Chuyển đổi giây thành ngày, giờ, phút, giây (MySQL)

  3. Giá trị sai được trả về từ float mysql

  4. PHP - kết nối với cơ sở dữ liệu mysql từ máy chủ khác nhau

  5. Cảnh báo:mysqli_connect ():(HY000 / 1045):Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:NO)