You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SweetAlert确认操作时PHP返回值无法传递到AJAX的问题求助

问题原因

  1. 被AJAX直接请求的PHP接口错误使用return返回结果:直接通过HTTP访问的PHP脚本,只有echo/print等输出的内容才会作为响应返回给前端,return仅在脚本被include/require引入时才会向上层返回值,所以你的前端AJAX实际拿不到任何判断数据。
  2. 返回格式不规范:直接返回布尔值/字符串容易出现类型判断误差,推荐统一用JSON格式返回结果。
  3. Promise未正确触发回调:你在preConfirm中创建的Promise没有调用resolve()/reject(),可能导致SweetAlert一直卡在加载状态。

修改方案

1. 修改被AJAX请求的模型层PHP代码

<?php
// 指定响应格式为JSON,避免乱码和解析异常
header('Content-Type: application/json; charset=utf-8');
require_once '../database/database.php';

$voucher_name = $_POST['voucher_name'];
$quantity = $_POST['quantity'];
$discount = $_POST['discount'];

$result =  $user->AddVoucher($voucher_name,$quantity,$discount);

if($result == "Failed"):
    // 用echo输出结果,不要用return
    echo json_encode([
        'code' => 0,
        'msg' => '优惠券名称已存在'
    ]);
else:
    echo json_encode([
        'code' => 1,
        'msg' => '添加成功'
    ]);
endif;
// 终止后续输出,避免多余内容污染JSON格式
exit;
?>

2. 优化后端AddVoucher方法(可选,更稳妥)

把成功插入后的返回值改为布尔值,避免对象和字符串比较的潜在问题:

//新增优惠券
public function AddVoucher ($voucher_name, $quantity, $discount) 
{
    try
    {
            $stmt2 = $this->db->prepare("SELECT * FROM vouchers WHERE voucher_name=:voucher_name");
            $stmt2->bindParam(":voucher_name", $voucher_name,PDO::PARAM_STR);
            $stmt2->execute();
            $stmt2->fetchAll(PDO::FETCH_ASSOC);

            if($stmt2->rowCount())
            {
                return "Failed";
            }
            else
            {
            $discount /= 100;
            //名称不存在,执行新增
            $stmt = $this->db->prepare("INSERT INTO vouchers (voucher_name,quantity,discount) 
            VALUES(:voucher_name, :quantity, :discount)");
            $stmt->bindParam(":voucher_name", $voucher_name,PDO::PARAM_STR);
            $stmt->bindParam(":quantity", $quantity,PDO::PARAM_STR);
            $stmt->bindParam(":discount", $discount,PDO::PARAM_INT);
            $execRes = $stmt->execute();
            // 返回布尔值而非PDOStatement对象
            return $execRes;
        }
    }
    catch(PDOException $ex)
    {
        echo $ex->getMessage();
    }
}

3. 修改前端AJAX代码

function SwalConfirm()
{
  Swal.fire({
    title: '确认操作',
        text: "你将新增一张优惠券,是否继续?",
        type: 'warning',
        showCancelButton: true,
        confirmButtonColor: '#3085d6',
        cancelButtonColor: '#d33',
        confirmButtonText: '是的,继续',
        cancelButtonText: '取消',
        confirmButtonClass: 'btn bg-gradient-primary w-30',
        cancelButtonClass: 'btn bg-gradient-secondary w-30',
        buttonsStyling: false,
        preConfirm: function()
        {
            return new Promise(function(resolve, reject){
                $.ajax({
                    url: '../model/voucher_add.php',
                    type: 'POST',
                    dataType: 'json', // 声明返回格式为JSON,jQuery会自动解析
                    data:
                    {
                        voucher_name: $('#a_voucher_name').val(),
                        quantity: $('#a_quantity').val(),
                        discount: $('#a_discount').val()
                        
                    },
                    success: function(data)
                    {
                      resolve(data); // 触发Promise成功状态
                      if(data.code === 0)
                      {
                        Swal.fire('操作失败', '优惠券名称已存在,请编辑现有优惠券','warning').then(function(){
                          location.reload();
                        });
                      }
                      else
                      {
                        Swal.fire('操作成功', '优惠券新增成功','success').then(function(){
                            location.reload();
                        });
                      }
                    }
                })
                .fail(function(){
                    reject(); // 触发Promise失败状态
                    Swal.fire('请求失败', '网络或服务异常,请稍后重试','error')
                })
            });
        }
  });
}

修改完成后即可正常根据后端返回结果弹出对应提示。


内容的提问来源于stack exchange,提问作者Ginxxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:39:04