本文实例讲述了PHP实现的购物车类。分享给大家供大家参考。具体分析如下:该购物车类是基于CodeIgniter的购物车类仿写实现的。
购物车基本功能如下:
1) 将物品加入购物车
2) 从购物车中删除物品
3) 更新购物车物品信息 【+1/-1】
4) 对购物车物品进行统计
1. 总项目
2. 总数量
3. 总金额
5) 对购物单项物品的数量及金额进行统计
6) 清空购物车
1. cart.php文件:
_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");}}/*** 将物品加入购物车** @access public* @param array 一维或多维数组,必须包含键值名:id -> 物品ID标识,qty -> 数量(quantity),price -> 单价(price),name -> 物品姓名* @return bool*/ public function insert($items = array()) {//输入物品参数异常if( ! is_array($items) OR count($items) == 0) {if($this->debug === TRUE) {$this->_log("cart_no_items_insert");}return FALSE;}//物品参数处理$save_cart = FALSE;if(isset($items['id'])) {if($this->_insert($items) === TRUE) {$save_cart = TRUE;}} else {foreach($items as $val) {if(is_array($val) AND isset($val['id'])) {if($this->_insert($val) == TRUE) {$save_cart = TRUE;}}}}//当插入成功后保存数据到session if($save_cart) {$this->_save_cart();return TRUE;}return FALSE;}/*** 更新购物车物品信息** @access public* @param array* @return bool*/ public function update($items = array()) {//输入物品参数异常if( !is_array($items) OR count($items) == 0) {if($this->debug === TRUE) {$this->_log("cart_no_items_insert");}return FALSE;}//物品参数处理$save_cart = FALSE;if(isset($items['rowid']) AND isset($items['qty'])) {if($this->_update($items) === TRUE) {$save_cart = TRUE;}} else {foreach($items as $val) {if(is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) {if($this->_update($val) === TRUE) {$save_cart = TRUE;}}}}//当更新成功后保存数据到session if($save_cart) {$this->_save_cart();return TRUE;}return FALSE;}/*** 获取购物车物品总金额** @return int*/ public function total() {return $this->_cart_contents['cart_total'];}/*** 获取购物车物品种类** @return int*/ public function total_items() {return $this->_cart_contents['total_items'];}/*** 获取购物车** @return array*/ public function contents() {return $this->_cart_contents;}/*** 获取购物车物品options** @param string* @return array*/ public function options($rowid = '') {if($this->has_options($rowid)) {return $this->_cart_contents[$rowid]['options'];} else {return array();}}/*** 清空购物车**/ public function destroy() {unset($this->_cart_contents);$this->_cart_contents['cart_total'] = 0;$this->_cart_contents['total_items'] = 0;unset($_SESSION['cart_contents']);}/*** 判断购物车物品是否有options选项** @param string* @return bool*/ private function has_options($rowid = '') {if( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) {return FALSE;}return TRUE;}/*** 插入数据** @access private* @param array* @return bool*/ private function _insert($items = array()) {//输入物品参数异常if( ! is_array($items) OR count($items) == 0) {if($this->debug === TRUE) {$this->_log("cart_no_data_insert");}return FALSE;}//如果物品参数无效(无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");}return FALSE;}//去除物品数量左零及非数字字符$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");}return FALSE;}//物品ID正则判断if( ! preg_match('/^['.$this->product_id_rule.']+$/i', $items['id'])) {if($this->debug === TRUE) {$this->_log("cart_items_data(id)_invalid");}return FALSE;}//物品名称正则判断if( ! preg_match('/^['.$this->product_name_rule.']+$/i', $items['name'])) {if($this->debug === TRUE) {$this->_log("cart_items_data(name)_invalid");}return FALSE;}//去除物品单价左零及非数字(带小数点)字符$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");}return FALSE;}//生成物品的唯一id if(isset($items['options']) AND count($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($items as $key => $val) {$this->_cart_contents[$rowid][$key] = $val;}return TRUE;}/*** 更新购物车物品信息(私有)
** @access private* @param array* @return bool*/ private function _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");}return FALSE;}//去除物品数量左零及非数字字符$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");}return FALSE;}//如果购物车物品数量与需要更新的物品数量一致,则不需要更新if($this->_cart_contents[$items['rowid']]['qty'] == $items['qty']) {if($this->debug === TRUE) {$this->_log("cart_items_data(qty)_equal");}return FALSE;}//如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除//否则修改购物车物品数量等于输入的物品数量if($items['qty'] == 0) {unset($this->_cart_contents[$items['rowid']]);} else {$this->_cart_contents[$items['rowid']]['qty'] = $items['qty'];}return TRUE;}/*** 保存购物车数据到session** @access private* @return bool*/ private function _save_cart() {//首先清除购物车总物品种类及总金额unset($this->_cart_contents['total_items']);unset($this->_cart_contents['cart_total']);//然后遍历数组统计物品种类及总金额$total = 0;foreach($this->_cart_contents as $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']);return FALSE;}//保存购物车数据到session$_SESSION['cart_contents'] = $this->_cart_contents;return TRUE;}/*** 日志记录** @access private* @param string* @return bool*/ private function _log($msg) {return @file_put_contents('cart_err.log', $msg, FILE_APPEND);}}/*End of file cart.php*//*Location /htdocs/cart.php*/
2. cart_demo.php文件如下:
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 = new Cart();$cart->insert($items);//var_dump($cart->contents());$cart->update($arr);var_dump($cart->contents());//$cart->destroy();//var_dump($_SESSION['cart_contents']);/*end of php*/
希望本文所述对大家的php程序设计有所帮助。
您可能感兴趣的文章:PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能php基于dom实现读取图书xml格式数据的方法php基于dom实现的图书xml格式数据示例php根据isbn书号查询amazon网站上的图书信息的示例MySQL 查找价格最高的图书经销商的几种SQL语句简单的php购物车代码php实现简单加入购物车功能基于PHP+Mysql简单实现了图书购物车系统的实例详解
