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

如何在if else语句中集成PHPMailer,点击按钮发送订单状态邮件

重复发邮件的核心原因

你之前的逻辑没有校验订单状态是否真的发生了变更,只要请求命中if判断就会触发发信,页面刷新、重复访问链接、状态未更新的重复请求都会导致重复发信。另外使用GET请求的跳转按钮也极易被误触发。

可行实现方案

1. 前端按钮修改:替换GET跳转请求为POST表单提交

避免用户刷新、收藏链接、浏览器预加载等场景误触发请求,原有按钮代码替换为:

<td>
  <center>
    <form method="post" action="orderstatus.php">
      <input type="hidden" name="orderid" value="<?php echo $orderid; ?>">
      <input type="hidden" name="orderstatus" value="Accept">
      <button type="submit" class="btn btn-primary">Accept</button>
    </form>
  </center>
</td>

InKitchen、Ready等其他状态的按钮也按照相同格式修改即可。

2. 后端逻辑调整:增加状态变更校验

核心逻辑:只有当新提交的状态和数据库中原有订单状态不一致、且数据库更新成功时,才触发邮件发送。orderstatus.php调整后的代码如下:

// 接收参数并做基础转义,避免SQL注入
$conn = 你的数据库连接实例;
$orderid = mysqli_real_escape_string($conn, $_POST['orderid']);
$new_status = mysqli_real_escape_string($conn, $_POST['orderstatus']);

// 一次查询获取订单原有状态、对应绑定的用户信息
$order_sql = "SELECT o.orderstatus as old_status, u.username, u.email 
              FROM 你的订单表名 o 
              LEFT JOIN 你的用户表名 u ON o.用户关联字段 = u.id 
              WHERE o.orderid = '$orderid' 
              LIMIT 1";
$order_res = mysqli_query($conn, $order_sql);
$order_info = mysqli_fetch_assoc($order_res);

// 状态未发生变更,直接跳转回订单列表,不做任何操作
if($new_status == $order_info['old_status']){
    header("Location: 你的订单列表页面地址");
    exit;
}

// 封装PHPMailer发信逻辑,避免重复代码
function send_order_mail($user_email, $user_name, $order_status){
    require '你的PHPMailer引入路径';
    $mail = new PHPMailer();
    // 此处填写你的SMTP发件人配置、邮件模板内容
    $mail->addAddress($user_email, $user_name);
    $mail->Subject = "您的订单状态已更新为:$order_status";
    $mail->Body = "您好,您的餐饮订单当前状态已更新为:$order_status,请耐心等待配送。";
    $mail->send();
}

// 状态发生变更,执行更新+发信逻辑
if($new_status == "Accept"){
    $update_sql = "UPDATE 你的订单表名 SET orderstatus = 'Accept' WHERE orderid = '$orderid'";
    if(mysqli_query($conn, $update_sql)){
        send_order_mail($order_info['email'], $order_info['username'], "已接单");
    }
}elseif($new_status == "InKitchen"){
    $update_sql = "UPDATE 你的订单表名 SET orderstatus = 'InKitchen' WHERE orderid = '$orderid'";
    if(mysqli_query($conn, $update_sql)){
        send_order_mail($order_info['email'], $order_info['username'], "制作中");
    }
}elseif($new_status == "Ready"){
    $update_sql = "UPDATE 你的订单表名 SET orderstatus = 'Ready' WHERE orderid = '$orderid'";
    if(mysqli_query($conn, $update_sql)){
        send_order_mail($order_info['email'], $order_info['username'], "已出餐");
    }
}

// 操作完成后立刻跳转,避免用户刷新页面重复触发
header("Location: 你的订单列表页面地址");
exit;

3. 额外优化(可选)

可以在订单表中新增对应状态的发信标记字段,比如accept_mail_sent、kitchen_mail_sent、ready_mail_sent,默认值为0,发信成功后更新为1,更新数据时直接在SQL中增加发信标记的判断:

UPDATE 你的订单表名 SET orderstatus = 'Accept', accept_mail_sent = 1 WHERE orderid = '$orderid' AND accept_mail_sent = 0

哪怕出现异常请求,只要标记已经为1就不会执行更新,从根源上避免重复发信。

内容的提问来源于stack exchange,提问作者Mausam Bahar Barbhuiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:39:02