深入PHP購物車模組功能分析(函數講解,附源碼)

來源:互聯網
上載者:User

一,購物車概述
購物車是為消費者在網上購物中提供一個臨時儲存商品的地方。其主要功能包括:添加商品、刪除商品、更改商品數量、商品金額小計、商品金額總計和清空購物車;還包括產生訂單、訂單列印、訂單預覽、提交訂單和取消購物等。
購物車的操作流程:首先,登入到網站中瀏覽商品;然後,購買指定的商品,進入購物車頁面中,在該頁面可以實現更改商品數量、刪除商品、清空購物車、繼續購物等;最後,填寫收貨人資訊,產生訂單,訂單列印、預覽,提交訂單等操作。

二,熱點關鍵技術
1,Smarty模組的安裝配置
smarty是一個使用PHP寫出來的PHP模板引擎,它將一個應用程式分成兩部分實現:視圖和邏輯控制。即將UI和PHP代碼分離。PHP沒有內建Smarty模板類,需要單獨下載和配置,而且Smarty要求伺服器上PHP版本最低為4.0.6。PHP Smarty可以在http://www.smarty.net/download下載。將壓縮包解壓,其中有一個libs目錄,包含Smarty類庫的所有核心檔案。包括smarty.class.php、smarty_Compiler.class.php、config_File.class.php和debug.tpl 4個檔案,還有internals和plug-ins兩個目錄。
複製libs目錄到伺服器根目錄下,並重新命名。這裡將libs目錄重新命名為smarty。到此Smarty模板安裝完畢。
2,Smarty模板的配置
(1)首先確定Smarty目錄的位置。因為Smarty類庫是通用的,每一個項目基本都會使用,為了調用方便,習慣將smarty放置在根目錄下。

(2)建立4個目錄templates、templates_c、configs和cache,用於儲存不同的檔案。建立的4個目錄位置是可以選擇的,只要設定檔路徑設定正確就可以了。

(3)建立設定檔。只要應用Smarty模板,那麼就一定要包含Smarty類庫和相關資訊。每個頁面都寫一遍配置是不現實的,最好的方法就是將這些配置資訊都寫到一個檔案中,通過include來調用設定檔。設定檔建立完成後儲存在根目錄下。本模組設定檔config.php代碼如下:

複製代碼 代碼如下:<?php
 /*  定義伺服器的絕對路徑  */
 define('BASE_PATH','E:\PHPservices\\');
 /*  定義Smarty目錄的絕地你路徑  */
 define('SMARTY_PATH','SourceCode\12\01\\');
 /*  載入Smarty類庫檔案  */
 require BASE_PATH.SMARTY_PATH.'smarty\Smarty.class.php';
 /*  執行個體化一個Smarty對象  */
 $smarty = new Smarty;
 /*  定義各個目錄的路徑 */
 $smarty->template_dir = BASE_PATH.SMARTY_PATH.'./';
 $smarty->compile_dir = BASE_PATH.SMARTY_PATH.'templates_c/';
 $smarty->config_dir = BASE_PATH.SMARTY_PATH.'configs/';
 $smarty->cache_dir = BASE_PATH.SMARTY_PATH.'cache/';
 /*  定義定界符  */
 $smarty->left_delimiter = '<{';
 $smarty->right_delimiter = '}>';
 /*  使用Smarty賦值方法將一對兒名稱/方法發送到模板中  */
?>

3,smarty模板動靜分離
smarty模板最大的特點就是實現應用程式的動靜分離,即將UI和PHP代碼分離。下面介紹Smarty模板在實現動靜分離的過程中常用的技術。
(1)在UI中擷取PHP代碼中模板變數的值
首先要確定Smarty模板的界定符,這裡使用的是'<{'和'}>'。另外還應用到一些Smarty的內建函數section、php、if、elseif、else等。
a)section函數用於遍曆數組中的資料。每個{section}標籤必須與閉合標籤{/section}成對出現,參數name和loop為必選項。
名稱name是包含字母、數字和底線的任意組合,可以嵌套但必須保證嵌套的name唯一。
變數loop(通常是數組)決定迴圈執行的次數,例如需要在section迴圈內輸出變數時,必須在變數後加上中括弧,中括弧內包含name變數。
例如:複製代碼 代碼如下:<{section name=data  loop=$myrow }>
 <tr>
  <td width="125" bgcolor="#FFFFFF"><{$myrow[data].tb_commodity_name}></td>
  <td bgcolor="#FFFFFF"><{$myrow[data].tb_commodity_price}></td>
 </tr>
