Xóa các thông báo cảnh báo trong PHP


Câu trả lời:


349

Bạn thực sự nên sửa bất cứ điều gì gây ra cảnh báo, nhưng bạn có thể kiểm soát mức độ hiển thị của lỗi error_reporting(). Để bỏ qua các thông báo cảnh báo, bạn có thể sử dụng một cái gì đó như:

error_reporting(E_ERROR | E_PARSE);

53
E_ALL ^ E_WARNING, cho phép tất cả báo cáo lỗi bên cạnh các cảnh báo, có vẻ như là một lựa chọn tốt hơn để tranh luận error_reporting.
Mark Amery

1
nói chung tôi đồng ý, trong trường hợp của tôi, việc tạo ra thông điệp cảnh báo là hành vi có chủ đích vì nó là một phần của bài kiểm tra đơn vị của tôi.
pgee70

120

Bạn có thể đặt @ trước lệnh gọi chức năng của mình để chặn tất cả các thông báo lỗi.

@yourFunctionHere();

4
Điều này chỉ che giấu lỗi, nó vẫn xảy ra. Lỗi làm cho PHP chậm lại, vì vậy tốt nhất là sửa lỗi nếu có thể. Sử dụng @ thậm chí làm chậm mã khi không có lỗi. vega.rd.no/articles/php-performance-error-suppression
dprevite

46
Đôi khi (không may) bạn thực sự không có lựa chọn. Ví dụ: hàm PHP parse_url () tạo Cảnh báo cho các URL "không đúng định dạng nghiêm trọng" - được cho là lỗi do hàm trả về sai trong trường hợp này. Vì vậy, bạn phải chấp nhận các cảnh báo PHP này trong đầu ra chương trình của mình (có thể không chấp nhận được đối với các ứng dụng trình phân tích cú pháp / trình xác nhận), loại bỏ Cảnh báo bằng cách nào đó hoặc xử lý hành vi PHP bị hỏng bằng cách viết trình phân tích cú pháp / trình xác thực của riêng bạn cho URL. Trong trường hợp này, tôi chọn @.
Peter

1
QUAN TRỌNG: Sử dụng phương pháp này iff (1) bạn không thể khắc phục sự cố tạo cảnh báo cũng như (2) ẩn cảnh báo của bạn khỏi người dùng cuối thông qua php error_Vporting ... Ẩn cảnh báo từ nhà phát triển của bạn KHÔNG phải là giải pháp.
Joshua Kis gió

3
Hãy để tôi giải thích tại sao điều này là quan trọng. Một số chức năng như dns_get_recordsẽ ném cảnh báo. Mã của bạn có thể bù cho cảnh báo nhưng nó vẫn ném chúng. Tắt báo cáo lỗi hoạt động trên máy chủ sản xuất, nhưng không phải trên máy chủ phát. Nếu bạn đang tạo nội dung XML, cảnh báo sẽ khiến trình duyệt không hiển thị do máy chủ đang gửi XML không đúng định dạng do cảnh báo gây ra. Đôi khi bạn muốn điều đó trên phát triển, nhưng không phải vì một cái gì đó gây ra bởi lỗi tra cứu DNS tạm thời mà bạn đã bù đắp.
Alice Wonder

2
Hãy để tôi giải thích lý do tại sao điều này hữu ích, khi thay vì tất cả các thông báo cảnh báo, chính bạn là người muốn xử lý cảnh báo là một lỗi và tạo thông báo lỗi của riêng bạn
Daniel N.

43

Để chặn các cảnh báo trong khi để tất cả các báo cáo lỗi khác được bật:

error_reporting(E_ALL ^ E_WARNING); 


18

Nếu bạn muốn loại bỏ các cảnh báo và một số loại lỗi khác (ví dụ: thông báo) trong khi hiển thị tất cả các lỗi khác, bạn có thể làm:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);

15

trong Core Php để ẩn thông báo cảnh báo đặt error_Vporting (0) ở đầu tệp chung bao gồm tệp hoặc tệp riêng lẻ.

Trong Wordpress ẩn Cảnh báo và Thông báo thêm mã sau vào tệp wp-config.php

ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Đây là giải pháp tốt nhất, khi nói đến việc ẩn các bản ghi trong Wordpress. Cảm ơn bạn!!
Neo Morina

10

Không trả lời chính xác câu hỏi, nhưng tôi nghĩ rằng đây là một sự thỏa hiệp tốt hơn trong một số tình huống:

