使用PHPMailer发送邮件后无法实现页面重定向问题求助
解决PHP重定向报错与PHPMailer输出问题
问题根源
你碰到的Cannot modify header information错误,核心原因是PHPMailer的SMTP调试模式在发送邮件时输出了日志内容(对应错误里的SMTP.php第284行)。而HTTP头信息(比如header()重定向)必须在任何页面输出之前发送,一旦有内容输出,就无法再修改头信息。
具体修复步骤
关闭PHPMailer的调试输出
在你的sendEmails()函数里,找到PHPMailer初始化代码,把SMTP调试级别设为0,彻底禁止日志输出:$mail->SMTPDebug = 0; // 若之前是1/2则改成0,关闭调试输出这样PHPMailer就不会在后台输出SMTP交互日志,也就不会提前触发页面输出。
确保
header()前无任何输出
检查buyProducts.php文件开头,确保<?php标签前没有空格、空行,也不要在header()调用前写echo、HTML标签这类会产生输出的代码。优化购物车清空逻辑
不用循环逐个删除购物车项,直接重置数组更高效:$_SESSION["cart"] = []; // 直接清空购物车数组添加
exit()终止脚本执行
发送header()后必须加exit()或die(),确保脚本立即停止,避免后续代码可能产生的输出干扰重定向:header("location: myCart.php?acquistato=c"); exit(); // 必须添加,保证重定向立即生效
修复后的完整代码片段
$sql = "SELECT conti.Saldo FROM conti INNER JOIN carte ON(carte.Numero_carta = conti.Numero_carta) WHERE conti.Numero_carta = '$numero';"; if ($raw = $con->query($sql)) { $ris = $raw->fetch_assoc(); $new = $ris["Saldo"] - $tot; $update = "UPDATE conti SET Saldo = '$new' WHERE Numero_carta = '$numero'"; if ($con->query($update)) { // invio email per visualizzazione acquisto if(sendEmails($tot)){ $_SESSION["cart"] = []; // 直接清空购物车 header("location: myCart.php?acquistato=c"); exit(); // 终止脚本,确保重定向生效 } } }
额外安全提醒
你的SQL语句存在SQL注入风险,直接把$numero拼进SQL里非常危险,建议改用预处理语句:
// 预处理查询余额 $stmt = $con->prepare("SELECT conti.Saldo FROM conti INNER JOIN carte ON carte.Numero_carta = conti.Numero_carta WHERE conti.Numero_carta = ?"); $stmt->bind_param("s", $numero); // 根据$numero类型调整参数标识,s代表字符串 $stmt->execute(); $raw = $stmt->get_result(); $ris = $raw->fetch_assoc(); // 预处理更新余额 $stmt = $con->prepare("UPDATE conti SET Saldo = ? WHERE Numero_carta = ?"); $stmt->bind_param("ds", $new, $numero); // d代表数字类型,s代表字符串 $stmt->execute();
内容的提问来源于stack exchange,提问作者user18521537
相关产品推荐
相关产品推荐