<{/section}>b)php標籤的作用是直接在模板中嵌入PHP指令碼,標籤的格式是"<{php}>"和"<{/php}>".
c)在Smarty的模板中同樣也支援if、else語句,而且還增加了幾個特性以適應模板引擎。if與/if必須成對出現;可以使用else和elseif字句;可使用以下條件修飾詞:eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、===、!=、>、<、<=、>=。在使用修飾詞時必須和變數或者常量用空格分隔開來。樣本如下:
<{if $isShow=="F" }>
 <tr>
        <td height="22" colspan="5" bgcolor="#FFFFFF"><div align="center">對不起,您的購物車中暫無商品資訊!</div></td>
    </tr>
<{else}>
 <{section name=data loop=$myrow }>
  <tr>
   <td height="22" align="center" bgcolor="#FFFFFF"><{$myrow[data].tb_commodity_name}></td>
   <td height="22" bgcolor="#FFFFFF"><div align="center"><{$myrow[data].tb_commodity_price}></div></td>
  </tr>
 <{/section}>
<{/if}>

(2)在PHP代碼中定義模板變數,為模板變數賦值
UI中的資料是來自於PHP代碼中定義的模板變數。在PHP代碼中,完成PHP代碼的編寫,將要輸出的值賦給一個模板變數,最後制定模板頁進行輸出。
a)為模板變數賦值通過自訂函數assign()來完成,其中第一個參數是被賦值的變數名,第二個參數是賦給變數的值。應用assign()函數的關鍵代碼如下:
$smarty->assign("myrow",$array); //通過assign方法將數組$array中的資料寫入到myrow中b)模板頁的指定是通過display方法來完成的,其文法如下:
void display(string template[,string cache_id[,string compile_id]])
該方法用於指定模板頁,其中第一個必選參數是指定一個合法模板資源的類型和路徑;第2個選擇性參數指定一個緩衝號;第3個選擇性參數指定一個編譯號,再把一個模板編譯成不同版本時使用。display方法應用的關鍵代碼如下:
$smarty->display("index.tpl"); //指定要輸出的模板頁3,Session購物車的建立
Session購物車主要應用Session變數來實現。而所謂的購物車就是通過session_register()函數建立的2個Session變數;其中goodsid儲存商品的ID,goodsnum儲存商品的數量。Session購物車建立的代碼如下:複製代碼 代碼如下:<?php 
 session_start();  //初始化session變數
 session_register("goodsid"); //定義session變數用於儲存商品ID
 session_register("goodsnum"); //定義session變數用於儲存購買商品的數量
?>

session_register()函數,在整個域範圍內增加一個Session變數。文法:boolean session_register(string name);
參數name用於指定新Session變數的名稱。
4,通過數組函數判斷購物車是否存在指定商品
為了避免在購物車中出現商品的重複添加,要對添加的商品與購物車中儲存的商品進行判斷。
a)應用explode()函數,將goodsid變數中儲存的字串以@為分隔字元轉換到數組中。
explode()函數,返回由字串組成的數組,其中的每個元素都是由separator作為邊界點分割出來的子字串。
文法:array explode(string separator,string string,[ing limit])
參數說明:
separator:必須,規定在哪裡分割字串。不可為空字串,否則explode()返回FALSE
string:必須,要分割的字串。limit:可選,規定所返回的數組元素的最大數目。如果設定了limit參數,則返回的數組包含最多limit個元素,而最後那個元素將包含string的剩餘部分。如果limit參數是負數,則返回除了最後的-limit個元素之外的所有元素。

b)in_array()函數判斷數組中是否存在指定的商品ID,如果存在,則說明商品已經在購物車中;否則商品不存在,則將商品的ID添加到購物車中。

in_inarray()函數在數組中搜尋給定的值。如果找到則返回True,否則返回False。
文法:bool in_array(mixed value,array array[,bool type])
參數說明:
value:必須,規定要在數組中搜尋的值
array:必須,規定要搜尋的數組。
type:可選,如果設定為true,則檢查搜尋的資料與數組的類型是否相同。
在購物車模組中,判斷購物車中是否存在指定的商品的代碼如下:複製代碼 代碼如下:<?php 
 session_start(); //初始化session變數
 session_register("goodsid"); //定義session變數用於儲存商品ID
 session_register("goodsnum"); //定義session變數用於儲存購買商品的數量
 if($_SESSION["goodsid"]=="" && $_SESSION["goodsnum"]==""){ //判斷session變數是否為空白
  $_SESSION["goodsid"]=$_GET["id"]."@"; //如果session變數為空白,則為其賦值為商品的ID,並以@分隔
  $_SESSION["goodsnum"]="1@";  //如果session變數為空白,則為其賦值為1,並以@分隔
 }else{ //如果session變數不為空白
   $array=explode("@",$_SESSION["goodsid"]); //則以@為分隔字元,將session變數中的資料寫入到數組中
   if(in_array($_GET["id"],$array)){ //如果判讀數組中是否存在指定的ID
     echo "<script>alert('該商品已經被放入購物車!');history.back();</script>";
     exit;
   }
  //如果數組中不存在指定的ID,則說明該商品還沒有放入購物車中
  $_SESSION["goodsid"].=$_GET["id"]."@"; //將該商品添加到購物車中
  $_SESSION["goodsnum"].="1@"; //更改商品數量
 }
 echo "<script>window.location.href='shopping_car.php';</script>";
