PHP购物车session实现方法

<?php
/**
*PHP购物车SESSION实现方法:面向对象形式/
* @copyright 互联网
* 整理:www.phppx.com
* @desc PHP购物车类
*/
class cart {
        var $sortCount; //商品种类数
        var $totalCost; //商品总金额
        /* 所有的商品,如:$myCart[5][$name]:商品编号为5的名称
        *          $myCart[5][$price]:商品编号为5的单价
        *         $myCart[5][$count]:商品编号为5的数量
        *          $myCart[5][$cost]:商品编号为5的合计金额
        */
        var $myCart   ;
        var $Id;      //每类商品的ID(数组)
        var $Name;      //每类商品的名称(数组)
        var $Price;      //每类商品的价格(数组)
        var $Count;      //每类商品的件数(数组)
        var $Cost;      //每类商品的价值(数组)


        //******构造函数
        function cart(){
                $this->sortCount = 0   ;
                $this->totalCost = 0   ;
                $this->myCart   = array()   ;
                session_start();   //初始化一个session
                if(session_is_registered("myCart")==false)   session_register("myCart");
                $this->update();
                //  $this->Calculate();

        }

        //********私有,根据session的值更新类中相应数据
        function update(){
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;
                if(false==$myCart)
                {
                        $this->sortCount = 0   ;
                        $this->totalCost = 0   ;
                        $this->myCart = array()   ;
                        return false;
                }
                //得到商品的总数量
                $this->sortCount=count($myCart);
                if($this->sortCount>0)
                {
                        //开始计算商品的金额
                        $totalCost = 0   ;
                        foreach($myCart as $key=>$val)
                        {
                                //先四舍五入
                                foreach($val as $proName=>$proVal)
                                {
                                        if($proName !="name")
                                        {
                                                $val[$proName] = round(eregi_replace(",", "",$proVal),2)   ;
                                                $myCart[$key][$proName] = $val[$proName]   ;
                                        }
                                }

                                //计算每件商品的金额
                                $myCart[$key]["cost"] = round($val["count"]*$val["price"], 2)   ;
                                //得到所有商品的金额
                                $totalCost += $myCart[$key]["cost"]   ;
                        }
                        $this->totalCost = $totalCost   ;
                        $this->myCart = $myCart        ;
                        $_SESSION["myCart"] = $myCart   ;

                }

        }

        /**
* 格式化数字为货币数据
*
*
**/
        function formatNum($data)
        {
                foreach($data as $key=>$val)
                {
                        foreach($val as $sName=>$sValue)
                        {
                                if($sName !="name")
                                {
                                        $data[$key][$sName] = number_format($sValue, 2)   ;
                                }
                        }
                }
                return $data   ;

        }
        //**************以下为接口函数

        //*** 加一件商品
        // 判断是否蓝中已有,如有,加count,否则加一个新商品
        //首先都是改session的值,然后再调用update() and calculate()来更新成员变量
        function addOne($id,$na,$pr)
        {
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;
                //设置购物车中的数量
                $myCart[$id]["name"]  = $na   ;
                $myCart[$id]["price"] = $pr   ;
                ++$myCart[$id]["count"]   ;
                $_SESSION["myCart"] = $myCart   ;
                //更新一下类的成员数据
                $this->update();

        }
        /**
* 向购物车中添加一组商品,如果没有,进行添加,如果已经存在,则更新为data
* @param $data  - 要添加的商品,格式为:
*            $data[0][id],  $data[0][name],
*            $data[0][price],$data[0][count]
* @return boolean
*/
        function addData($data)
        {
                if(count($data > 0))
                {
                        session_start();   //初始化一个session
                        $myCart = $_SESSION["myCart"]      ;
                        foreach($data as $val)
                        {
                                extract($val)   ;
                                //设置购物车中的数量
                                $myCart[$id]["name"]  = $name   ;
                                $myCart[$id]["price"] = $price   ;
                                $myCart[$id]["count"] = $count   ;
                        }
                        $_SESSION["myCart"] = $myCart   ;
                        //更新一下类的成员数据
                        $this->update();
                }
        }
        /*
        * 更改一件商品的单价
        *
        *
        *
        **/
        function updatePrice($id, $price)
        {
                if($price <=0)   return false   ;
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;
                if($myCart[$id]==true)
                {
                        $myCart[$id]["price"]=$price;

                        $_SESSION["myCart"] = $myCart   ;
                        $this->update();
                }
        }
        //将一件商品的数量减1
        function removeOne($id)
        {
                $count = $this->myCart[$id]["count"]   ;
                if($count>0)
                {
                        $this->modifyCount($id, --$count)   ;
                }

        }

