如何显示JSON解析错误?

时间:2015-05-10 08:11:31

标签: php ajax json

我有一个前端登录页面,旨在解析JSON消息。它的逻辑是:

    $(document).ready(function() {
  $('#form_login').ajaxForm(function(response) {
    $("#content").html(response.message);
    if(response.result == 0) {
      window.setTimeout(function() {
        window.location.href = response.lnkmember;
      }, 2000);
    }
  });
});

问题是如果后端PHP中存在拼写错误或错误,则前端无法显示这些错误或通知用户。它看起来很悬,但是当我在Chrome上打开开发工具时,我可以看到以下网络数据确实被转回。

<br />
<b>Notice</b>:  Undefined variable: email_support in <b>technical\public_html\email.php</b> on line <b>57</b><br />
Mailer Error: You must provide at least one recipient email address.
{"result":"2", "message":"An internal error occurred. Our technical staff has been informed to fix this. Sorry for any inconvenience."}

在后端,我确实使用了try-catch逻辑,并返回一个非零字段&#39;结果&#39;在JSON回复中。但是如果php错误是在json消息之前,那么前端就不高兴了。

最满意的解决方案是将PHP错误发送给技术支持,同时仅向用户显示我的JSON消息。但我不知道如何实现这一目标。那你可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您需要明确捕获自己的错误消息,我会尝试将错误的JSON作为字符串传回客户端:

    $(document).ready(function() {
        $('#form_login').ajaxForm(function(response) {

            if ( response.result == 2 ) {
               // handle error
               console.log(response.message);
               console.log(response.originalJSON);
            } else {

                $("#content").html(response.message);
                if(response.result == 0) {
                    window.setTimeout(function() {
                      window.location.href = response.lnkmember;
                    }, 2000);
                }
            }
        });
    });

与消息一起,您传回发送的JSON字符串:

    {"result":"2", 
     "message":"An internal error occurred. Our technical staff has been informed to fix this. Sorry for any inconvenience."
     "originalJSON":" .... stringyfied JSON from the PHP ...." }

修改 在PHP方面,您可能会以这种方式捕获JSON错误:

    $json_parsed = json_decode($json_string, true);

    if ( hasJSONerror() !== false )
    {
        // output json_string
        return;
    }
    ....

    function hasJSONerror()
    {
        // Define the possible JSON errors.
        $json_errors = array(
          JSON_ERROR_NONE => 'No error has occurred',
          JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
          JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
          JSON_ERROR_SYNTAX => 'Syntax error',
          JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
        );
        if ( json_last_error() != 0 )
        {

            return json_last_error();
        }
        return false;
    }

答案 1 :(得分:0)

由于PHP中的响应解析警告或通知的实际困难(实际错误会导致500响应标题,这很容易捕获),我个人对生产的看法是实际告诉PHP禁用所有显示的警告对于这个页面。

所以,在这个PHP脚本的顶部,添加:

error_reporting(E_NONE);
ini_set('display_errors', 0);

这将禁用此页面的PHP输出错误,允许您处理它们。

请注意:更好地 ,只需确保生产中不会出现此类警告!如果您觉得无法处理(不应该),那么您可以使用@符号来沉默PHP。