【问题标题】:Error handling in Ajax call (jQuery) not workingAjax 调用 (jQuery) 中的错误处理不起作用
【发布时间】:2020-08-19 03:22:13
【问题描述】:

我使用 jQuery 和 Ajax 将数据传递到 PHP / MySQLi 页面。 代码和查询按预期工作,但我找不到处理错误的方法。 例如。当我传递给 PHP 页面的数据已经存在于我的数据库中时,我想通知用户潜在的重复记录(请参阅下面代码中的注释)。

我尝试了不同的方法,但我的错误处理总是被忽略或不应用。 有人可以告诉我该怎么做吗?

jQuery(缩短):

$('#btnSave').on('click', function(e) {
    e.preventDefault();

    var vid = $.trim($('#vid').val());
    var vid2 = $.trim($('#vid2').val());
    var vid3 = $.trim($('#vid3').val());
    var mode = 'update';
        if(vid == 'new') {
            mode = 'insert';
        }

    $.ajax({
        type: 'POST',
        url: 'updateVid.php',
        data: {
            mode: mode,
            vstId: vstId, 
            vstId2: vstId2,
            vstId3: vstId3
        },
        success: function(result){
            alert('success');
        },
        error: function() {
            alert('error'); // I am unable to retrieve this in jQuery / Ajax resp. to do anything here
        }
    });
});

PHP / MySQLi(缩短):

<?php   
    require_once 'me/config.php';

    $postData = $_POST; 
    $mode = $_POST['mode'];
    $vid = $_POST['vid'];
    $vid2 = $_POST['vid2'];
    $vid3 = $_POST['vid3'];

    $conn = new mysqli($host, $username, $password, $database);
    if($conn->connect_error) {
        die("Connection Error: " . $conn->connect_error);
    }   
    if($mode == 'update') {
        $stmt = $conn->prepare("UPDATE vids v SET v.vid2 = ?, v.vid3 = ? WHERE v.vid = ?");
        $stmt->bind_param("sss", $vid, $vid2, $vid3);
        $stmt->execute();
    } else {
        $vid = '99999999';
        $vid2 = '99XXX999';

        $stmt = $conn->prepare("SELECT vid2 FROM vids WHERE vid = ?");
        $stmt->bind_param("s", $vid);
        $stmt->execute();
        $stmt->store_result();

        if($stmt->num_rows > 0) {
            echo 'Error'; // I am unable to retrieve this in jQuery / Ajax
        } else {
            $stmt->close();

            $stmt = $conn->prepare("INSERT INTO vids (vsid, vid2, vid3) VALUES (?, ?, ?)");
            $stmt->bind_param("sss", $vid, $vid2, $vid3);  
            $stmt->execute();

            echo 'Success';
        }
    }

    $stmt->close();
    $conn->close(); 
?>

提前非常感谢, 汤姆

【问题讨论】:

  • 因为你的 AJAX 调用总是成功的。如果 AJAX 调用失败,您将收到错误消息。你的 PHP 可以单独失败,但它不会产生 AJAX 错误,所以如果你想用 AJAX 处理 PHP 错误,你必须在成功函数中处理它们,但提供一种知道 PHP 失败的方法。

标签: php jquery ajax error-handling


【解决方案1】:

这都是关于 HTTP 状态代码的。当 http 状态码为 200/OK 时,触发 jQuery success 函数。如果返回的 http 状态码是错误的,它会调用 error 函数。知道您必须在 php 响应标头中发送 http 状态代码。

为此,请查看 php http_reponse_code() 函数。

http_response_code(422);
echo json_encode($some_data);
exit();

您的echo 输出始终是jQuery 的有效输出。输出不带状态码的数据始终是 200/OK 状态。如上所示,您可以使用 PHP 设置返回的状态。显示 HTTP 状态代码列表 here

【讨论】:

  • 非常感谢。这也很有帮助。
【解决方案2】:

因为您的 AJAX 调用总是成功的,所以您不会失败。如果 AJAX 调用失败,您将收到错误消息。

你的 PHP 可以单独失败,但它不会产生 AJAX 错误,所以如果你想用 AJAX 处理 PHP 错误,你必须在成功函数中处理它们,但提供一种知道 PHP 失败的方法。例如:

success: function(result){
  if(result->message == 'fail') {
      // handle failure here
  } 
},

quit using alert() for troubleshooting. 改用console.log()

【讨论】:

  • 关于这个的一个后续问题:我只是用这个来指代结果并让它工作。如何在 PHP 端添加 -> 消息?我要为此创建一个变量吗?
  • 是的 - 在 PHP 端创建一条消息并将其回显到 AJAX 调用。
猜你喜欢
  • 2011-04-06
  • 2013-07-03
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2011-05-23
  • 2015-09-26
相关资源
最近更新 更多