?>

5,驗證輸入商品數量值是否有效
在preg_match()函數中,判斷提交的商品數量的值是否符合Regex的標準,如果符合則有效,否則將給出提示資訊。程式關鍵代碼如下:複製代碼 代碼如下:$id=$_POST["id"];       //擷取商品id
$num=$_POST["goodsnum"];     //擷取商品數量
$preg="/^[0-9]*[0-9]$|^[0-9]*[0-9]$/";  //編寫Regex
if($num==""){        //判斷提交的值是否為空白
 echo "<script>alert('數量不可為空!');history.back();</script>";
 exit;
}else if(!preg_match($preg,$num,$str)){  //判斷提交的資料是否是正整數
  echo "<script>alert('數量只能為正整數!');history.back();</script>";
  exit;
}

preg_match()函數,在字串中搜尋所有與給出的Regex匹配的內容,如果存在則返回True,否則返回False。文法如下:
文法:int preg_match(string pattern,string sbuject[,array matches[,int flags]])
參數說明:
pattern:必要參數,需要匹配的Regex
subject:必要參數,輸入的字串matches:選擇性參數。輸出的搜尋結果的數組,例如$out[0]將包含與整個模式比對的結果,$out[1]將包含與第一個捕獲的括弧中的子模式所匹配的結果,一次類推
flags:選擇性參數,標記:PREG_OFFSET_CAPTURE,對每個出現的匹配結果頁同時返回共附屬的字串位移量

三,函數實現過程
1,添加商品功能
添加商品功能的實現原理是:首先建立一個購物車,然後以商品展示頁中“購買”連結傳遞的商品ID($_GET[id])為依據,向購物車中添加商品(商品ID),並且不允許重複添加。向購物車中添加商品的操作通過by_commodity.php檔案來完成。
首先,建立一個購物車。
然後,判斷購物車中是否為空白,如果為空白,則將商品的ID和數量添加到購物車中;如果不為空白,則要判斷添加商品的ID是否在購物車中已經存在,如果存在則不能重複添加,否則將商品ID添加到購物車中。
添加商品程式碼如下:

複製代碼 代碼如下:<?php
 header("Content-type:text/html;charset= utf-8");
 session_start();  //初始化session變數
 session_register("goodsid"); //定義session變數用於儲存商品ID
 session_register("goodsnum"); //定義session變數用於儲存購買商品的數量
 if($_SESSION["goodsid"]=="" && $_SESSION["goodsnum"]==""){  //判斷session變數是否為空白
  $_SESSION["goodsid"]=$_GET["id"]."@";      //如果session變數為空白,則為其賦值為商品的ID,並以@分隔
  $_SESSION["goodsnum"]="1@";      //如果session變數為空白,則為其賦值為1,並以@分隔
 }else{            //如果session變數不為空白
   $array=explode("@",$_SESSION["goodsid"]);  //則以@為分隔字元,將session變數中的資料寫入到數組中
   if(in_array($_GET["id"],$array)){    //如果判讀數組中是否存在指定的ID
     echo "<script>alert('該商品已經被放入購物車!');history.back();</script>";
     exit;
   }
  //如果數組中不存在指定的ID,則說明該商品還沒有放入購物車中
  $_SESSION["goodsid"].=$_GET["id"]."@";   //將該商品添加到購物車中
  $_SESSION["goodsnum"].="1@";     //更改商品數量
 }
 echo "<script>window.location.href='shopping_car.php';</script>";
?>

