Hapus pesan peringatan di PHP

Jawaban:

349

Anda benar-benar harus memperbaiki apa pun yang menyebabkan peringatan, tetapi Anda dapat mengontrol visibilitas kesalahan error_reporting(). Untuk melewati pesan peringatan, Anda dapat menggunakan sesuatu seperti:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
sumber
53
E_ALL ^ E_WARNING, mengaktifkan semua pelaporan kesalahan selain peringatan, sepertinya merupakan pilihan argumen yang lebih baik error_reporting.
Mark Amery
1
umumnya saya setuju, dalam kasus saya membuat pesan peringatan adalah perilaku yang dimaksudkan karena itu adalah bagian dari tes unit saya.
pgee70
121

Anda dapat menempatkan @ di depan pemanggilan fungsi Anda untuk menekan semua pesan kesalahan.

@yourFunctionHere();
PetPaulsen
sumber
4
Ini hanya menyembunyikan kesalahan, itu masih terjadi. Kesalahan membuat PHP melambat sehingga yang terbaik adalah memperbaiki kesalahan jika memungkinkan. Menggunakan @ even memperlambat kode ketika tidak ada kesalahan. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Terkadang (sayangnya) Anda benar-benar tidak punya pilihan. Sebagai contoh, fungsi PHP parse_url () menghasilkan Peringatan untuk URL "sangat rusak" - yang bisa dibilang bug karena fungsi mengembalikan false dalam kasus ini. Jadi Anda harus mentolerir peringatan PHP ini dalam output program Anda (mungkin tidak dapat diterima untuk aplikasi parser / validator), menekan Peringatan, entah bagaimana, atau mengatasi perilaku PHP yang rusak dengan menulis parser / validator Anda sendiri untuk URL. Dalam hal ini, saya memilih @.
Peter
1
PENTING: Gunakan metode ini jika (1) Anda tidak dapat memperbaiki masalah yang menghasilkan peringatan atau (2) menyembunyikan peringatan Anda dari pengguna akhir melalui php error_reporting ... Menyembunyikan peringatan dari pengembang Anda BUKAN solusi.
Joshua Kissoon
3
Izinkan saya menjelaskan mengapa ini penting. Beberapa fungsi seperti dns_get_recordakan memberikan peringatan. Kode Anda dapat mengkompensasi peringatan tetapi masih melemparkannya. Mematikan pelaporan kesalahan berfungsi pada server produksi, tetapi tidak pada server devel. Jika Anda menghasilkan konten XML, peringatan itu akan menyebabkan browser tidak merender karena server mengirimkan XML yang cacat karena peringatan tersebut. Terkadang Anda menginginkannya pada devel, tetapi tidak untuk sesuatu yang disebabkan oleh kegagalan pencarian DNS sementara yang sudah Anda ganti rugi.
Alice Wonder
2
Biarkan saya menjelaskan mengapa ini berguna, ketika alih-alih semua pesan peringatan, Andalah yang ingin menangani peringatan sebagai kesalahan dan menghasilkan pesan kesalahan Anda sendiri
Daniel N.
43

Untuk menekan peringatan sambil membiarkan semua pelaporan kesalahan lainnya diaktifkan:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
sumber
28

Jika Anda tidak ingin menampilkan peringatan serta kesalahan gunakan

// Turn off all error reporting
error_reporting(0);

Pelaporan Kesalahan - Manual PHP

mohan.gade
sumber
18

Jika Anda ingin menekan peringatan dan beberapa jenis kesalahan lainnya (misalnya, pemberitahuan) saat menampilkan semua kesalahan lain, Anda dapat melakukan:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
sumber
15

di Core Php untuk menyembunyikan set pesan peringatan error_reporting (0) di atas file include atau file individual.

Di Wordpress hide Warnings and Notices tambahkan kode berikut dalam file 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);
Vijay Lathiya
sumber
Ini adalah solusi terbaik, ketika datang untuk menyembunyikan log di Wordpress. Terima kasih!!
Neo Morina
10

