ลบข้อความเตือนใน PHP


228

ฉันมีรหัส PHP เมื่อฉันเรียกใช้ข้อความเตือนจะปรากฏขึ้น

ฉันจะลบ / ระงับ / เพิกเฉยข้อความเตือนเหล่านี้ได้อย่างไร


ดูเพิ่มเติมที่: stackoverflow.com/questions/1087365
dreftymac

คำตอบ:


349

คุณควรแก้ไขสิ่งที่ก่อให้เกิดการเตือน แต่คุณสามารถควบคุมการเปิดเผยข้อผิดพลาดerror_reporting()ได้ หากต้องการข้ามข้อความเตือนคุณสามารถใช้สิ่งต่อไปนี้:

error_reporting(E_ERROR | E_PARSE);

53
E_ALL ^ E_WARNINGerror_reportingที่ช่วยให้การรายงานข้อผิดพลาดทั้งหมดนอกเหนือจากคำเตือนดูเหมือนว่าทางเลือกที่ดีของการโต้แย้งไป
Mark Amery

1
โดยทั่วไปฉันเห็นด้วยในกรณีของฉันการสร้างข้อความเตือนเป็นพฤติกรรมที่ตั้งใจเพราะมันเป็นส่วนหนึ่งของการทดสอบหน่วยของฉัน
pgee70

120

คุณสามารถใส่@ไว้ด้านหน้าการเรียกใช้ฟังก์ชันเพื่อระงับข้อความแสดงข้อผิดพลาดทั้งหมด

@yourFunctionHere();

4
นี่เพิ่งซ่อนข้อผิดพลาด แต่ก็ยังคงเกิดขึ้น ข้อผิดพลาดทำให้ PHP ช้าลงดังนั้นจึงเป็นการดีที่สุดที่จะแก้ไขข้อผิดพลาดหากเป็นไปได้ การใช้ @ จะทำให้โค้ดช้าลงเมื่อไม่มีข้อผิดพลาด vega.rd.no/articles/php-performance-error-suppression
dprevite

46
บางครั้ง (น่าเสียดาย) คุณไม่มีทางเลือก ตัวอย่างเช่นฟังก์ชั่น PHP parse_url () สร้างคำเตือนสำหรับ URL ที่ "ผิดรูปแบบ" ซึ่งเป็นข้อผิดพลาดเนื่องจากฟังก์ชั่นคืนค่าเท็จในกรณีนี้ ดังนั้นคุณต้องยอมรับคำเตือน PHP เหล่านี้ในผลลัพธ์ของโปรแกรมของคุณ (อาจยอมรับไม่ได้สำหรับแอพพลิเคชั่นวิเคราะห์คำ / ตรวจสอบ) ระงับคำเตือนอย่างใดอย่างหนึ่งหรือหลีกเลี่ยงพฤติกรรม PHP ที่เสียหายโดยการเขียนตัวแยกวิเคราะห์ / ในกรณีนี้ฉันเลือก @
ปีเตอร์

1
สำคัญ: ใช้วิธีนี้ถ้า if (1) คุณไม่สามารถแก้ไขปัญหาที่สร้างคำเตือนหรือ (2) ซ่อนคำเตือนของคุณจากผู้ใช้ปลายทางผ่าน php error_reporting ... การซ่อนคำเตือนจากนักพัฒนาของคุณไม่ใช่วิธีแก้ปัญหา
Joshua Kissoon

3
ให้ฉันอธิบายว่าทำไมสิ่งนี้จึงสำคัญ ฟังก์ชั่นบางอย่างเช่นdns_get_recordจะส่งคำเตือน รหัสของคุณอาจชดเชยการเตือน แต่ก็ยังคงโยนพวกเขา การปิดการรายงานข้อผิดพลาดทำงานบนเซิร์ฟเวอร์ที่ใช้งานจริง แต่ไม่ได้อยู่บนเซิร์ฟเวอร์ devel หากคุณกำลังสร้างเนื้อหา XML คำเตือนจะทำให้เบราว์เซอร์ไม่แสดงผลเนื่องจากเซิร์ฟเวอร์กำลังส่ง XML ที่มีรูปแบบไม่ถูกต้องซึ่งเกิดจากคำเตือน บางครั้งคุณต้องการใช้กับ devel แต่ไม่ใช่สำหรับบางสิ่งที่เกิดจากความล้มเหลวในการค้นหา DNS ชั่วคราวที่คุณชดเชยแล้ว
Alice Wonder

2
ให้ฉันอธิบายว่าทำไมสิ่งนี้จึงมีประโยชน์แทนที่จะเป็นข้อความเตือนทั้งหมดคุณต้องการจัดการคำเตือนเป็นข้อผิดพลาดและสร้างข้อความแสดงข้อผิดพลาดของคุณเอง
Daniel N.

43

วิธีระงับการเตือนขณะที่เปิดใช้งานการรายงานข้อผิดพลาดอื่น ๆ ทั้งหมด:

error_reporting(E_ALL ^ E_WARNING); 


18

หากคุณต้องการระงับคำเตือนและข้อผิดพลาดประเภทอื่น ๆ (เช่นประกาศ) ในขณะที่แสดงข้อผิดพลาดอื่น ๆ ทั้งหมดคุณสามารถทำได้:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);

15

ใน Core Php เพื่อซ่อนชุดข้อความเตือน error_reporting (0) ที่ด้านบนสุดของไฟล์ทั่วไปหรือไฟล์รวม