2,刪除購物車中商品功能的實現
刪除購物車中商品的操作是根據“刪除該項”超級連結中傳遞的商品ID($_GET[id])執行的。在delete_commodity.php檔案中,根據$_GET[id]傳遞的值,執行刪除購物車中商品的操作。
首先,擷取$_GET[id]傳遞的值。然後,應用explode()函數,將Session變數中儲存的商品ID和數量的資料寫入數組,並以@作為分隔字元。
接著,應用array_search()函數,擷取數組中指定ID商品的鍵名,並根據擷取的鍵名將數組中指定的資料賦值為空白。
最後,將數組中重新賦值的空資料寫入購物車中,從而完成刪除購物車中指定商品的操作。複製代碼 代碼如下:<?php
 session_start();    //初始化session變數
 require("config.php");   //串連smarty模板
 $id=$_GET["id"];    //擷取要刪除商品的ID
 $arrayid=explode("@",$_SESSION["goodsid"]);  //將購物車中儲存的商品ID的字串轉換到數組中
 $arraynum=explode("@",$_SESSION["goodsnum"]); //將購物車中儲存的商品數量的字串轉換到數組中
 $key=array_search($id,$arrayid);    //擷取到數組中指定的資料,並返回鍵名
 $arrayid[$key]="";        //根據返回的鍵名,將數組中的資料賦值為空白
 $arraynum[$key]="";        //根據返回的鍵名,將數組中的資料賦值為空白
 $_SESSION["goodsid"]=implode("@",$arrayid);  //重新將數組中的資料添加到購物車中
 $_SESSION["goodsnum"]=implode("@",$arraynum); //重新將數組中的資料添加到購物車中
 echo "<script>window.location.href='shopping_car.php';</script>";
 $smarty->display("shopping_car.tpl");
?>

刪除前$_SESSION["goodsid"]的值為"3@2@5@",刪除$id=5後$_SESSION["goodsid"]的值為"3@2@@";這樣Session中存在多餘的資料@。
解決方案:
複製代碼 代碼如下:<?php
 session_register("goods"); //建立session數組
 $id=$_GET['id'];
 $arraygoods=$_SESSION["goods"];
 if($_SESSION["goods"]==""){
  $_SESSION["goods"][$id]="$id,1"; //根據商品ID儲存商品,鍵名為$id,索引值為$id,1(商品ID和購買商品數量,預設購買數量為1)
 }else{
  if(array_key_exists($id,$_SESSION["goods"])){
    echo "<script>alert('該商品已經被放入購物車!');history.back();</script>";
    exit;
  }
  $_SESSION["goods"][$id]="$id,1";
 }
?>

商品資訊以數組形式儲存,[4] => 4,4。鍵名為商品ID,值為鍵名和購買商品數量。添加刪除商品只需要根據ID號找到對應商品修改資訊即可。複製代碼 代碼如下:Array
(
    [4] => 4,4
    [3] => 3,5
    [1] => 1,10
    [2] => 2,1
)

3,產生訂單功能的實現
產生訂單功能就是從資料庫中讀取出填寫的訂單資訊,對其內容進行重新整合,形成一個訂單模式,並且實現訂單列印和訂單預覽的功能。訂單產生的操作通過兩個檔案來完成,一個是從資料庫中讀取資料,將所需的資料賦值給指定的Smarty模板變數,並指定模板頁。複製代碼 代碼如下:<?php
 session_start();
 header("Content-type:text/html;charset= utf-8");
 require_once("conn.php");
 require_once("config.php");
 $array=array();        //定義一個空數組
 $ddnumber=base64_decode($_GET["ddno"]);
 mysql_query("set names utf8");
 $sql=mysql_query("select * from tb_commodity_order_form where ddnumber='".$ddnumber."'",$conn);
 $info=mysql_fetch_array($sql);
 array_push($array,$info);    //將擷取的數組值寫入到新的數組中
 $smarty->assign("info",$array);
 $array=explode("@",$info["spc"]);
 $arraynum=explode("@",$info["slc"]);
 $totalprice=0;         //定義價格變數
 $arrayinfo=array();        //建立數組
 for($i=0;$i<count($array);$i++){
  if($array[$i]!=""){
   $sqlcart=mysql_query("select * from tb_commodity where tb_commodity_id='".$array[$i]."'",$conn);
   $infocart=mysql_fetch_array($sqlcart); //讀取資料庫中資料
   $totalprices=$infocart["tb_commodity_price"]*$arraynum["$i"];  //計算總的價格
   array_push($infocart,$arraynum["$i"]);  //將購買數量的資料寫入到資料庫中返回的數組中   
   array_push($infocart,$totalprices);  //將購買數量的資料寫入到資料庫中返回的數組中   
   array_push($arrayinfo,$infocart);       //將整理的資料壓入到建立的新數組中
   $totalprice+=$infocart["tb_commodity_price"]*$arraynum["$i"];  //計算總的價格
  }
 }
 session_unregister("goods");
 if(count($arrayinfo)>0){      //判斷數組是否為空白
  $gnum=count($arrayinfo);
  $smarty->assign("isShow","T");
  $smarty->assign("gnum",$gnum);
  $smarty->assign("myrow",$arrayinfo);
  $smarty->assign("totalprice",$totalprice);
 }else{
  $smarty->assign("isShow","F");
 }
 $smarty->display("shopping_dd.tpl");
?>

另一個是shopping_dd.tpl模板頁,輸出模板變數中儲存的資料,產生一個訂單。

四,原始碼下載:點擊下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.