如何使用 PHP 为 JQuery .ajax() 返回正确的成功/错误消息?

Posted

技术标签:

【中文标题】如何使用 PHP 为 JQuery .ajax() 返回正确的成功/错误消息?【英文标题】:How do I return a proper success/error message for JQuery .ajax() using PHP? 【发布时间】:2012-03-29 09:13:56 【问题描述】:

我不断收到错误警报。 mysql 部分没有问题,查询被执行,我可以看到数据库中的电子邮件地址。

客户端:

<script type="text/javascript">
  $(function() 
    $("form#subsribe_form").submit(function() 
      var email = $("#email").val();

      $.ajax(
        url: "subscribe.php",
        type: "POST",
        data: email: email,
        dataType: "json",
        success: function() 
          alert("Thank you for subscribing!");
        ,
        error: function() 
          alert("There was an error. Try again please!");
        
      );
      return false;
    );
  );
</script>

服务器端:

<?php 
$user="username";
$password="password";
$database="database";

mysql_connect(localhost,$user,$password);
mysql_select_db($database) or die( "Unable to select database");

$senderEmail = isset( $_POST['email'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['email'] ) : "";

if($senderEmail != "")
    $query = "INSERT INTO participants(col1 , col2) VALUES (CURDATE(),'".$senderEmail."')";
mysql_query($query);
mysql_close();

$response_array['status'] = 'success';    

echo json_encode($response_array);
?>

【问题讨论】:

考虑使用pdo,mysql_函数已经过时了 【参考方案1】:

如果您使用 JSON 数据类型,则需要提供正确的内容类型。在回显 json 之前,请放置正确的标题。

<?php    
    header('Content-type: application/json');
    echo json_encode($response_array);
?>

附加修复,请检查查询是否成功。

if(mysql_query($query))
    $response_array['status'] = 'success';  
else 
    $response_array['status'] = 'error';  

在客户端:

success: function(data) 
    if(data.status == 'success')
        alert("Thank you for subscribing!");
    else if(data.status == 'error')
        alert("Error on query!");
    
,

希望对你有帮助。

【讨论】:

哦,你应该区分服务器端错误传输错误。我在 AJAX 的 success 部分进行了检查,以检查服务器发送的值(所以它不是传输错误)。 如何存储多个变量,如 $response_array['status']='success', $response_array['userid'] = $userid;等等【参考方案2】:

您知道,您可以使用它进行调试。它帮助了我很多,现在仍然如此

error:function(x,e) 
    if (x.status==0) 
        alert('You are offline!!\n Please Check Your Network.');
     else if(x.status==404) 
        alert('Requested URL not found.');
     else if(x.status==500) 
        alert('Internel Server Error.');
     else if(e=='parsererror') 
        alert('Error.\nParsing JSON Request failed.');
     else if(e=='timeout')
        alert('Request Time out.');
     else 
        alert('Unknow Error.\n'+x.responseText);
    

【讨论】:

@Pieter: 然后实现你自己的 js_encode :) 试试这个:snippets.dzone.com/posts/show/7487【参考方案3】:

有些人建议使用 HTTP 状态码,但我相当鄙视这种做法。例如如果您在做搜索引擎并且提供的关键字没有结果,则建议返回 404 错误。

但是,我认为这是错误的。 HTTP 状态代码适用于实际的浏览器服务器连接。关于连接的一切都很完美。浏览器发出请求,服务器调用您的处理程序脚本。脚本返回“无行”。没有任何内容表示“未找到 404 页面” - 页面WAS已找到。

相反,我倾向于将 HTTP 层与服务器端操作的状态分开。我不是简单地在 json 字符串中返回一些文本,而是返回一个封装了请求状态和请求结果的 JSON 数据结构。

例如在 PHP 中你会有

$results = array(
   'error' => false,
   'error_msg' => 'Everything A-OK',
   'data' => array(....results of request here ...)
);
echo json_encode($results);

然后在您的客户端代码中,您将拥有

if (!data.error) 
   ... got data, do something with it ...
 else 
   ... invoke error handler ...

【讨论】:

【参考方案4】:

为了构建一个 AJAX 网络服务,你需要两个文件:

