2012-08-11 58 views
0

似乎PHP的錯誤抑制程序@仍然觸發我的自定義錯誤處理程序,雖然它不顯示屏幕上的錯誤。防止@觸發自定義錯誤處理程序

例子:

@json_decode(array());

這不會在屏幕上輸出錯誤信息,但它仍然會運行我的錯誤處理程序(例如,記錄錯誤,給我發郵件,腳本終止,好像有一個「真正的」錯誤)。

@完全沉默嗎?

+2

你實際上應該得到一個-1來使用@首先 – w00 2012-08-11 19:25:41

+0

@ w00你應該得到-1因爲沒有別的辦法,看這裏http://stackoverflow.com/questions/2348152/detect-bad-json- data-in-php-json-decode +1對我來說:-) – IMB 2012-08-11 19:27:29

+0

wtf你在說什麼。在那個話題中,OP顯然存在問題,他將'array'傳遞給'json_decode'函數而不是字符串。難怪它吐出一個錯誤。只要確保$變量實際上是字符串類型。 -2爲你:-) – w00 2012-08-11 19:39:28

回答

2

我不相信你可以防止錯誤處理程序看到被@壓制的錯誤。

但是,您可以隔離這些錯誤並自行承擔風險而忽略它們。

將下面的代碼在你的錯誤處理程序:

// get the current error reporting level 
$level = error_reporting(); 

// if error was supressed or $errno not set in current error level 
if ($level == 0 || ($level & $errno) == 0) { 
    return true; 
} 

注意$errno是第一個參數錯誤處理程序回調。

+0

$ level == 0是不必要的。你可以寫如果語句如下:if($ level&$ errno) – bobwienholt 2012-08-11 19:37:35

3

如果你想檢測有效的json然後atleat確保你傳遞給json_decode的「參數」是字符串類型。從php.net

引用:

返回適當PHP類型在JSON編碼的值。值 true,false和null(不區分大小寫)分別返回TRUE,FALSE 和NULL。如果json無法解碼,則返回NULL 或編碼數據比遞歸限制更深。

因此,如果JSON無法解碼,我們正在尋找NULL。因此,無效的JSON。但是,再次確保你傳遞一個字符串而不是其他類型,比如數組或者布爾值等。因爲那永遠不會起作用。

我明白你的問題。 @符號可以抑制錯誤消息,但不是實際的代碼流。它出錯時仍會退出。但是你真的不得不放棄@符號。

所以,無論如何,你可能會有某種你打電話的功能,其中包括json_decode。這只是一個例子,但它應該讓你明白我的意思。

<?php 

// will fail, because it's not a string 
$str1 = array ("nooblol"); 

// Will succeed. This is valid json 
$str2 = '{"example":"value"}'; 

// Will fail, is of type string, but still an invalid json format 
$str3 = 'invalid json string'; 

function saveData ($json) 
{ 
    // Check if the variable that we're about to pass 
    // to json_decode() is an actual string. Otherwise we 
    // have invalid json data anyway. 
    if (!is_string ($json)) 
    { 
     echo 'Invalid json (or invalid type)'; 
     return; 
    } 

    if (!$obj = json_decode ($json)) 
    { 
     echo 'fail'; 
     return; 
    } 

    // Print json object 
    print_r($obj); 
} 

saveData ($str3); 

?> 

活生生的例子:http://codepad.viper-7.com/KJL8st 更改saveData參數去$str1$str2看到不同的結果。

這是檢查你是否有有效的json的方法。不要單獨依靠json_decode()函數來告訴你它是否有效數據。這是一個函數,它只是期望一個字符串。所以確保你傳入一個字符串。只有這樣它才能告訴你它是否有效。

+0

這些也是有效的json,但在你的示例中會失敗''str ='';''''或'$ str = null;' – IMB 2012-08-11 21:43:24

+0

@IMB - 那些示例不是有效的JSON。 JSON文本的最外層必須是數組或對象。參見[規範](http://www.ietf.org/rfc/rfc4627.txt)的第二部分(JSON語法)第二節。 – Quentin 2012-08-11 21:58:10

+0

@Quentin要清楚0'json_encode($ str)'使得它們有效的JSON。現在,當你在上面的腳本中運行它時,它們將失敗。 – IMB 2012-08-12 08:45:00

相關問題