使用SweetAlert确认操作时PHP返回值无法传递到AJAX的问题求助
问题原因
- 被AJAX直接请求的PHP接口错误使用
return返回结果:直接通过HTTP访问的PHP脚本,只有echo/print等输出的内容才会作为响应返回给前端,return仅在脚本被include/require引入时才会向上层返回值,所以你的前端AJAX实际拿不到任何判断数据。 - 返回格式不规范:直接返回布尔值/字符串容易出现类型判断误差,推荐统一用JSON格式返回结果。
- 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
相关产品推荐
相关产品推荐

