【问题标题】:Return errors from PHP run via. AJAX?从 PHP 运行返回错误。阿贾克斯?
【发布时间】:2011-05-23 23:50:27
【问题描述】:

如果 PHP 脚本在某处失败,有没有办法让 PHP 返回 AJAX 错误代码? 我正在学习一个教程并将其输入到我的 PHP 中:

$return['error'] = true; $return['msg'] = "无法连接到数据库";

一切都很好,直到我意识到这是 JSON 数据。有没有办法使用标准 $_POST 返回错误并返回 HTML 数据(如触发 jQuery 的 AJAX error: 事件?

【问题讨论】:

    标签: php ajax return


    【解决方案1】:

    我不了解 jQuery,但如果它区分成功和不成功(HTTP 200 OK 与 HTTP != 200)Ajax 请求,您可能希望您的 PHP 脚本以不等于 200 的 HTTP 代码响应:

    if ($everything_is_ok)
        {
            header('Content-Type: application/json');
            print json_encode($result);
        }
    else
        {
            header('HTTP/1.1 500 Internal Server Booboo');
            header('Content-Type: application/json; charset=UTF-8');
            die(json_encode(array('message' => 'ERROR', 'code' => 1337)));
        }
    

    【讨论】:

    • 谢谢 :-) 看起来很简单!另外,Booboo 是官方的吗,或者可以是什么?
    • 呵呵。它可以是任何东西。不过,“官方”术语是“内部服务器错误”。
    • @Bojangles 世纪评论哈哈 ^_^ 无法阻止自己发表评论。 :p
    • @LinusKleen 不,我认为Booboo 应该是标准。或者Foofd
    • 请注意,这可能会导致标准 IIS 安装/配置出现问题,因为 IIS 提供了一个 htm 站点并覆盖了您的 json 响应,以及您可能会覆盖的客户端 JSON.parse()已经实现,抛出异常。使用以下行更改 web.config 对我有帮助,但我不确定所有 IIS 配置组合是否都是这种情况:<httpErrors errorMode="Custom" existingResponse="PassThrough"/>
    【解决方案2】:
    $return = array();
    $return['msg'] = "Could not connect to DB";
    
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest')
    {
        header('Cache-Control: no-cache, must-revalidate');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Content-type: application/json');
        die(json_encode($return));
    }
    

    【讨论】:

    • 您需要使用 $_SERVER['HTTP_X_REQUESTED_WITH'] 强制您的请求。当 Accept 标头不匹配时,Firefox 等浏览器不会评估响应。
    【解决方案3】:

    试试这个。希望能帮助到你。

    <!-- This is index.php --->
    <html>
            <head>
                <script src="js/jquery.js" type="text/javascript"></script><!-- link to jQuery -->
                <script language="javascript"> 
                $(document).ready(function () {
                    $('input#send').click(function(){
                        /* Empty div#error and div#result incase they contain info from the last submission */
                        $('#error').empty('');
                        $('#result').empty('');
                        /* Client-side validation */
                        var name = $("input#name").val();
                        var age = $("input#age").val();
                        if (name==''){
                            alert('Insert your name.');
                        }
                        else if (age==''){
                            alert('Insert your age.');
                        } else { 
                            var params = 'name=' + name + '&age=' + age;   
                            $.ajax({        
                                 url:'b.php',        
                                 type:'post',                 
                                 dataType:'html',            
                                 data:params,
                                 cache: false,            
                                 success:data     
                                 }); 
                            function data (html) {
                                var $html = $( html ); // create DOM elements in a jQuery object
                                /* Return errors from 'b.php' */
                                $html.filter('#err').appendTo("#error");
                                /* Return valid Post */
                                $html.filter('#res').appendTo("#result");
                                /* Clear name input */
                                $('input#name').val('');
                                /* Clear age input */
                                $('input#age').val('');
                            }
                        }
                    }); 
                }); 
                </script>
                <style type='text/css'>
                    #error{
                        color:maroon;
                        font-weight:bold;
                    }
                    #result{
                        color:green;
                        font-weight:bold;
                    }
                </style>
            </head>
            <body>
                <div id="error"></div><!-- View Errors -->
                <div id="result"></div><!-- View valid Post -->
                <input type='text' name='name' id="name" value='' /><br/ >
                <input type='text' name='age' id="age" value='' /><br/ >
                <input type='submit' name='send' id="send" value='Send' />
            </body>
    

    <?php
    /* This is b.php */
    if(($_POST['name']=='')||($_POST['age']=='')){
        $error = '<div id="err">Error: Fill in ALL fields.</div>';
    } elseif(is_numeric($_POST['name'])){
        $error = '<div id="err">Error: Name should NOT contain numbers.</div>';
    } elseif(!is_numeric($_POST['age'])){
        $error = '<div id="err">Error: Age should ONLY contain numbers.</div>';
    } else{
        $result = '<div id="res">Hi '.$_POST['name'].', you are '.$_POST['age'].' years old.</div>';
    }
    echo $error;
    echo $result;
    ?>
    

    【讨论】:

    • 这不会触发 OP 请求的 $.ajax 错误事件。
    【解决方案4】:

    对于从 PHP 到 AJAX 的简单数据传输,Json 编码或键值对并不总是必要的。它可以简单地使用字符串处理来完成。

    解释此功能的示例代码如下。

    $query = "从登录中选择电子邮件,其中电子邮件 = '"。 mysqli_real_escape_string($conn,$email) ."' AND 密码 = '"。 mysqli_real_escape_string($conn,$pass) ."'" ; $result = mysqli_query($conn,$query); $row=mysqli_fetch_row($result); $row_cnt = mysqli_num_rows($result); $s_email = $row[0]; 如果($row_cnt == 1){ $response="成功"; } 别的 { $response = "无效凭证"; } $conn->关闭(); $_SESSION["email"]= $s_email; 回声$响应;

    此代码显示了如何将“成功”响应发送回调用 php 代码的 ajax。进一步在 ajax 中,可以执行以下操作来检索响应。

    $.ajax({ type : 'POST', 数据:{电子邮件:$('#email').val(),密码:$('#pass').val()}, 网址:'login.php', 成功:函数(数据){ if(data == 'success'){ //php回显的值可以存放在ajax的data变量中 window.location.assign('upload.php'); } 别的{ 警报(数据); } }, 错误:函数(xhr){ 警报(“错误”); } });

    上述概念也可以扩展为返回 MULTIPLE VALUES。此方法允许以字符串格式将数据从 PHP 简单传输到 AJAX。

    我们必须遵循一个简单的步骤,将我们需要发送的所有内容作为响应从 php 发送到 ajax,并由唯一的分隔符分隔。

    回声 $response.#; 回声$电子邮件。#; 回声$密码。#; 回声“你好”。#; 回声“世界”;

    然后可以像上面的例子一样简单地检索ajax中的变量数据和一个简单的函数,

    var res = data.split("#");

    data,作为ajax中的变量。 然后可以在 js 中将 res 数组用于我们需要的任何目的。

    【讨论】:

    • 这没有回答我原来的问题。我不想滚动自己的数据格式(这是一个非常糟糕的主意),我实际上想在状态标题中发送 500。顺便说一句,JSON 有什么问题? Seeing such complicated answers pains me.;通过创建自己的数据格式,您的答案可能是最不必要的复杂。您还应该使用 PDO(或更好的替代方案;我没有跟上 PHP 生态系统的步伐)而不是 mysqli_* 以获得更好的安全性。
    • 对不起,如果该声明似乎冒犯了其他答案。我只是提出了一个简单的想法,即返回数据而不是 json 编码。有时控制数据比依赖内置功能有很大帮助。我使用 mysqli 作为示例 PDO 是迄今为止最好的方法之一。
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2023-03-21
    • 2015-01-13
    相关资源
    最近更新 更多