来自PHP的AJAX输出错误代码

时间:2014-03-16 19:42:35

标签: javascript php jquery ajax

经过多次努力和在线阅读后,我仍然找不到这个问题的答案。在我的应用程序中,表单通过AJAX发送,然后在PHP中验证并添加到数据库中。但是,我可以发送成功消息,但我不知道如何将友好的错误消息发送回用户。

以下是我的JS:

$(document).ready(function(){
  var form = $('form');
  var submit = $('#submit');
  form.on('submit', function(e) {
      e.preventDefault();
      $.ajax({
          url: 'ajax_comment.php',
          type: 'POST',
          cache: false,
          data: form.serialize(),
          beforeSend: function(){
              submit.val('Posting...').attr('disabled', 'disabled');
          },
          success: function(data){
              var item = $(data).hide().fadeIn(800);
              $('.new-comment').append(item);

              form.trigger('reset');
              submit.val('Submit Comment').removeAttr('disabled');
          },
          error: function(e){
              alert(e);
          }
      });
  });
});

我对AJAX的经验不多,所以请跟我一起简单!错误消息将沿着'用户名不存在'等等,所以我不认为我可以通过客户端验证来做到这一点。提前谢谢!


编辑: 下面是我正在使用的PHP代码。

    <?php
// Include files
include 'config.php';

// Variables
$order_id = $_POST['order_id'];  
$comment  = $_POST['comment']; 
$reviewed = 1;
$date     = date('dS F Y');

// Find order ID match 
$stmt = $con->prepare("SELECT order_id FROM transactions WHERE order_id = ?");
$stmt->bind_param('i', $order_id);
$stmt->execute();
$stmt->store_result();
$no_id_match = $stmt->num_rows; 
$stmt->close(); 

// Check if review has already been submitted 
$stmt = $con->prepare("SELECT order_id FROM transactions WHERE order_id = ? AND review = 1");
$stmt->bind_param('i', $order_id);
$stmt->execute();
$stmt->store_result();
$num_rows_reviewed = $stmt->num_rows; 
$stmt->close(); 

if(empty($order_id) === true || empty($comment) === true) {
    exit();
} else if($num_rows_reviewed> 0) {
    exit();
} elseif($no_id_match == 0) {
    exit();
} elseif(strlen($comment) > 499) {
    exit();
} else {
    //Insert review into DB
    $stmt = $con->prepare("INSERT INTO reviews (order_id, comment, date) VALUES (?, ?, ?)");
    $stmt->bind_param('iss', $order_id, $comment, $date);
    $stmt->execute(); 
    $stmt->close();

    // Update transactions to show review added
    $stmt = $con->prepare("UPDATE transactions SET review = ? WHERE order_id = ?");
    $stmt->bind_param('ii', $reviewed, $order_id);
    $stmt->execute(); 
    $stmt->close();

    // Get name from order ID
    $stmt = $con->prepare("SELECT first_name, last_name FROM transactions WHERE order_id = ?");
    $stmt->bind_param('i', $order_id);
    $stmt->execute(); 
    $stmt->bind_result($first_name, $last_name);
    $stmt->fetch();
    $stmt->close();
    $name = $first_name. ' '. mb_substr($last_name, 0, 1);

    // Output review live to page ?>
    <div class="comment-item">
      <div class="comment-post">
        <h3><?php echo $name; ?>: <span><?php echo $date; ?></span></h3>
        <p><?php echo $comment; ?></p>
      </div>
    </div><?php 
}?>

目前exit()变量是我想验证脚本的地方。但是因为我现在不知道如何做到这一点,所以我只是退出剧本。

4 个答案:

答案 0 :(得分:2)

您可以使用HTTP方式从后端发送错误。

如果一切正常,发送一个用json编码的PHP数组。

$result = [];
$result['error'] = false;
$result['code'] = "OK"; //better with constant
$result['msg'] = "";
echo json_encode($result);

如果有什么东西不起作用,就像这样。

header('HTTP/1.1 500 Internal Server Error');
$result = [];
$result['error'] = false;
$result['code'] = "DB_UPDATE_ERROR"; //better with constant
$result['msg'] = "Impossible save bla, bla, bla";
echo json_encode($result);

答案 1 :(得分:1)

我相信解决方案是在PHP返回的最开始时添加一个成功/错误代码(您自己的代码)。

例如,如果数据(在ajax的success子句中)函数看起来像&#34;不正确的登录凭据&#34;,(当然来自PHP),你应该发送&#34; 200不正确的登录信息&# 34;或者&#34; 100成功登录&#34;来自PHP。

正如你所看到的200我的意思是PHP表示存在错误/认证或验证失败,而100我的意思是告诉AJAX所有内容都是从PHP端接受的。

然后你可以在jquery中执行此操作:

var data_code = data.substring(0,3);
var return_message = data.substring(3); // this is return message without code

if(data_code == 100) { 
 //its a success
  document.location.replace("success.html");
} else if(data_code == 200) {
 //its a fail
  alert("Error: " + return_message);
}

编辑:

if(empty($order_id) === true || empty($comment) === true) {
    echo "200comment or order id is empty";
    exit();
} else if($num_rows_reviewed> 0) {
    echo "200";
    exit();
} elseif($no_id_match == 0) {
    echo "200";
    exit();
} elseif(strlen($comment) > 499) {
   echo "200 comment cannot be bigger then 499";
    exit();
} else {
   echo"100"; // all is good

请注意,此方法的工作方式与预期相同,但有点棘手,我也使用它,我不想使用json(由其他用户回答)。


修改

success: function(data){
    var data_code = data.substring(0,3);
    var return_message = data.substring(3); // this is return message without code

    if(data_code == 100) { 
      var item = $(return_message).hide().fadeIn(800);
      $('.new-comment').append(item);

       form.trigger('reset');
       submit.val('Submit Comment').removeAttr('disabled');
    } else if(data_code == 200) {
     //its a fail
      alert("Error: " + return_message);
    }
},

答案 2 :(得分:0)

我建议使用JSON作为响应格式。因此,您可以在额外的响应键中发送错误消息。实施例

{
   data: "<div>...</div>",
   error: "username does not exist"
}

在您的响应函数中,您可以使用返回的键来访问不同的数据。

      success: function(returnedData){
          $('.new-comment').append(returnedData.data);
          if (returnedData.error) $('.error').append(returnedData.error);
      },

请务必将ajax请求的dataType设置为“json”。

答案 3 :(得分:0)

$(document).ready(function(){
var form = $('form');
var submit = $('#submit');
form.on('submit', function(e) {
e.preventDefault();
$.ajax({
      url: 'ajax_comment.php',
      type: 'POST',
      cache: false,
      data: form.serialize(),
      dataType:'json',
      beforeSend: function(){
          submit.val('Posting...').attr('disabled', 'disabled');
      },
      success: function(data){

          if(data.status) {
          var item = $(data).hide().fadeIn(800);
          $('.new-comment').append(item);

          form.trigger('reset');
          submit.val('Submit Comment').removeAttr('disabled');
          } else {
             alert(data.message);
             for(var value in data.fields) {
                alert(data.fields[value]); // can do error placement as well
             }
          }
      },
      error: function(e){
          alert(e);
      }
});
});
});

at ajax_comment.php 文件 只需编写代码作为示例 你剩下的代码 如果错误

$response['status'] = false;
$response['fields']['username'] = 'Not valid';  // fields name should be same like your 
$response['message'] = 'There are some error with given input, please correct'; 

表单字段名称,因此错误放置很容易

如果没有任何错误

$response['status'] = true;
$response['message'] = 'Successfully Submitted'; 

echo json_encode($response);