使用 JQuery AJAX 以 POST(可能是 GET)的形式发送数据的调用 Javascript 一个返回JSON对象的PHP webservice(方便返回数组或大量数据)

所以,首先你在 JavaScript 文件中使用这个 JQuery 语法调用你的 web 服务:

$.ajax(
     url : 'mywebservice.php',
     type : 'POST',
     data : 'records_to_export=' + selected_ids, // On fait passer nos variables, exactement comme en GET, au script more_com.php
     dataType : 'json',
     success: function (data) 
          alert("The file is "+data.fichierZIP);
     ,
     error: function(data) 
          //console.log(data);
          var responseText=JSON.parse(data.responseText);
          alert("Error(s) while building the ZIP file:\n"+responseText.messages);
     
);

您的 PHP 文件(mywebservice.php,在 AJAX 调用中编写)应在其末尾包含类似的内容,以返回正确的成功或错误状态:

<?php
    //...
    //I am processing the data that the calling Javascript just ordered (it is in the $_POST). In this example (details not shown), I built a ZIP file and have its filename in variable "$filename"
    //$errors is a string that may contain an error message while preparing the ZIP file
    //In the end, I check if there has been an error, and if so, I return an error object
    //...

    if ($errors=='')
        //if there is no error, the header is normal, and you return your JSON object to the calling JavaScript
        header('Content-Type: application/json; charset=UTF-8');
        $result=array();
        $result['ZIPFILENAME'] = basename($filename); 
        print json_encode($result);
     else 
        //if there is an error, you should return a special header, followed by another JSON object
        header('HTTP/1.1 500 Internal Server Booboo');
        header('Content-Type: application/json; charset=UTF-8');
        $result=array();
        $result['messages'] = $errors;
        //feel free to add other information like $result['errorcode']
        die(json_encode($result));
    
?>

【讨论】:

【参考方案5】:

服务器端:

if (mysql_query($query)) 
    // ...

else 
    ajaxError(); 

客户端:

error: function() 
    alert("There was an error. Try again please!");
,
success: function()
    alert("Thank you for subscribing!");

【讨论】:

【参考方案6】:

添加到最佳答案:这是来自 PHP 和 Jquery 的一些示例代码:

$("#button").click(function () 
 $.ajax(
            type: "POST",
            url: "handler.php",
            data: dataString,

                success: function(data) 

                  if(data.status == "success")

                 /* alert("Thank you for subscribing!");*/

                   $(".title").html("");
                    $(".message").html(data.message)
                    .hide().fadeIn(1000, function() 
                        $(".message").append("");
                        ).delay(1000).fadeOut("fast");

                 /*    setTimeout(function() 
                      window.location.href = "myhome.php";
                    , 2500);*/


                  
                  else if(data.status == "error")
                      alert("Error on query!");
                  




                    


        );

        return false;
     
 );

PHP - 发送自定义消息/状态:

    $response_array['status'] = 'success'; /* match error string in jquery if/else */ 
    $response_array['message'] = 'RFQ Sent!';   /* add custom message */ 
    header('Content-type: application/json');
    echo json_encode($response_array);

【讨论】:

【参考方案7】:

我遇到了同样的问题。我的问题是我的标头类型设置不正确。

我刚刚在我的 json echo 之前添加了这个

header('Content-type: application/json');

【讨论】:

【参考方案8】:

...您可能还想检查跨站点脚本问题...如果您的 html 页面来自不同的域/端口组合然后您的其余服务,您的浏览器可能会阻止调用。

通常,鼠标右键->检查您的 html 页面。 然后在错误控制台中查看诸如

之类的错误

从源“...:8383”访问“...:8080”处的 XMLHttpRequest 已被阻止 CORS 策略:请求中不存在“Access-Control-Allow-Origin”标头 资源。

【讨论】:

以上是关于如何使用 PHP 为 JQuery .ajax() 返回正确的成功/错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery、ajax 和 php 在数据库中保存图像文件 (BLOB)

使用 jQuery 和 AJAX 的跨域 PHP 调用

如何使用 AJAX/JQuery 调用多个 PHP 脚本?

如何根据复选框更新数据库值? jQuery/php/ajax

codeigniter php 和 jquery - 如何从多个表中获取数据并通过 ajax 返回

如何使用 php jquery ajax 上传文件和插入数据