PHP实现商品对比功能代码分享
本文详细解析如何利用 PHP 结合前端 JavaScript (jQuery) 构建一个轻量级的商品对比模块。核心思路是将用户选中的商品信息序列化为数组,并通过 Cookie 持久化存储于客户端,同时利用 AJAX 技术在不刷新页面的前提下完成数据的动态增删查改。
准备条件与接口设计
本实现分为两个主要部分:负责页面交互与数据请求的 .js 文件,以及处理逻辑与数据存储的 ajax.php 文件。以下是所需的核心环境:
- 依赖库:
jQuery(用于 DOM 操作与 AJAX 请求)。 - 存储介质:浏览器端
Cookie(由于未提及数据库或服务器存储,数据以明文序列化形式暂存于 Cookie 中)。 - 后端逻辑:
PHP,需开启 Cookie 读写权限。
在 ajax.php 中定义了四个操作动作(action参数),分别为:
1:添加商品至对比框。2:从对比框中删除指定商品。3:清空所有对比商品。4:获取并渲染已存在对比框的商品内容。
第1步:编写 Ajax 交互后端 (ajax.php)
此步骤的目的主要是确保前后端能够正确传递并存储序列化后的商品数组。请注意,文中提供的示例代码直接使用了域名 http://www.lusen.com 作为链接前缀,实际部署时需将其替换为您的真实业务域名。
<?php
// 自定义反序列化函数,防止 stripslashes 干扰
function mb_unserialize($serial_str) {
$serial_str =stripslashes($serial_str);
return unserialize($serial_str);
}
if($_POST['action']=='1') {//add - 添加商品
// 检查是否已有同类商品的标记
if(isset($_COOKIE['gtype'])) {
if($_COOKIE['gtype']!=$_POST['gtype']) {
echo '对不起,您选择的是不同类别的产品无法加入对比...';
return;
}
}else {
setcookie('gtype', $_POST['gtype']);
}
// 处理已有的商品ID数组
if(isset($_COOKIE['gid'])) {
$arr_str = $_COOKIE['gid'];
$arr=mb_unserialize($arr_str);
// 限制最大对比数量为3
if(count($arr)>2) {
echo "商品比较最多选3种";
return;
}
// 检查重复项
foreach($arr as $val) {
if($val[0]==$_POST['gid']) {
echo "该商品已经加入对比框";
return;
}
}
$info=array($_POST['gid'],$_POST['gname'],$_POST['gtype']);
$arr[]=$info;
}else {
// 第一次添加
$info=array($_POST['gid'],$_POST['gname'],$_POST['gtype']);
$arr=$info;
}
// 序列化并保存Cookie
$arr_str=serialize($arr);
setcookie('gid',$arr_str);
}else if($_POST['action']=='2') {//delone - 删除单个
$id=$_POST['gid'];
if(isset($_COOKIE['gid'])) {
$arr_str = $_COOKIE['gid'];
$arr=mb_unserialize($arr_str);
foreach($arr as $key=>$val) {
if($val[0]==$id) {
unset ($arr[$key]);
}
}
$arr_str=serialize($arr);
setcookie('gid',$arr_str);
}
}else if($_POST['action']=='3') {//delall - 清空所有
setcookie('gid','');
setcookie('gtype','');
}else if($_POST['action']=='4') {//showlist - 返回HTML片段供前端渲染
if(isset($_COOKIE['gid'])) {
$data='';
$arr_str = $_COOKIE['gid'];
$arr=mb_unserialize($arr_str);
foreach ($arr as $val){
// 注意:此处URL前缀需根据实际项目修改
$url="http://www.lusen.com/product-".$val[0].".html";
$data.="<li id='{$val[0]}' class='division clearfix'><div class='span-3'><a href='{$url}' target='_blank' title='{$val[1]}'.>{$val[1]}</a></div><span onclick=\"removecompare('{$val[0]}');\">删除</span></li>";
}
echo $data;
}
}
?>
第2步:配置前端浮动窗口逻辑
前端 JS 需要实现浮动窗口的跟随滚动定位。以下代码会查找 ID 为 goods-compare 的元素,并根据页面滚动位置调整其 `top` 值。
(function(){
var n=10; // 距离顶部的偏移像素
var obj=document.getElementById("goods-compare");
if(!obj){
return false;
}
window.onscroll=function(){
obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';
};
window.onresize=function(){
obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';
};
})();
第3步:完善添加、删除与展示控制
此阶段包含核心的增删逻辑。前端将商品 ID (gid)、名称 (gname) 和类型 (gtype) 发送至 ajax.php,并根据返回值更新 DOM 或弹出提示。
添加商品至对比栏
调用 addcompare(obj),此时 chk 对象应包含 gid, gname, gtype。若当前已有超过 2 个商品(即达到上限3个),则拦截请求。
function addcompare(chk){
$('#goods-compare').fadeIn().show();
// 限制数量为3 (大于2表示已有3个)
if($(".compare-box li").length >2){
alert('产品比较最多选3种哦');
return;
}
$.ajax({
type: 'post',
url: 'ajax.php',
data: {
'action':'1',
'gid':chk.gid,
'gname':chk.gname,
'gtype':chk.gtype
},
success: function(result) {
if(result!=''){
// 后端报错(如超出数量、类型不一致等)
alert(result);
}else{
// 成功:手动追加DOM元素
var url='YOUR_DOMAIN/product-'+chk.gid+'.html'; // 请替换为实际链接规则
$(".compare-box").append("<li class='division clearfix' id='"+chk.gid+"'><div class='span-3'><a href='"+url+"' target='_blank' title='"+chk.gname+"'>'"+chk.gname+"'</a></div><span onclick=\"removecompare('"+chk.gid+"');\">删除</span></li>")
syncComids();
}
}
});
}
同步隐藏域中的数据
为了保持界面与后台存储的一致性,建议在每次增删后执行 syncComids() 函数(草稿中整合在 AJAX success 回调内,这里抽离以便复用):
function syncComids() {
$("#comids").val($(".compare-box li").map(function(){
return $(this).attr('id');
}).get().join(","));
}
移除与清空商品
点击“删除”或“清空”时,同样向后端发送指令,成功后再销毁 DOM 节点。
// 删除对比产品
function removecompare(id) {
$.ajax({
type: 'post',
url: 'ajax.php',
data: { 'action':'2', 'gid':id },
success: function(result) {
$("#"+id).remove();
syncComids();
}
});
}
// 清空对比产品
function clearcompare() {
$.ajax({
type: 'post',
url: 'ajax.php',
data: { 'action':'3' },
success: function(result) {
$(".compare-box").html('');
syncComids();
}
});
}
// 显示对比框(初始化或刷新时加载)
function showcompare() {
$.ajax({
type: 'post',
url: 'ajax.php',
data: { 'action':'4' },
success: function(result) {
if(result){
$(".compare-box").append(result);
syncComids();
$('#goods-compare').fadeIn().show();
}
}
});
}
$('.close-gc').click(function(){
$('#goods-compare').fadeOut().hide();
});
排错与注意事项
- Cookie 有效期:示例中未设置
setcookie()的第三个参数(过期时间)。这意味着当用户关闭浏览器后,对比数据会自动丢失。如需长期保留,建议设置为较长时间的有效期(如一周)。 - 特殊字符转义:在后端序列化时,商品名称若包含中文或引号等特殊符号,直接使用拼接方式渲染 HTML 可能导致前端 JS 语法错误(如
onclick="..."内部未正确转义)。生产环境中建议使用 JSON 格式传输数据,避免直接拼接 HTML 字符串。 - 链接前缀:务必修改代码中写死的
http://www.lusen.com,否则点击对比项将无法访问您的网站页面。
以上就是关于 PHP 实现简易商品对比功能的详细内容,更多关于 Ajax 异步交互与 PHP 数据处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













