PHP实现的购物车类实例
本文实例讲述了PHP实现的购物车类。分享给大家供大家参考。具体分析如下:
该购物车类是基于CodeIgniter的购物车类仿写实现的。
购物车基本功能如下:
1)将物品加入购物车
2)从购物车中删除物品
3)更新购物车物品信息【+1/-1】
4)对购物车物品进行统计
1.总项目
2.总数量
3.总金额
5)对购物单项物品的数量及金额进行统计
6)清空购物车
1.cart.php文件:
<?php /** * *@authorquanshuidingdang */ classCart{ //物品id及名称规则,调试信息控制 private$product_id_rule='\.a-z0-9-_';//小写字母|数字|._- private$product_name_rule='\.\:a-z0-9-_';//小写字母|数字|._-: private$debug=TRUE; //购物车 private$_cart_contents=array(); /** *构造函数 * *@paramarray */ publicfunction__construct(){ //是否第一次使用? if(isset($_SESSION['cart_contents'])){ $this->_cart_contents=$_SESSION['cart_contents']; }else{ $this->_cart_contents['cart_total']=0; $this->_cart_contents['total_items']=0; } if($this->debug===TRUE){ //$this->_log("cart_create_success"); } } /** *将物品加入购物车 * *@accesspublic *@paramarray一维或多维数组,必须包含键值名: id->物品ID标识, qty->数量(quantity), price->单价(price), name->物品姓名 *@returnbool */ publicfunctioninsert($items=array()){ //输入物品参数异常 if(!is_array($items)ORcount($items)==0){ if($this->debug===TRUE){ $this->_log("cart_no_items_insert"); } returnFALSE; } //物品参数处理 $save_cart=FALSE; if(isset($items['id'])){ if($this->_insert($items)===TRUE){ $save_cart=TRUE; } }else{ foreach($itemsas$val){ if(is_array($val)ANDisset($val['id'])){ if($this->_insert($val)==TRUE){ $save_cart=TRUE; } } } } //当插入成功后保存数据到session if($save_cart){ $this->_save_cart(); returnTRUE; } returnFALSE; } /** *更新购物车物品信息 * *@accesspublic *@paramarray *@returnbool */ publicfunctionupdate($items=array()){ //输入物品参数异常 if(!is_array($items)ORcount($items)==0){ if($this->debug===TRUE){ $this->_log("cart_no_items_insert"); } returnFALSE; } //物品参数处理 $save_cart=FALSE; if(isset($items['rowid'])ANDisset($items['qty'])){ if($this->_update($items)===TRUE){ $save_cart=TRUE; } }else{ foreach($itemsas$val){ if(is_array($val)ANDisset($val['rowid'])ANDisset($val['qty'])){ if($this->_update($val)===TRUE){ $save_cart=TRUE; } } } } //当更新成功后保存数据到session if($save_cart){ $this->_save_cart(); returnTRUE; } returnFALSE; } /** *获取购物车物品总金额 * *@returnint */ publicfunctiontotal(){ return$this->_cart_contents['cart_total']; } /** *获取购物车物品种类 * *@returnint */ publicfunctiontotal_items(){ return$this->_cart_contents['total_items']; } /** *获取购物车 * *@returnarray */ publicfunctioncontents(){ return$this->_cart_contents; } /** *获取购物车物品options * *@paramstring *@returnarray */ publicfunctionoptions($rowid=''){ if($this->has_options($rowid)){ return$this->_cart_contents[$rowid]['options']; }else{ returnarray(); } } /** *清空购物车 * */ publicfunctiondestroy(){ unset($this->_cart_contents); $this->_cart_contents['cart_total']=0; $this->_cart_contents['total_items']=0; unset($_SESSION['cart_contents']); } /** *判断购物车物品是否有options选项 * *@paramstring *@returnbool */ privatefunctionhas_options($rowid=''){ if(!isset($this->_cart_contents[$rowid]['options'])ORcount($this->_cart_contents[$rowid]['options'])===0){ returnFALSE; } returnTRUE; } /** *插入数据 * *@accessprivate *@paramarray *@returnbool */ privatefunction_insert($items=array()){ //输入物品参数异常 if(!is_array($items)ORcount($items)==0){ if($this->debug===TRUE){ $this->_log("cart_no_data_insert"); } returnFALSE; } //如果物品参数无效(无id/qty/price/name) if(!isset($items['id'])OR!isset($items['qty'])OR!isset($items['price'])OR!isset($items['name'])){ if($this->debug===TRUE){ $this->_log("cart_items_data_invalid"); } returnFALSE; } //去除物品数量左零及非数字字符 $items['qty']=trim(preg_replace('/([^0-9])/i','',$items['qty'])); $items['qty']=trim(preg_replace('/^([0]+)/i','',$items['qty'])); //如果物品数量为0,或非数字,则我们对购物车不做任何处理! if(!is_numeric($items['qty'])OR$items['qty']==0){ if($this->debug===TRUE){ $this->_log("cart_items_data(qty)_invalid"); } returnFALSE; } //物品ID正则判断 if(!preg_match('/^['.$this->product_id_rule.']+$/i',$items['id'])){ if($this->debug===TRUE){ $this->_log("cart_items_data(id)_invalid"); } returnFALSE; } //物品名称正则判断 if(!preg_match('/^['.$this->product_name_rule.']+$/i',$items['name'])){ if($this->debug===TRUE){ $this->_log("cart_items_data(name)_invalid"); } returnFALSE; } //去除物品单价左零及非数字(带小数点)字符 $items['price']=trim(preg_replace('/([^0-9\.])/i','',$items['price'])); $items['price']=trim(preg_replace('/^([0]+)/i','',$items['price'])); //如果物品单价非数字 if(!is_numeric($items['price'])){ if($this->debug===TRUE){ $this->_log("cart_items_data(price)_invalid"); } returnFALSE; } //生成物品的唯一id if(isset($items['options'])ANDcount($items['options'])>0){ $rowid=md5($items['id'].implode('',$items['options'])); }else{ $rowid=md5($items['id']); } //加入物品到购物车 unset($this->_cart_contents[$rowid]); $this->_cart_contents[$rowid]['rowid']=$rowid; foreach($itemsas$key=>$val){ $this->_cart_contents[$rowid][$key]=$val; } returnTRUE; } /** *更新购物车物品信息(私有) * *@accessprivate *@paramarray *@returnbool */ privatefunction_update($items=array()){ //输入物品参数异常 if(!isset($items['rowid'])OR!isset($items['qty'])OR!isset($this->_cart_contents[$items['rowid']])){ if($this->debug==TRUE){ $this->_log("cart_items_data_invalid"); } returnFALSE; } //去除物品数量左零及非数字字符 $items['qty']=preg_replace('/([^0-9])/i','',$items['qty']); $items['qty']=preg_replace('/^([0]+)/i','',$items['qty']); //如果物品数量非数字,对购物车不做任何处理! if(!is_numeric($items['qty'])){ if($this->debug===TRUE){ $this->_log("cart_items_data(qty)_invalid"); } returnFALSE; } //如果购物车物品数量与需要更新的物品数量一致,则不需要更新 if($this->_cart_contents[$items['rowid']]['qty']==$items['qty']){ if($this->debug===TRUE){ $this->_log("cart_items_data(qty)_equal"); } returnFALSE; } //如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除 //否则修改购物车物品数量等于输入的物品数量 if($items['qty']==0){ unset($this->_cart_contents[$items['rowid']]); }else{ $this->_cart_contents[$items['rowid']]['qty']=$items['qty']; } returnTRUE; } /** *保存购物车数据到session * *@accessprivate *@returnbool */ privatefunction_save_cart(){ //首先清除购物车总物品种类及总金额 unset($this->_cart_contents['total_items']); unset($this->_cart_contents['cart_total']); //然后遍历数组统计物品种类及总金额 $total=0; foreach($this->_cart_contentsas$key=>$val){ if(!is_array($val)OR!isset($val['price'])OR!isset($val['qty'])){ continue; } $total+=($val['price']*$val['qty']); //每种物品的总金额 $this->_cart_contents[$key]['subtotal']=($val['price']*$val['qty']); } //设置购物车总物品种类及总金额 $this->_cart_contents['total_items']=count($this->_cart_contents); $this->_cart_contents['cart_total']=$total; //如果购物车的元素个数少于等于2,说明购物车为空 if(count($this->_cart_contents)<=2){ unset($_SESSION['cart_contents']); returnFALSE; } //保存购物车数据到session $_SESSION['cart_contents']=$this->_cart_contents; returnTRUE; } /** *日志记录 * *@accessprivate *@paramstring *@returnbool */ privatefunction_log($msg){ return@file_put_contents('cart_err.log',$msg,FILE_APPEND); } } /*Endoffilecart.php*/ /*Location/htdocs/cart.php*/
2.cart_demo.php文件如下:
<?php session_start(); require_once('cart.php'); $items=array( 0=>array( 'id'=>'sp001', 'qty'=>20, 'price'=>'10.50', 'name'=>'a002', 'options'=>array( 'made'=>'china', 'company'=>'bgi' ) ), 1=>array( 'id'=>'sp002', 'qty'=>1, 'price'=>'3.50', 'name'=>'b002' ) ); $arr=array( 'rowid'=>'86dbb7cb58a667558b4bbb1f60330028', 'qty'=>21 ); $cart=newCart(); $cart->insert($items); //var_dump($cart->contents()); $cart->update($arr); var_dump($cart->contents()); //$cart->destroy(); //var_dump($_SESSION['cart_contents']); /*endofphp*/
希望本文所述对大家的php程序设计有所帮助。