
本文介绍如何使用 ajax 异步提交表单,避免页面刷新,同时将 php 会话中的商品数量和 html 提示消息分别写入指定 dom 元素,并实现提示自动消失功能。
本文介绍如何使用 ajax 异步提交表单,避免页面刷新,同时将 php 会话中的商品数量和 html 提示消息分别写入指定 dom 元素,并实现提示自动消失功能。
在电商类 Web 应用中,向购物车添加商品时若每次提交都刷新页面,用户体验较差。理想的方案是:表单异步提交 → 后端处理并返回结构化数据 → 前端解析并更新计数与提示 → 提示自动淡出。本教程将基于 jQuery AJAX 实现这一完整流程。
✅ 推荐方案:前后端 JSON 通信
原始代码中,PHP 直接输出混合 HTML 与数字(如 echo $count; echo '
? 后端改造(my_add_cart.php)
<?php session_start();
// 安全地接收并过滤输入(生产环境建议使用 filter_input)
$title = $_POST['title'] ?? '';
$price = $_POST['price'] ?? '';
$img_src = $_POST['img_src'] ?? '';
// 存入 SESSION 数组(注意:确保 SESSION 已启动且未输出前调用 session_start())
$_SESSION['title'][] = $title;
$_SESSION['price'][] = $price;
$_SESSION['img_src'][] = $img_src;
$count = count($_SESSION['title']);
// 设置 JSON 响应头,避免 MIME 类型错误
header('Content-Type: application/json; charset=utf-8');
// 返回结构化数据,含数量与可直接插入的 HTML 提示
echo json_encode([
'count' => (int)$count,
'message' => '<div class="alert" id="cart-alert">
<span class="closebtn" onclick="this.parentElement.style.display=\'none\';">×</span>
<center>Product added successfully to cart.</center>
</div>'
]);
exit();
?>
⚠️ 注意事项:
- 确保 session_start() 在任何输出(包括空格、BOM)之前调用;
- 生产环境中应对 $_POST 数据进行校验与转义(如 htmlspecialchars() 处理输出,filter_var() 验证输入);
- 使用 (int) 强制类型转换保障 $count 为整数,防止 XSS 或类型混淆。
?️ 前端改造(HTML + JavaScript)
<!-- 提示区域与计数显示 --> <p id="msg"></p> <p id="count"></p> <!-- 表单(注意:移除重复的 onclick,仅保留 onsubmit 即可) --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script> function clickButton() { const title = $('#title').val().trim(); const price = $('#price').val().trim(); const img_src = $('#img_src').val().trim(); // 防止空值提交 if (!title || !price || !img_src) { alert('Invalid product data.'); return false; } $.ajax({ type: 'POST', url: 'my_add_cart.php', data: { title, price, img_src }, cache: false, dataType: 'json', // 显式声明期望 JSON 响应,自动解析 data 对象 success: function(data) { // 更新购物车数量 $('#count').text('Items in cart: ' + data.count); // 插入提示框 $('#msg').html(data.message); // 【关键】3 秒后自动隐藏提示(增强体验) setTimeout(() => { const alertEl = $('#cart-alert'); if (alertEl.length) { alertEl.fadeOut(300, function() { $(this).remove(); }); } }, 3000); }, error: function(xhr, status, error) { console.error('AJAX Error:', status, error); $('#msg').html('<div class="alert alert-danger">Failed to add item. Please try again.</script>
? 小技巧:
- 使用 dataType: 'json' 后,success 回调的 data 参数已是解析后的 JS 对象,无需 JSON.parse();
- setTimeout + fadeOut() 实现平滑隐藏,比 display:none 更友好;
- 错误处理分支提升鲁棒性,避免静默失败。
✅ 最终效果
- 用户点击「Add to Cart」后,页面无刷新;
实时显示当前购物车商品总数(如 Items in cart: 5);
插入带关闭按钮的绿色提示框,并于 3 秒后自动淡出销毁;
- 所有操作均基于标准 HTTP 协议与 JSON 接口,便于后续扩展(如接入 Vue/React 或 REST API 规范)。
通过此方案,你不仅解决了原始需求,还构建了可维护、易测试、安全可靠的异步交互基础。











