利用COOKIE保存历史浏览商品的一个简单思路

复制代码
<?php
//如是COOKIE 里面不为空,则往里面增加一个商品ID
if (!empty($_COOKIE['SHOP']['history'])){

        //取得COOKIE里面的值,并用逗号把它切割成一个数组
        $history = explode(',', $_COOKIE['SHOP']['history']);
        //在这个数组的开头插入当前正在浏览的商品ID
        array_unshift($history, $id);
        //去除数组里重复的值
        $history = array_unique($history);
        // $arr = array (1,2,3,1,3);
        // $arr = array (1,1,2,3,3);
        // $arr = array (1,2,3);
        //当数组的长度大于5里循环执行里面的代码
        while (count($history) > 5){
        //将数组最后一个单元弹出,直到它的长度小于等于5为止
        array_pop($history);
        }
        //把这个数组用逗号连成一个字符串写入COOKIE,并设置其过期时间为30天
        setcookie('SHOP[history]', implode(',', $history), $cur_time + 3600 * 24 * 30);

    }else{
        //如果COOKIE里面为空,则把当前浏览的商品ID写入COOKIE ,这个只在第一次浏览该网站时发生
        setcookie('SHOP[history]', $id, $cur_time + 3600 * 24 * 30);
    }

//以上均为记录浏览的商品ID到COOKIE里,下面将讲到怎样用这样COOKIE里的数据

·//取得COOKIE里的数据 ,格式为1,2,3,4 这样,当然也有可以为0
··$history =isset ($_COOKIE['SHOP']['history'][$uid]) ? $_COOKIE['SHOP']['history'][$uid] : 0;
·//写SQL语句,用IN 来查询出这些ID的商品列表
··$sql_history = "SELECT * FROM `goods` WHERE `goods_id` in ({$history})";
·//执行SQL语句,返回数据列表
··$goods_history = $db->getAll($sql_history);
··if ($goods_history) {
····$tpl->assign ('goods_history',$goods_history);
···}

?>
复制代码

这样的话,其实有个问题会出现,那就是如果这个浏览器一个人刚登陆完了后,退出登录。另一人再次登陆自己的账号,历史浏览记录会“混合”在一起,造成数据的不准确。

最简单的解决办法就是,在存入cookie的时候,带入用户的ID,这样每个用户的历史浏览数据都不一样,也不容易冲突。代码如下:

复制代码
<?php

//假设当前登陆用户的ID是568.
$uid='568';$cur_time=time();
 //如是COOKIE 里面不为空,则往里面增加一个商品ID
if (!empty($_COOKIE['SHOP']['history'][$uid])){

        //取得COOKIE里面的值,并用逗号把它切割成一个数组
        $history = explode(',', $_COOKIE['SHOP']['history']);
        //在这个数组的开头插入当前正在浏览的商品ID
        array_unshift($history, $id);
        //去除数组里重复的值
        $history = array_unique($history);
        // $arr = array (1,2,3,1,3);
        // $arr = array (1,1,2,3,3);
        // $arr = array (1,2,3);
        //当数组的长度大于5里循环执行里面的代码
        while (count($history) > 5){
        //将数组最后一个单元弹出,直到它的长度小于等于5为止
        array_pop($history);
        }
        //把这个数组用逗号连成一个字符串写入COOKIE,并设置其过期时间为30天
        setcookie("SHOP[history][$uid]", implode(',', $history), $cur_time + 3600 * 24 * 30);

    }else{
        //如果COOKIE里面为空,则把当前浏览的商品ID写入COOKIE ,这个只在第一次浏览该网站时发生
        setcookie("SHOP[history][$uid]", $id, $cur_time + 3600 * 24 * 30);
    }

//以上均为记录浏览的商品ID到COOKIE里,下面将讲到怎样用这样COOKIE里的数据

    //取得COOKIE里的数据 ,格式为1,2,3,4 这样,当然也有可以为0
     $history =isset ($_COOKIE['SHOP']['history'][$uid]) ? $_COOKIE['SHOP']['history'][$uid] : 0;
    //写SQL语句,用IN 来查询出这些ID的商品列表
     $sql_history = "SELECT * FROM `goods` WHERE `goods_id` in ({$history})";
   //执行SQL语句,返回数据列表
    $goods_history = $db->getAll($sql_history);
    if ($goods_history) {
        $tpl->assign ('goods_history',$goods_history);
     }
?>
复制代码

 

作者:itbaby

出处:https://www.cnblogs.com/itbaby/p/10535702.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   知风阁  阅读(465)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示