实现购物车功能
PHP php购物车 星期二 2010-01-26

原来懒吧的空间也支持php的,那行啦,干脆用php写算了,asp我都不会了……写几行就有错而且用惯了php后用asp特不顺手,php对变量的定义太宽松,回到asp里面却觉得不习惯。昨天晚上试弄了一下个购物车功能,这里也写出来分享一下吧,顺便也更新一下博客…… 

例子地址http://iamlze.cn/demo/cart/ 

购物车的实现说到底就是在使用一些超级变量,你可以使用cookie或者session来做你的购物车,就是存储你的临时购物记录,当然你还可以使用数据库进行记录,方法就三种,自己随便挑一种适合自己使用的就可以了,而paperen这里使用了cookie进行记录。 

至于数据结构嘛,因为每种商品具有各自的ID号(唯一的),而也因为你可以在同一时间将不同数量商品放到购物车中,所以使用数组来作为数据结构就行了,$cart['商品ID号']=商品数量。 

最后就是php中操作cookie的方法,使用setcookie来对cookie进行初始化与赋值的操作,详细参数介绍请看php手册

http://docs.php.net/manual/en/function.setcookie.php

而对于清除某个cookie也是使用该函数进行的,一般来说将某个cookie赋予空值就相当于是删除了,或者将其生命期限调到现在。至于具体操作下文再说。 

下面开始动手,先整个稍微像样的页面吧,放出一些虚假的商品

因为这里自己只是进行试验,所以就不用整得那么花哨了,而那个BUY ME就是一个链接,地址中加参数?do=add&id=ID号,当然你可以交给另一个页面处理,或者使用ajax,但是核心代码都是一样的,只是表现形式不同而已。 

如果你点击了某个商品的BUY ME,就会向再次请求页面并在URL中加上两个参数,do=add与id号,然后就让程序判断是否存在do参数,根据do参数的值分别进行相应的操作,例如do为add的时候。 

switch ($do){
   case "add":
    $id=isset($_GET['id']) ? intval($_GET['id']) : '';
    //相应操作
   break;
   case "less":
    $id=isset($_GET['id']) ? intval($_GET['id']) : '';
    //相应操作
   break;
   case "clear":
    //相应操作
   break;
   default://异常
  } 

使用switch语句对不同参数进行不同的操作,paperen觉得这就相当于指挥系统吧,之后再获得id号,而且要对id号进行过滤,使用intval函数可以将不是数字的变量转变为0,而如果是数字的话就原样返回,包括负数。之后就是对cookie的赋值,setcookie("buy[$id]",1,time()+24*60*60);但是在这个地方得要注意。 

1.判断id号是不是正确,这里正确的意思不代表上面对id获取时候的正常情况,而是说要确保数据可靠性(数据表中是否真的存在该id号的数据),你得去判断如果没有要马上终止后续的操作。

2.判断cookie中该键值的数据是否存在,也就是说$_COOKIE['buy'][$id]是否存在,如果是空的应该初始值为1,如果非空在其基础上加1。对于购物车这种功能paperen觉得真的要很小心地进行程序编写,你要考虑程序的可靠性,还有参数的正确性,虽然不是每个人都会故意去做一些小动作,但是你总得要考虑到某些人会修改cookie或者修改一些BT的URL参数进行所谓的挑刺行为。 

if(isset($_COOKIE['buy'][$id]) && intval($_COOKIE['buy'][$id])){
     setcookie("buy[$id]",intval($_COOKIE['buy'][$id])+1,time()+24*60*60);
    }else{
     setcookie("buy[$id]",1,time()+24*60*60);
    }

对于减少商品的操作与添加类似,只是-1而已,而清除购物车中所有的商品正如上面说的,将buy数组中设置各个键的值为空就可以了。 

foreach($_COOKIE['buy'] as $k=>$value){
    setcookie("buy[$k]",'');
   }

而对于显示当前购物金额与物品那,你再抽取cookie并将每个id号查回数据表便可以获得该商品的相应信息了。 

而之后自己又用了一个类来操作,好像写得也不咋的……也给大家看看吧。 

 define('E_TIME',5*60);//5分钟的生命
 class Cart
 {
  function add($id){
   if(empty($id)){
    return false;
   }
   if(isset($_COOKIE['buy'][$id]) && intval($_COOKIE['buy'][$id])){
    setcookie("buy[$id]",$_COOKIE['buy'][$id]+1,time()+E_TIME);
   }else{
    setcookie("buy[$id]",1,time()+E_TIME);
   }
  }
  function less($id){
   if(empty($id)){
    return false;
   }
   if(isset($_COOKIE['buy'][$id]) && intval($_COOKIE['buy'][$id])>1){
    setcookie("buy[$id]",$_COOKIE['buy'][$id]-1,time()+E_TIME);
   }else{
    setcookie("buy[$id]",'');
   }
  }
  function clear(){
   foreach($_COOKIE['buy'] as $k=>$value){
    setcookie("buy[$k]",'');
   }
  }
 }
?>

自己在这个试验中并没有调用数据库,而是使用一个数组作为数据,在data文件中。

浏览 920

0

0

评论 1

托尔斯泰 与人交谈一次,往往比多年闭门劳作更能启发心智。思想必定是在与人交往中产生,而在孤独中进行加工和表达
1 条评论 说出您的意见与看法
评论
#1 初雪 说 博客不错哦!简洁大方 回复
2011-12-21 20:23:30
paperen 回复 初雪 谢谢 回复
2011-12-21 23:21:36
有啥就说两句咯
以下都是必填项
关于头像可以到 gravatar 修改或者创建

必需滴

必需滴

还是必需滴

我要说