如何在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
相关产品推荐
相关产品推荐

