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程序设计有所帮助。