<?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);
}
?>

利用COOKIE保存历史浏览商品的一个简单思路的更多相关文章

  1. destoon系统开发-最新利用浏览器的cookie 做历史浏览记录

      注意: 代码 放在要显示的为 (一般放在详情页),注意本教程不入库,直接利用浏览器的 cookie 缓存判断    <!--历史浏览记录 S--> <div class=&quo ...

  2. jQuery 操作cookie保存用户浏览信息

    使用jQuery操作cookie之前需要引入jQuery的一个cookie小组件js,代码如下:   /*         jQuery cookie plugins */jQuery.cookie ...

  3. 利用Cookie保存用户身份信息实现免登录

    <%@page import="sun.misc.BASE64Encoder"%> <%@page import="java.util.Base64.E ...

  4. javascript 制作的美化select,利用cookie保存选择

    可以看一下动画 下面是代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  5. Linux 清楚历史history命令的一个简单方法

    有时候做了一些历史记录 不想让别人知道, 发现最简单的办法是 set HISTSIZE=0 然后 history 就没有历史记录命令了 然后为了能用上下键进行历史命令使用 再 set HISTSIZE ...

  6. Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

    Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...

  7. 鸿蒙系统应用开发之JS实现一个简单的List

    在之前的文章鸿蒙应用开发之怎么更好的远程连接手表模拟器做调试里我运行了一个穿戴设备的应用,利用JS UI实现了一个最简单的HelloWorld. 今天我打算在智慧屏设备上利用豆瓣音乐的接口数据实现一个 ...

  8. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  9. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

随机推荐

  1. CloudStack tomcat集成方式分析

    CloudStack 的server.xml和tomcat6.conf都是软连接   CloudStack 在执行脚本时报异常如下:   修改vim /etc/sudoers文件,具体如下     以 ...

  2. Openssl gendsa命令

    一.简介 gendsa命令能够根据DSA密钥参数生成DSA密钥 二.语法 openssl gendsa [-out filename] [-passout out] [-rand file(s)] [ ...

  3. code1074 食物链

    开3*n的并查集,其中x用来连接与x同类的,x+n用来连接x吃的,x+2*n用来连接x被吃的. 1 x y时,如果 x吃y 或 x被y吃,那么为假话, 否则x与y同类,x吃的y也吃,x被吃的y也被吃: ...

  4. Python正则表达式的七个使用范例-乾颐堂

    作为一个概念而言,正则表达式对于Python来说并不是独有的.但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别. 本文是一系列关于Python正则表达式文章的其中一部分.在这个系列 ...

  5. [转]Python-__builtin__与__builtins__的区别与关系(超详细,经典)

    在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...

  6. servlet介绍

    1.首先说Servlet API:servlet的命名:server+applet Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http. 在 ...

  7. SpringMVC 细节学习

    使用Spring MVC,配置DispatcherServlet是第一步  DispatcherServlet是前置控制器,配置在web.xml文件中的 .拦截匹配的请求,Servlet拦截匹配规则要 ...

  8. mac安装mysql及终端操作mysql与pycharm的数据库可视化

    一.Mac安装mysql 首先下载mysql,地址:https://dev.mysql.com/downloads/mysql/ 然后已知安装就好了,会出现让你记住密码的提示,然后就安装好了.... ...

  9. paperfree

    主题:免费的论文查重网站 正文:给大家推荐一个免费的论文查重网站PaperFree:http://www.paperfree.cn

  10. MyBatis和Hibernate相比较

    作者:乌拉拉链接:http://www.zhihu.com/question/21104468/answer/58579295 1.开发对比开发速度 Hibernate的真正掌握要比Mybatis来得 ...