Tôi đã có một thông báo cảnh báo là kết quả của câu lệnh printf () trong thư viện của bên thứ ba. Tôi biết chính xác nguyên nhân là gì - một cách giải quyết tạm thời trong khi bên thứ ba sửa mã của họ. Tôi đồng ý rằng các cảnh báo không nên bị loại bỏ, nhưng tôi không thể chứng minh công việc của mình với khách hàng với thông điệp cảnh báo hiện lên trên màn hình. Giải pháp của tôi:

printf('<div style="display:none">');
    ...Third-party stuff here...
printf('</div>');

Cảnh báo vẫn còn trong nguồn trang như một lời nhắc nhở cho tôi, nhưng vô hình với khách hàng.


5
Cá nhân, tôi sẽ sử dụng ob_start()ob_end_clean()thay vào đó. Bằng cách này, các công cụ thậm chí không được gửi đến trình duyệt (mà nó làm ở đây).
h2ooooooo

6
Đó là lý do tại sao tôi bao gồm "một số tình huống", "cảnh báo không nên bị đàn áp" và "nhắc nhở tôi".
DaveWalley

1
Trước khi bỏ phiếu cho tôi nhiều hơn, xin vui lòng đọc trả lời của tôi. Lưu ý "bên thứ ba", "thỏa hiệp" và nhận xét ở trên. Tôi đã thêm câu trả lời này trong trường hợp có người khác ở trong tình huống tương tự tôi gặp phải, và trong tình huống cụ thể đó, điều này đã cứu tôi trong khi tất cả các câu trả lời khác sẽ không tốt như vậy. Lần sau tôi sẽ nghĩ hai lần về việc có ích.
DaveWalley

Cảm ơn bạn đã không loại bỏ ý tưởng tuyệt vời này. Trên hệ thống của tôi, tôi lưu tất cả các lỗi và cảnh báo, gửi lại từ khách hàng và khi quản trị viên đăng nhập, họ sẽ được thông báo ngay lập tức cho bất kỳ hoạt động nào để họ có thể thông báo cho đội bảo trì. Trang web này dành cho các trò chơi giáo dục vì vậy nó không phải là vấn đề lớn nếu có bất cứ điều gì xảy ra trong một giờ hoặc lâu hơn.
cneed

8

Tôi làm như sau trong php.ini của tôi :

error_reporting = E_ALL & ~E_WARNING  & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Nhật ký này chỉ có lỗi nghiêm trọng và không có cảnh báo.


7

Tôi nghĩ rằng giải pháp tốt hơn là cấu hình của .htaccess Theo cách đó bạn không phải thay đổi mã ứng dụng. Dưới đây là các chỉ thị cho Apache2

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0

7

Bạn có thể chặn cảnh báo bằng cách sử dụng error_Vporting nhưng cách tốt hơn nhiều là sửa tập lệnh của bạn ngay từ đầu.

Nếu bạn không biết cách, hãy chỉnh sửa câu hỏi của bạn và hiển thị cho chúng tôi dòng đang được hỏi và cảnh báo được hiển thị.


7
Safaali, bạn nên sửa chữa các vấn đề, không bỏ qua sau đó.
Sampson

2
Safaali, thấy rằng bạn có một mối quan tâm nhất định đối với PHP, hãy tự mình tìm hiểu và sửa chữa tập lệnh đó.
Pekka

0

Đã có câu trả lời với Toán tử điều khiển lỗi nhưng nó thiếu giải thích. Bạn có thể sử dụng @toán tử với mọi biểu thức và nó ẩn các lỗi (ngoại trừ Lỗi nghiêm trọng).

@$test['test']; //PHP Notice:  Undefined variable: test

@(14/0); // PHP Warning:  Division by zero

//This is not working. You can't hide Fatal Errors this way.
@customFuntion(); // PHP Fatal error:  Uncaught Error: Call to undefined function customFuntion()

Để gỡ lỗi nó là phương pháp nhanh và hoàn hảo. Nhưng bạn không bao giờ nên sử dụng nó trong sản xuất cũng như vĩnh viễn bao gồm trong phiên bản địa phương của bạn. Nó sẽ cung cấp cho bạn rất nhiều kích thích không cần thiết.

Bạn nên xem xét thay thế:

1. Cài đặt báo cáo lỗi như được đề cập trong câu trả lời được chấp nhận.

error_reporting(E_ERROR | E_PARSE);

hoặc từ cài đặt PHP INI

ini_set('display_errors','Off');

2. Bắt ngoại lệ

try {
    $var->method();
} catch (Error $e) {
    // Handle error
    echo $e->getMessage();
}

0

Để bỏ qua tất cả các cảnh báo, hãy sử dụng mẫu này, trên đầu mã của bạn:

error_reporting(0);

Và sự khác biệt của câu trả lời của bạn với câu trả lời được chấp nhận là gì?
endo64
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.