从 PHP 运行返回错误。阿贾克斯?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 是迄今为止最好的方法之一。

以上是关于从 PHP 运行返回错误。阿贾克斯?的主要内容,如果未能解决你的问题,请参考以下文章

遇到致命异常时如何让 php 返回 500?

当 mkdir 从 PHP 失败时如何找到原因?

Ajax 请求 500 错误 - 在 null 上调用成员函数

脚本 @php artisan package:discover 处理返回的 post-autoload-dump 事件,错误代码为 255

phpmailer / sendmail返回错误“对等连接重置”

当我尝试从 PHP 对象/数组返回值时,出现 500 错误。但是可以返回所有对象