ใน Wordpress ซ่อนคำเตือนและคำเตือนเพิ่มรหัสต่อไปนี้ในไฟล์ 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);

นี่เป็นทางออกที่ดีที่สุดเมื่อต้องซ่อนการบันทึกใน Wordpress ขอบคุณ!!
Neo Morina

10

ไม่ตอบคำถาม แต่ฉันคิดว่านี่เป็นการประนีประนอมที่ดีกว่าในบางสถานการณ์:

ฉันได้รับข้อความเตือนจากคำสั่ง printf () ในห้องสมุดบุคคลที่สาม ฉันรู้ว่าสาเหตุคืออะไร - เป็นการทำงานชั่วคราวในขณะที่บุคคลที่สามแก้ไขรหัสของพวกเขา ฉันยอมรับว่าไม่ควรระงับคำเตือน แต่ฉันไม่สามารถสาธิตการทำงานของฉันให้กับลูกค้าได้โดยมีข้อความเตือนปรากฏขึ้นบนหน้าจอ ทางออกของฉัน:

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

คำเตือนยังอยู่ในแหล่งที่มาของหน้าเพื่อเตือนให้ฉันทราบ แต่มองไม่เห็นลูกค้า


5
ส่วนตัวผมจะใช้ob_start()และob_end_clean()แทน วิธีนี้สิ่งต่าง ๆ ไม่ได้ถูกส่งไปยังเบราว์เซอร์ (ซึ่งทำที่นี่)
h2ooooooo

6
นั่นเป็นเหตุผลที่ฉันรวม "บางสถานการณ์", "คำเตือนไม่ควรถูกระงับ" และ "เตือนฉัน"
DaveWalley

1
ก่อนลงคะแนนให้ฉันมากขึ้นโปรดอ่านคำตอบของฉัน หมายเหตุ "บุคคลที่สาม" "ประนีประนอม" และความคิดเห็นด้านบน ฉันเพิ่มคำตอบนี้ในกรณีที่คนอื่นอยู่ในสถานการณ์เดียวกันกับฉันและในสถานการณ์เฉพาะนี้ช่วยฉันได้ในขณะที่คำตอบอื่น ๆ จะไม่ดี ครั้งต่อไปฉันจะคิดอีกครั้งเกี่ยวกับการช่วยเหลือ
DaveWalley

ขอบคุณที่ไม่ลบความคิดที่ยอดเยี่ยมนี้ ในระบบของฉันฉันบันทึกข้อผิดพลาดและคำเตือนส่งกลับจากลูกค้าและเมื่อผู้ดูแลระบบลงชื่อเข้าใช้พวกเขาจะได้รับการแจ้งเตือนทันทีถึงกิจกรรมดังกล่าวเพื่อให้พวกเขาสามารถให้คำแนะนำแก่ทีมงานซ่อมบำรุง เว็บไซต์นี้เป็นเกมเพื่อการศึกษาดังนั้นจึงไม่ใช่เรื่องใหญ่หากมีอะไรผิดปกติเป็นเวลาหนึ่งชั่วโมงหรือมากกว่านั้น
ต้องการ

8

ฉันทำดังต่อไปนี้ในphp.iniของฉัน:

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

บันทึกนี้เพียงข้อผิดพลาดร้ายแรงและไม่มีคำเตือน


7

ฉันคิดว่าทางออกที่ดีกว่าคือการกำหนดค่าของ. htaccess ด้วยวิธีนี้คุณไม่จำเป็นต้องเปลี่ยนรหัสแอปพลิเคชัน นี่คือคำสั่งสำหรับ 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

คุณสามารถระงับคำเตือนโดยใช้error_reportingแต่วิธีที่ดีกว่าคือแก้ไขสคริปต์ของคุณตั้งแต่แรก

หากคุณไม่ทราบวิธีแก้ไขคำถามของคุณและแสดงบรรทัดที่เป็นปัญหาและคำเตือนที่ปรากฏ


7
Safaali คุณควรแก้ไขปัญหาอย่าเพิกเฉย
Sampson

2
Safaali เมื่อคุณเห็นว่าคุณมีความสนใจใน PHP ให้ทำสิ่งที่คุณชอบและมองหาการแก้ไขสคริปต์นั้น
Pekka

0

มีคำตอบสำหรับError Control Operatorอยู่แล้วแต่ไม่มีคำอธิบาย คุณสามารถใช้@โอเปอเรเตอร์กับทุกนิพจน์และซ่อนข้อผิดพลาด (ยกเว้นข้อผิดพลาดร้ายแรง)

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

สำหรับการดีบั๊กมันเป็นวิธีที่รวดเร็วและสมบูรณ์แบบ แต่คุณไม่ควรใช้ในการผลิตหรือรวมอย่างถาวรในเวอร์ชันท้องถิ่นของคุณ มันจะทำให้คุณเกิดการระคายเคืองที่ไม่จำเป็นมากมาย

คุณควรพิจารณาแทน:

1.การตั้งค่าการรายงานข้อผิดพลาดตามที่ระบุไว้ในคำตอบที่ยอมรับ

error_reporting(E_ERROR | E_PARSE);

หรือจากการตั้งค่า PHP INI

ini_set('display_errors','Off');

2. การจับข้อยกเว้น

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

0

สำหรับการละเว้นคำเตือนทั้งหมดให้ใช้ตัวอย่างนี้ที่ด้านบนของรหัสของคุณ:

error_reporting(0);

และคำตอบของคุณต่างจากคำตอบที่ยอมรับคืออะไร?
endo64
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.