防止@触发自定义错误处理程序
似乎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://*.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