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

例子地址http://paperen.com/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赋予空值就相当于是删除了,或者将其生命期限调到现在。至于具体操作下文再说。?

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

201001261264497266

因为这里自己只是进行试验,所以就不用整得那么花哨了,而那个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文件中。