PHP发送订单通知邮件时$_SESSION["cart"]数组无法显示问题
问题原因
$_SESSION["cart"]内容无法正常显示,核心是三个问题:
- 购物车数组一般是多维结构(每个商品包含名称、数量、价格等多个字段),直接用
implode("<br>", $_SESSION["cart"])处理多维数组时,只会输出Array占位符,无法读取实际内容。 implode只能拼接简单的换行文本,无法生成你需要的表格展示效果。- 若未开启PHPMailer的HTML模式,所有HTML标签都不会被渲染,会直接以源码形式显示。
实现代码
首先确保开启PHPMailer的HTML支持,再遍历购物车数组拼接HTML表格,最后嵌入邮件正文即可,表格全部用内联样式保证所有邮件客户端都能正常显示:
// 拼接购物车商品表格 $cartContent = '<table style="width: 100%;border-collapse: collapse;margin: 16px 0;"> <thead> <tr style="background: #f3f4f6;"> <th style="border:1px solid #e5e7eb;padding:8px;text-align:left;">商品名称</th> <th style="border:1px solid #e5e7eb;padding:8px;text-align:center;">购买数量</th> <th style="border:1px solid #e5e7eb;padding:8px;text-align:right;">单价</th> </tr> </thead> <tbody>'; foreach ($_SESSION["cart"] as $goods) { // 如果你的购物车是仅存商品名的一维数组,把下面$goods对应的键名直接换成$goods即可 $cartContent .= '<tr> <td style="border:1px solid #e5e7eb;padding:8px;">'.htmlspecialchars($goods['name']).'</td> <td style="border:1px solid #e5e7eb;padding:8px;text-align:center;">'.intval($goods['num']).'</td> <td style="border:1px solid #e5e7eb;padding:8px;text-align:right;">'.number_format($goods['price'],2).'元</td> </tr>'; } $cartContent .= '</tbody></table>'; // 组装邮件 $mail->Subject = 'ORDER NOTICE'; $mail->isHTML(true); // 必须开启,否则HTML格式不生效 $mail->Body = '<p> Dear '.$dn.',<br> An Order has been made on '.$date.' to be delivered to this address: '.$da.'<br> Please expect your order within 2 days.<br> Please note that this order is Pay on delivery.<br> These are the Items to be delivered: </p>'.$cartContent;
注意事项
- 动态插入HTML的变量建议用
htmlspecialchars()转义,避免特殊字符打乱HTML结构导致显示异常。 - 邮件内的样式必须写内联样式,不要用外部CSS、类选择器,多数邮件客户端不支持非内联的样式定义。
- 如果
$_SESSION["cart"]是一维数组(仅存储商品名称字符串),可以删掉表格里多余的数量、单价列,遍历时直接输出$goods即可。 - 发送前可以先把
$cartContent打印到本地页面确认表格结构正常,再调邮件发送接口,排查问题更高效。
内容的提问来源于stack exchange,提问作者Olufuwa David
相关产品推荐
相关产品推荐

