似乎PHP的錯誤抑制程序@
仍然觸發我的自定義錯誤處理程序,雖然它不顯示屏幕上的錯誤。防止@觸發自定義錯誤處理程序
例子:
@json_decode(array());
這不會在屏幕上輸出錯誤信息,但它仍然會運行我的錯誤處理程序(例如,記錄錯誤,給我發郵件,腳本終止,好像有一個「真正的」錯誤)。
@
完全沉默嗎?
似乎PHP的錯誤抑制程序@
仍然觸發我的自定義錯誤處理程序,雖然它不顯示屏幕上的錯誤。防止@觸發自定義錯誤處理程序
例子:
@json_decode(array());
這不會在屏幕上輸出錯誤信息,但它仍然會運行我的錯誤處理程序(例如,記錄錯誤,給我發郵件,腳本終止,好像有一個「真正的」錯誤)。
@
完全沉默嗎?
我不相信你可以防止錯誤處理程序看到被@
壓制的錯誤。
但是,您可以隔離這些錯誤並自行承擔風險而忽略它們。
將下面的代碼在你的錯誤處理程序:
// 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
是第一個參數錯誤處理程序回調。
$ level == 0是不必要的。你可以寫如果語句如下:if($ level&$ errno) – bobwienholt 2012-08-11 19:37:35
如果你想檢測有效的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()
函數來告訴你它是否有效數據。這是一個函數,它只是期望一個字符串。所以確保你傳入一個字符串。只有這樣它才能告訴你它是否有效。
這些也是有效的json,但在你的示例中會失敗''str ='';''''或'$ str = null;' – IMB 2012-08-11 21:43:24
@IMB - 那些示例不是有效的JSON。 JSON文本的最外層必須是數組或對象。參見[規範](http://www.ietf.org/rfc/rfc4627.txt)的第二部分(JSON語法)第二節。 – Quentin 2012-08-11 21:58:10
@Quentin要清楚0'json_encode($ str)'使得它們有效的JSON。現在,當你在上面的腳本中運行它時,它們將失敗。 – IMB 2012-08-12 08:45:00
你實際上應該得到一個-1來使用@首先 – w00 2012-08-11 19:25:41
@ w00你應該得到-1因爲沒有別的辦法,看這裏http://stackoverflow.com/questions/2348152/detect-bad-json- data-in-php-json-decode +1對我來說:-) – IMB 2012-08-11 19:27:29
wtf你在說什麼。在那個話題中,OP顯然存在問題,他將'array'傳遞給'json_decode'函數而不是字符串。難怪它吐出一個錯誤。只要確保$變量實際上是字符串類型。 -2爲你:-) – w00 2012-08-11 19:39:28