最近在做一个项目,要用到类似淘宝,拍拍,易趣的最近浏览商品的功能,在网络上遍寻不及,遂找出一ASP代码用PHP自行改写,得以下片段,先发上来和大家共享。此代码片段只包含cookie写入部分,读出处理的部分大家可以自行编写。最先跟帖提出建议的给以加分。<?php 
/*
RecentlyGoods File
Urchin Studio FoxCMS
Version: 1.1.6
Author: luckyfox ([email protected])
Copyright: Urchin Studio (www.itocean.net)
Last Modified: 2008-9-3

*///TempNum 显示临时记录数$TempNum=5; //setcookie("RecentlyGoods", "12,31,90,39");//RecentlyGoods 最近商品RecentlyGoods临时变量if (isset($_COOKIE['RecentlyGoods'])) 
{
$RecentlyGoods=$_COOKIE['RecentlyGoods'];
$RecentlyGoodsArray=explode(",", $RecentlyGoods);
$RecentlyGoodsNum=count($RecentlyGoodsArray); //RecentlyGoodsNum 当前存储的变量个数 }if($_GET['Id']!="")
{ $Id=$_GET['Id']; //ID 为得到请求的字符
//如果存在了,则将之前的删除,用最新的在尾部追加 if (strstr($RecentlyGoods, $Id)) 
{
//echo "已经存在,则不写入COOKIES<hr />";
}
else
{
if($RecentlyGoodsNum<$TempNum) //如果COOKIES中的元素小于指定的大小,则直接进行输入COOKIES
{
if($RecentlyGoods=="")
{
setcookie("RecentlyGoods",$Id,time()+3600);
}
else
{
$RecentlyGoodsNew=$RecentlyGoods.",".$Id;
setcookie("RecentlyGoods", $RecentlyGoodsNew,time()+3600);
}
}
else //如果大于了指定的大小后,将第一个给删去,在尾部再加入最新的记录。
{
$pos=strpos($RecentlyGoods,",")+1; //第一个参数的起始位置
$FirstString=substr($RecentlyGoods,0,$pos); //取出第一个参数
$RecentlyGoods=str_replace($FirstString,"",$RecentlyGoods); //将第一个参数删除
$RecentlyGoodsNew=$RecentlyGoods.",".$Id; //在尾部加入最新的记录
setcookie("RecentlyGoods", $RecentlyGoodsNew,time()+3600);
}

}
}
?>

解决方案 »

  1.   

    if (strstr($RecentlyGoods, $Id)) 

    //echo "已经存在,则不写入COOKIES <hr />"; 
    }如果我看了100号,100保存了,然后我再看10号,那就不能保存了
      

  2.   


    这段语句的意思是从$RecentlyGoods这个变量里查找以GET方式提交的$Id变量,如果在$RecentlyGoods存在,则不对COOKIES进行写入操作,那么按你的例子:浏览了100这个ID,那么程序将其写入COOKIES后,你再浏览了10这个ID,因为10这个ID没在变量$RecentlyGoods中,则会进行写入COOKIES的操作,ID为10的记录将会得到保存,我觉得是这个朋友对这段程序的理解错误吧,我的这段程序经过我自己的测试并无发现运行上的问题。
      

  3.   

    对id的处理用字符串查找来处理,这样的方式其实不太合理。define('MAX_ITEMS', 5);$id = intval($_GET['id']);  // 确保id是整数
    if (isset($_COOKIE['recentlyGoods'])) {
      // 已有历史数据,追加新数据
      $goods = explode(',', $_COOKIE['recentlyGoods']);  // 取得id数组
      $key = array_search($id, $goods); // 在历史数据中查找当前id
      if ($key !== false) {
        unset($goods[$key]);  // 找到则删除
      }
      $goods[] = $id; // 追加当前浏览的id
    } else {
      // 尚未有历史数据,创建并将当前浏览id加入
      $goods = array($id);
    }// 如果数组中历史数据条目超出限制,则截取最后一段
    if (count($goods) > MAX_ITEMS) {
      // 从倒数第MAX_ITEMS条开始提取MAX_ITEMS条记录
      $goods = array_slice($goods, 0 - MAX_ITEMS, MAX_ITEMS);
    }setcookie('recentlyGoods', join(',', $goods), time()+3600);
      

  4.   

    我写的  见笑了。[code]// 记录浏览产品  存在session 
    function product_view($pdid)
    {
    $limit = 8; // 保存8条记录 

    if(is_numeric($pdid) && $pdid<>0)
    {
    if(!$_SESSION['pd_viewed']) // 第一次访问 
    {
    $_SESSION['pd_viewed'] = array($pdid);
    }
    else // 已经访问过 
    {
    if(count($_SESSION['pd_viewed'])>=$limit)
    {  // 超出记录
    if(!in_array($pdid,$_SESSION['pd_viewed']))
    { // 不存在 
    $_SESSION['pd_viewed'] = array_reverse($_SESSION['pd_viewed']); // 倒序数组 
    array_pop($_SESSION['pd_viewed']); // 去掉最后一个 
    $_SESSION['pd_viewed'][] = $pdid; // 加入新纪录 
    $_SESSION['pd_viewed'] = array_reverse($_SESSION['pd_viewed']); // 倒序数组 
    }
    }
    else
    {  // 没有存满 
    if(!in_array($pdid,$_SESSION['pd_viewed']))
    { // 不存在记录
    $_SESSION['pd_viewed'][] = $pdid;
    }
    }
    }
    }
    }
    [/code]
      

  5.   

    // 记录浏览产品  存在session 
    function product_view($pdid)
    {
    $limit = 8; // 保存8条记录 

    if(is_numeric($pdid) && $pdid<>0)
    {
    if(!$_SESSION['pd_viewed']) // 第一次访问 
    {
    $_SESSION['pd_viewed'] = array($pdid);
    }
    else // 已经访问过 
    {
    if(count($_SESSION['pd_viewed'])>=$limit)
    {  // 超出记录
    if(!in_array($pdid,$_SESSION['pd_viewed']))
    { // 不存在 
    $_SESSION['pd_viewed'] = array_reverse($_SESSION['pd_viewed']); // 倒序数组 
    array_pop($_SESSION['pd_viewed']); // 去掉最后一个 
    $_SESSION['pd_viewed'][] = $pdid; // 加入新纪录 
    $_SESSION['pd_viewed'] = array_reverse($_SESSION['pd_viewed']); // 倒序数组 
    }
    }
    else
    {  // 没有存满 
    if(!in_array($pdid,$_SESSION['pd_viewed']))
    { // 不存在记录
    $_SESSION['pd_viewed'][] = $pdid;
    }
    }
    }
    }
    }
      

  6.   

    setcookie('browse['.(int)$_GET['products_id'].']',time());
    arsort($_COOKIE['browse']);
    if(count($_COOKIE['browse'])>4)array_pop($_COOKIE['browse']);
    $browse_product_pid = join(',',array_keys($_COOKIE['browse']));限制只保存查看四条的。
      

  7.   

    cookie只能简单地写个人最近浏览的商品,无法写一个商品被多少浏览和别人都浏览了哪些
      

  8.   

    楼主我这么写的
    还是显示全部
    而且重复的不能提前
    $action=$_GET["action"];
    $temp=$_COOKIE["last_product_view"];
    if($action==1){
    if(is_array($temp)){
    $ar=array_keys($temp);
    for($i=count($ar)-1;$i>=0;$i--){
    echo "<li><a href=\"/website/html/product/show_pro_".$temp["$ar[$i]"].".html\" target=\"_blank\">".str_replace("__"," ",$ar[$i])."</a></li>\n";
    }
    }else{
    echo "Nothing";
    }
    }elseif($action==0){
    if($_GET["name"]!=""&&$_GET["link"]!=""){
    if(is_array($temp)){
    $ar=array_keys($temp);if(count($temp)==5)setcookie("last_product_view[".$ar[0]."]","",time()-3600);
    }
    $cookie_names=str_replace(" ","__",js_unescape($_GET["name"]));
    setcookie("last_product_view[".$cookie_names."]",$_GET["link"],time()+3600,"/");
    }
    }