Tidak persis menjawab pertanyaan, tetapi saya pikir ini adalah kompromi yang lebih baik dalam beberapa situasi:

Saya memiliki pesan peringatan sebagai hasil dari pernyataan printf () di perpustakaan pihak ketiga. Saya tahu persis apa penyebabnya - penyelesaian sementara sementara pihak ketiga memperbaiki kode mereka. Saya setuju bahwa peringatan tidak boleh ditekan, tetapi saya tidak bisa menunjukkan pekerjaan saya kepada klien dengan pesan peringatan muncul di layar. Solusi saya:

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

Peringatan masih dalam sumber halaman sebagai pengingat bagi saya, tetapi tidak terlihat oleh klien.

DaveWalley
sumber
5
Secara pribadi, saya akan menggunakan ob_start()dan ob_end_clean()sebagai gantinya. Dengan cara ini, barang-barang itu bahkan tidak dikirim ke browser (yang ada di sini).
h2ooooooo
6
Itu sebabnya saya memasukkan "beberapa situasi", "peringatan tidak boleh ditekan" dan "pengingat bagi saya".
DaveWalley
1
Sebelum memilih saya lagi, harap baca balasan saya. Perhatikan "pihak ketiga", "kompromi" dan komentar di atas. Saya menambahkan jawaban ini seandainya ada orang lain dalam situasi yang sama dengan saya, dan dalam situasi khusus itu, ini menyelamatkan saya sedangkan semua jawaban lain tidak akan sebaik ini. Lain kali saya akan berpikir dua kali untuk membantu.
DaveWalley
Terima kasih karena tidak menghapus ide cemerlang ini. Di sistem saya, saya menyimpan semua kesalahan dan peringatan, dikirim kembali dari klien dan ketika seorang admin masuk, mereka segera diperingatkan untuk aktivitas apa pun sehingga mereka dapat memberi tahu kru pemeliharaan. Situs ini untuk permainan edukatif sehingga bukan masalah besar jika terjadi kesalahan selama satu jam atau lebih.
cneeds
8

Saya melakukannya sebagai berikut di php.ini saya :

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

Log ini hanya kesalahan fatal dan tidak ada peringatan.

navid
sumber
7

Saya pikir solusi yang lebih baik adalah konfigurasi .htaccess Dengan cara itu Anda tidak perlu mengubah kode aplikasi. Berikut adalah arahan untuk 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
Sebastian Piskorski
sumber
7

Anda bisa menekan peringatan menggunakan error_reporting tetapi cara yang jauh lebih baik adalah dengan memperbaiki skrip Anda di tempat pertama.

Jika Anda tidak tahu caranya, edit pertanyaan Anda dan tunjukkan kami baris yang dipermasalahkan dan peringatan yang ditampilkan.

Pekka
sumber
7
Safaali, Anda harus memperbaiki masalahnya, jangan abaikan saja.
Sampson
2
Safaali, melihat Anda memiliki minat tertentu pada PHP, bantulah diri Anda sendiri dan lihat untuk memperbaiki skrip itu.
Pekka
0

Sudah ada jawaban dengan Operator Kontrol Kesalahan tetapi tidak ada penjelasan. Anda dapat menggunakan @operator dengan setiap ekspresi dan menyembunyikan kesalahan (kecuali Kesalahan Fatal).

@$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()

Untuk debugging, metode ini cepat dan sempurna. Tetapi Anda tidak boleh menggunakannya pada produksi atau permanen termasuk dalam versi lokal Anda. Ini akan memberi Anda banyak iritasi yang tidak perlu.

Anda sebaiknya mempertimbangkan:

1. Kesalahan pengaturan pelaporan sebagaimana disebutkan dalam jawaban yang diterima.

error_reporting(E_ERROR | E_PARSE);

atau dari pengaturan PHP INI

ini_set('display_errors','Off');

2. Menangkap pengecualian

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

Untuk mengabaikan semua peringatan, gunakan contoh ini, di atas kode Anda:

error_reporting(0);
Ada
sumber
Dan apa perbedaan jawaban Anda dengan jawaban yang diterima?
endo64