PHP實現的購物車類執行個體_php技巧

來源:互聯網
上載者:User

本文執行個體講述了PHP實現的購物車類。分享給大家供大家參考。具體分析如下:

該購物車類是基於CodeIgniter的購物車類仿寫實現的。

購物車準系統如下:

1) 將物品加入購物車
2) 從購物車中刪除物品
3) 更新購物車物品資訊 【+1/-1】
4) 對購物車物品進行統計
   1. 總項目
   2. 總數量
   3. 總金額
5) 對購物單項物品的數量及金額進行統計
6) 清空購物車

1. cart.php檔案:

<?php/** * * @author quanshuidingdang */class Cart { //物品id及名稱規則,調試資訊控制 private $product_id_rule = '\.a-z0-9-_'; //小寫字母 | 數字 | ._- private $product_name_rule = '\.\:a-z0-9-_';//小寫字母 | 數字 | ._-: private $debug = TRUE; //購物車 private $_cart_contents = array(); /**  * 建構函式  *  * @param array  */ public function __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");  } } /**  * 將物品加入購物車  *  * @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檔案如下:

<?phpsession_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 = 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程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.