        //改变商品的个数,如果传入单价,则一起更改单价
        function modifyCount($id, $ncount, $price=0)
        {
                if($ncount <= 0) return false   ;
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;
                if($myCart[$id]==true)
                {
                        $myCart[$id]["count"]=$ncount;
                        //如果有传入单价,则一起更改单价
                        if($price >0 ) $myCart[$id]["price"]=$price;

                        $_SESSION["myCart"] = $myCart   ;
                        $this->update();
                }

        }

        //清空一种商品
        function emptyOne($i)
        {
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;
                unset($myCart[$i])   ;
                if(count($myCart)==0)
                {
                        $this->emptyAll()   ;
                }else{
                        $_SESSION["myCart"] = $myCart      ;
                        $this->update();
                }
        }


        /***************************
        清空所有的商品

        因为在win里PHP不支持session_destroy()函数,所以这个清空函数不完善,
        只是把每种商品的个数置为0。
        如果是在linux下,可以直接用session_destroy()来做。
        *****************************/
        function emptyAll()
        {
                session_start();   //初始化一个session
                $myCart = $_SESSION["myCart"]      ;

                unset($myCart)   ;
                $_SESSION["myCart"] = $myCart      ;
                $this->update();

        }

        /**
  *  返回所有购物车中的数据
  *
  **/
        function getData()
        {
                if($this->sortCount > 0)
                {
                        return $this->myCart   ;
                }else{
                        return array()   ;
                }
        }
        //取一件商品的信息,主要的工作函数
        //返回一个关联数组,下标分别对应 id,name,price,count,cost
        function getOne($i){
                $data = $this->myCart[$i]      ;
                if(false==$data) return array()   ;

                $data["id"]   =   $i           ;
                return $data                ;

        }

        //取总的商品种类数
        function getSortCount(){
                return $this->sortCount;
        }

        //取总的商品价值
        function getTotalCost(){
                return $this->totalCost;
        }

        //end class
}

?> 

文章来之:http://bbs.phppx.com/thread-90-1-1.html

相关文章

已有 17 条评论
  1. 迷失乐园

    好类库 收藏了!

    迷失乐园 回复
    1. 枫叶红秋雨

      @迷失乐园

      @迷失乐园
      呵呵。这个也是俺转载来的。。话说这么晚了还么休息。夜猫子啊

      枫叶红秋雨 回复
  2. 油漆

    受教了 多谢博主分享

    油漆 回复
  3. 我的久优

    来看代码的,学习!

    我的久优 回复
    1. 枫叶红秋雨

      @我的久优

      @我的久优
      呵呵。欢迎啊!

      枫叶红秋雨 回复
  4. 野马

    你这里也有代码高亮啊的,我那个高亮调试了好久才让它不那么影响加载速度。今天扒了一个皮,发现对浏览器兼容太蛋疼了,改了好久CSS还是不行,有空去我那看看吧。你这里还差一个ctrl+enter回复,有这个顺手点……

    野马 回复
    1. 枫叶红秋雨

      @野马

      @野马
      我这个用的是一个插件实现的。你上面改的那个不错的!

      枫叶红秋雨 回复
      1. 野马

        @枫叶红秋雨

        我们用的是同一个插件,需要加载的js太多了,所以我就改成只有打开需要高亮的日志才加载那些js。我那个板子如果我自己搞不定的话,就打算不管不给力的傲游和ie6了。

        野马 回复
        1. 枫叶红秋雨

          @野马

          @野马
          嗯。是同一个插件。IE6现在已经慢慢走入地狱了。我现在做啥基本上没考虑IE6了

          枫叶红秋雨 回复
  5. 电商圈

    不错啊,博客越来越帅了!!!给力啊

    电商圈 回复
  6. VPS评测网

    {smile:1}{smile:5}测试表情

    VPS评测网 回复
  7. Utaoy

    在上面看到了好多数组类型变量,话说我今天早上也在写的一个特制菜单,可以排序的那种,也全是用数组实现的,然后 写入到数据库里,头疼了好一会
    上面的面向对象有点老了。析构函数我还是觉的__construct 好看一点

    Utaoy 回复
    1. 枫叶红秋雨

      @Utaoy

      @Utaoy
      这个是我baidu购物车时搜到的。就寻思给转来了。说不定到时看能参考参考!现在构造函数90%全是__construct ,未知变量全是 var/ public

      枫叶红秋雨 回复
  8. 枫叶红秋雨去

    测试

    枫叶红秋雨去 回复
  9. 博客不错

    博客不错 教教我啊

    博客不错 回复
    1. 枫叶红秋雨

      @博客不错

      @博客不错
      呵呵。你博客程序和俺使用的不是同一个啊。

      枫叶红秋雨 回复
  10. 虾米

    测试一下!

    虾米 回复
发表新评论