PHP Conference Japan 2024

error_reporting

(PHP 4、PHP 5、PHP 7、PHP 8)

error_reporting設定要報告的 PHP 錯誤

說明

error_reporting(?int $error_level = null): int

error_reporting() 函數會在執行時設定 error_reporting 指令。PHP 有許多錯誤層級,使用此函數會為腳本的執行期間(執行時)設定該層級。如果未設定選用的 error_levelerror_reporting() 將僅傳回目前的錯誤報告層級。

參數

error_level

新的 error_reporting 層級。它採用位元遮罩或命名常數。強烈建議使用命名常數以確保與未來版本的相容性。隨著錯誤層級的增加,整數範圍會增加,因此舊的基於整數的錯誤層級不一定會如預期般運作。

可用的錯誤層級常數和這些錯誤層級的實際含義在 預定義常數 中說明。

傳回值

傳回 error_reporting 層級, 變更為 error_level 之前

注意 錯誤控制 @ 運算子會在錯誤處理期間變更 error_level

變更記錄

版本 說明
8.0.0 error_level 現在可為 null。

範例

範例 1 error_reporting() 範例

<?php

// 關閉所有錯誤報告
error_reporting(0);

// 報告簡單的執行錯誤
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 報告 E_NOTICE 也可以很好(報告未初始化的變數或捕獲變數名稱拼寫錯誤...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 報告除了 E_NOTICE 之外的所有錯誤
error_reporting(E_ALL & ~E_NOTICE);

// 報告所有 PHP 錯誤
error_reporting(E_ALL);

// 報告所有 PHP 錯誤
error_reporting(-1);

// 與 error_reporting(E_ALL); 相同
ini_set('error_reporting', E_ALL);

?>

備註

提示

傳入值 -1 會顯示每個可能的錯誤,即使在未來的 PHP 版本中新增了新的層級和常數。此行為等同於傳遞 E_ALL 常數。

參見

新增筆記

使用者貢獻的筆記 27 筆筆記

368
info at hephoz dot de
16 年前
如果您只看到空白頁面而不是錯誤報告,並且您沒有伺服器存取權,因此無法編輯 php 組態檔(如 php.ini),請嘗試此操作

- 建立一個新檔案,其中包含有錯誤的腳本

<?php
error_reporting
(E_ALL);
ini_set("display_errors", 1);
include(
"file_with_errors.php");
?>

- 執行此檔案,而不是有錯誤的腳本檔案

現在應該會報告您有錯誤的腳本的錯誤。
這對我來說很有效。希望它也能解決您的問題!
51
dave at davidhbrown dot us
18 年前
E_ALL ^ E_NOTICE 的範例對我們這些不完全熟悉位元運算子的人來說有點令人困惑。

如果您想從目前的層級中移除通知,無論該未知層級為何,請改用 & ~

<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...產生通知的程式碼
error_reporting($errorlevel);
//...
?>

^ 是 xor(位元反轉)運算子,如果通知先前關閉(在其左側的錯誤層級中),實際上會將通知開啟。它在範例中有效,因為 E_ALL 保證已設定 E_NOTICE 的位元,因此當 ^ 反轉該位元時,實際上會將其關閉。& ~(且非)始終會關閉右側參數指定的位元,無論它們是開啟還是關閉。
12
jcastromail at yahoo dot es
3 年前
在 PHP 8.0 下,當程式碼使用 @ 字元時,error_reporting() 不會傳回 0。

例如

<?php

$a
=$array[20]; // error_reporting() 在 php <8 中傳回 0,在 PHP>=8 中傳回 4437

?>
4
lhenry at lhenry dot com
5 年前
在 php7 中,通常是通知或已棄用的項目現在變成了警告:與 mysql 錯誤相同的層級...對我來說無法接受。

我確實有數十個舊專案,而且我當然不想定義我 20 年前最終寫的每個變數。

因此有兩個選項:讓 php7 透過每小時寫入 Gb 來降低我昂貴 SSD 的效能,或實作類似伺服器層級監控的東西(在 php.ini 中使用 auto_[pre-ap]pend_file)並關閉 E_WARNING

自訂覆寫 php 錯誤的層級應該會非常方便和靈活…
7
ecervetti at orupaca dot fr
15 年前
它可以為某人節省兩分鐘
E_ALL & ~E_NOTICE 整數值為 6135
6
Fernando Piancastelli
19 年前
如果您的 php.ini 中的 display_errors 指令設定為「Off」,則 error_reporting() 函數將不會生效,無論您設定的報告層級為何。我必須設定

display_errors = On
error_reporting = ~E_ALL

預設保持不報告錯誤,但可以在我的腳本中變更錯誤報告層級。
我正在使用 PHP 4.3.9 和 Apache 2.0。
1
&IT
4 年前
error_reporting(E_ALL);
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
3
vdephily at bluemetrix dot com
19 年前
請注意,E_NOTICE 會警告您有關未初始化的變數,但指派索引鍵/值組會被視為初始化,且不會觸發任何錯誤
<?php
error_reporting
(E_ALL);

$foo = $bar; //注意:$bar 未初始化

$bar['foo'] = 'hello'; // 沒有注意訊息,即使 $bar 本身從未初始化 (例如使用 "$bar = array()")

$bar = array('foobar' => 'barfoo');
$foo = $bar['foobar'] // ok

$foo = $bar['nope'] // 注意:沒有這個索引
?>
1
chris at ocproducts dot com
8 年前
如果呼叫樹中的某處啟用了錯誤抑制(透過 @ 運算符),error_reporting() 函數將返回 0。
4
keithm at aoeex dot com
14 年前
某些 E_STRICT 錯誤似乎在頁面的編譯過程中拋出。這意味著它們無法透過在該頁面中動態變更執行時的錯誤級別來停用。

解決方法是重新命名該檔案,並將原始檔案替換為 error_reporting() 呼叫,然後再呼叫 require()。

例如,將 index.php 重新命名為 index.inc.php,然後重新建立 index.php 為

<?php
error_reporting
(E_ALL & ~(E_STRICT|E_NOTICE));
require(
'index.inc.php');
?>

這樣您就可以在檔案編譯之前變更錯誤回報。

我最近從另一家開發公司收到程式碼時發現了這一點,該程式碼觸發了數個 E_STRICT 錯誤,而我希望在每個頁面上停用 E_STRICT。
0
huhiko334 at yandex dot ru
6 年前
如果您收到類似「警告:mysql_query() : 您的查詢需要完整資料表掃描...」的奇怪 mysql 警告,請不要尋找 error_reporting 設定 - 它在 php.ini 中設定。
您可以使用以下程式碼關閉它
ini_set("mysql.trace_mode","Off");
在您的腳本中
http://tinymy.link/mctct
0
kevinson112 at yahoo dot com
6 年前
我遇到的問題是,如果發生錯誤,php 只會給我一個空白頁面。任何錯誤都會強制產生空白頁面,而不是任何輸出,即使我確定已將 error_reporting 設定為 E_ALL,並開啟 display_errors 等等。但是,只要在不同的目錄中執行該檔案,就可以顯示錯誤!

事實證明,其中一個目錄中的 error_log 檔案已滿 (2.0 Gb)。我刪除了該檔案,現在錯誤可以正常顯示。關閉錯誤記錄也可能有所幫助。

https://techysupport.co/norton-tech-support/
0
adam at adamhahn dot com
7 年前
為了擴展 chris at ocproducts dot com 的說明。如果您在 error_reporting() 前面加上 @,該函數將始終返回 0。

<?php
error_reporting
(E_ALL);
var_dump(
error_reporting(), // E_ALL 的值
@error_reporting() // 值為 0
);
?>
2
j dot schriver at vindiou dot com
24 年前
如果您已使用 set_error_handler() 定義了自己的錯誤處理常式,則 error_reporting() 無效

[編輯註記:這不太準確。

E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR 和 E_COMPILE_WARNING 錯誤級別將根據 error_reporting 設定進行處理。

所有其他級別的錯誤將傳遞給由 set_error_handler() 定義的自訂錯誤處理常式。

Zeev Suraski 建議將以下程式碼行新增至您的錯誤處理函數的頂部,即可簡單地將已定義的錯誤回報級別與自訂錯誤處理常式搭配使用

if (!($type & error_reporting())) return;

-zak@php.net]
0
qeremy ! gmail
9 年前
如果您想在您的本機環境中看到所有錯誤,您可以將您的專案 URL 在本機設定為「foo.com.local」,並將其放入引導檔案中。

<?php
if (substr($_SERVER['SERVER_NAME'], -6) == '.local') {
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
// 或 error_reporting(E_ALL);
}
?>
0
rojaro at gmail dot com
13 年前
若要啟用*所有*錯誤訊息的錯誤回報,包括每個錯誤級別(包括 E_STRICT、E_NOTICE 等),只需使用

<?php error_reporting(-1); ?>
0
DarkGool
19 年前
在 phpinfo() 中,錯誤回報級別顯示為位元(例如 4095)

如果您無法存取 php.ini 檔案,這可能是瞭解主機上設定級別的簡單方法
如果您無法存取 php.ini 檔案

<?php
$bit
= ini_get('error_reporting');
while (
$bit > 0) {
for(
$i = 0, $n = 0; $i <= $bit; $i = 1 * pow(2, $n), $n++) {
$end = $i;
}
$res[] = $end;
$bit = $bit - $end;
}
?>

在 $res 中,您將擁有所有錯誤回報常數
$res[]=int(16) // E_CORE_ERROR
$res[]=int(8) // E_NOTICE
...
-1
luisdev
6 年前
本文指的是這兩個回報級別

// 回報所有 PHP 錯誤(請參閱變更記錄)
error_reporting(E_ALL);

// 回報所有 PHP 錯誤
error_reporting(-1);

這兩個級別之間有什麼區別?

請更新本文,清楚解釋差異和可能的用例。
-2
teynon1 at gmail dot com
12 年前
在 error_reporting 中包含 E_COMPILE_ERROR 可能是一個好主意。

如果您的客戶錯誤處理常式不輸出警告,如果「require」失敗,您可能會得到空白的死亡畫面。

範例
<?php
error_reporting
(E_ERROR | E_WARNING | E_PARSE);

function
myErrorHandler($errno, $errstr, $errfile, $errline) {
// 執行訊息輸出以外的操作。
return true;
}

$old_error_handler = set_error_handler("myErrorHandler");

require
"this file does not exist";
?>

若要防止這種情況,只需在 error_reporting 中包含 E_COMPILE_ERROR。

<?php
error_reporting
(E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
?>
-1
roberto at spadim dot com dot br
14 年前
請參閱有關 php 5.3 已棄用錯誤的更多資訊

https://php.dev.org.tw/manual/en/migration53.deprecated.php
-1
fredrik at demomusic dot nu
19 年前
請記住 error_reporting 值是一個整數,而不是字串,例如「E_ALL & ~E_NOTICE」。

當在 httpd.conf 中設定 error_reporting 級別時,請務必記住這一點

請使用上表或

<?php
ini_set
("error_reporting", E_YOUR_ERROR_LEVEL);
echo
ini_get("error_reporting");
?>

來取得您錯誤級別對應的整數值。然後在

php_admin_value error_reporting YOUR_INT

中於 httpd.conf 設定。

我想要分享這個相當簡單的提示,因為對於嘗試理解為何當錯誤級別設定為 (int) "E_ALL" = 0 時程式碼無法正常運作的 PHP 新手來說,這實在很惱人...

也許 PHP 開發人員應該讓例如 error_reporting("E_ALL"); 輸出一個關於這個錯誤的 E_NOTICE 資訊訊息?
-2
Rash
9 年前
如果您使用 PHP 開發伺服器,透過指令列 `php -S servername:port` 執行,每個錯誤/注意/警告都會直接在指令列中報告,並包含檔案名稱、行號和堆疊追蹤。

所以,如果您想要保留所有錯誤的日誌,即使在頁面重新載入後(以便於除錯),執行 PHP 開發伺服器會很有用。
-2
kc8yds at gmail dot com
16 年前
這是為了顯示在不同版本上執行的程式碼的所有錯誤

對於 PHP 5,它會顯示 E_ALL^E_STRICT,而對於其他版本則只顯示 E_ALL

如果有人發現任何問題,請更正這篇文章

<?php
ini_set
('error_reporting', version_compare(PHP_VERSION,5,'>=') && version_compare(PHP_VERSION,6,'<') ?E_ALL^E_STRICT:E_ALL);
?>
-4
misplacedme at gmail dot com
15 年前
我總是設定 E_ALL 來編寫程式碼。
在寫了幾個頁面的
<?php
$username
= (isset($_POST['username']) && !empty($_POST['username']))....
?>

之後,我建立了這個函式來讓事情快一點。以引用傳遞的未設定的值不會觸發 notice。

<?php
function test_ref(&$var,$test_function='',$negate=false) {
$stat = true;
if(!isset(
$var)) $stat = false;
if (!empty(
$test_function) && function_exists($test_function)){
$stat = $test_function($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif(
$test_function == 'empty') {
$stat = empty($var);
$stat = ($negate) ? $stat^1 : $stat;
}
elseif (!
function_exists($test_function)) {
$stat = false;
trigger_error("$test_function() is not a valid function");
}
$stat = ($stat) ? true : false;
return
$stat;
}
$a = '';
$b = '15';

test_ref($a,'empty',true); //False
test_ref($a,'is_int'); //False
test_ref($a,'is_numeric'); //False
test_ref($b,'empty',true); //true
test_ref($b,'is_int'); //False
test_ref($b,'is_numeric'); //false
test_ref($unset,'is_numeric'); //false
test_ref($b,'is_number'); //returns false, with an error.
?>
-4
forcemdt
11 年前
Php > 5.4

建立自訂錯誤處理器

set_error_handler("customError",E_ALL);
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "結束腳本";
die();
}
-4
Daz Williams (The Northeast)
15 年前
僅向開發人員顯示 PHP 錯誤...

<?php
if($_SERVER['REMOTE_ADDR']=="00.00.00.00")
{
ini_set('display_errors','On');
}
else
{
ini_set('display_errors','Off');
}
?>

只需將 00.00.00.00 替換為您的 IP 位址。
-3
Alex
17 年前
如果使用了 @ 錯誤抑制指令,error_reporting() 可能會給出意料之外的結果。

<?php
@include 'config.php';
include
'foo.bar'; // 不存在的檔案
?>

config.php
<?php
error_reporting
(0);
?>

將會丟出一個與不存在檔案相關的 E_WARNING 錯誤級別 (當然這取決於您的設定)。如果移除抑制器,這就會如預期般運作。

或者,在 config.php 中使用 ini_set('display_errors', 0) 將會達到相同的結果。這與上面說這兩個指令等效的筆記相反。
To Top