一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

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

二,熱點關(guān)鍵技術(shù)
1,Smarty模塊的安裝配置
smarty是一個使用php寫出來的php模板引擎,它將一個應(yīng)用程序分成兩部分實現(xiàn):視圖和邏輯控制。即將UI和php代碼分離。php沒有內(nèi)置Smarty模板類,需要單獨下載和配置,而且Smarty要求服務(wù)器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兩個目錄。
復(fù)制libs目錄到服務(wù)器根目錄下,并重命名。這里將libs目錄重新命名為smarty。到此Smarty模板安裝完畢。
2,Smarty模板的配置
(1)首先確定Smarty目錄的位置。因為Smarty類庫是通用的,每一個項目基本都會使用,為了調(diào)用方便,習慣將smarty放置在根目錄下。

(2)新建4個目錄templates、templates_c、configs和cache,用于存儲不同的文件。新建的4個目錄位置是可以選擇的,只要配置文件路徑設(shè)置正確就可以了。

(3)創(chuàng)建配置文件。只要應(yīng)用Smarty模板,那么就一定要包含Smarty類庫和相關(guān)信息。每個頁面都寫一遍配置是不現(xiàn)實的,最好的方法就是將這些配置信息都寫到一個文件中,通過include來調(diào)用配置文件。配置文件創(chuàng)建完成后保存在根目錄下。本模塊配置文件config.php代碼如下:
復(fù)制代碼 代碼如下:
<?php
 /*  定義服務(wù)器的絕對路徑  */
 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賦值方法將一對兒名稱/方法發(fā)送到模板中  */
?>

3,smarty模板動靜分離
smarty模板最大的特點就是實現(xiàn)應(yīng)用程序的動靜分離,即將UI和php代碼分離。下面介紹Smarty模板在實現(xiàn)動靜分離的過程中常用的技術(shù)。
(1)在UI中獲取php代碼中模板變量的值
首先要確定Smarty模板的界定符,這里使用的是'<{'和'}>'。另外還應(yīng)用到一些Smarty的內(nèi)建函數(shù)section、php、if、elseif、else等。
a)section函數(shù)用于遍歷數(shù)組中的數(shù)據(jù)。每個{section}標簽必須與閉合標簽{/section}成對出現(xiàn),參數(shù)name和loop為必選項。
名稱name是包含字母、數(shù)字和下劃線的任意組合,可以嵌套但必須保證嵌套的name唯一。
變量loop(通常是數(shù)組)決定循環(huán)執(zhí)行的次數(shù),例如需要在section循環(huán)內(nèi)輸出變量時,必須在變量后加上中括號,中括號內(nèi)包含name變量。
例如:
復(fù)制代碼 代碼如下:
<{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語句,而且還增加了幾個特性以適應(yīng)模板引擎。if與/if必須成對出現(xiàn);可以使用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中的數(shù)據(jù)是來自于php代碼中定義的模板變量。在php代碼中,完成php代碼的編寫,將要輸出的值賦給一個模板變量,最后制定模板頁進行輸出。
a)為模板變量賦值通過自定義函數(shù)assign()來完成,其中第一個參數(shù)是被賦值的變量名,第二個參數(shù)是賦給變量的值。應(yīng)用assign()函數(shù)的關(guān)鍵代碼如下:
$smarty->assign("myrow",$array); //通過assign方法將數(shù)組$array中的數(shù)據(jù)寫入到myrow中b)模板頁的指定是通過display方法來完成的,其語法如下:
void display(string template[,string cache_id[,string compile_id]])
該方法用于指定模板頁,其中第一個必選參數(shù)是指定一個合法模板資源的類型和路徑;第2個可選參數(shù)指定一個緩存號;第3個可選參數(shù)指定一個編譯號,再把一個模板編譯成不同版本時使用。display方法應(yīng)用的關(guān)鍵代碼如下:
$smarty->display("index.tpl"); //指定要輸出的模板頁3,Session購物車的創(chuàng)建
Session購物車主要應(yīng)用Session變量來實現(xiàn)。而所謂的購物車就是通過session_register()函數(shù)創(chuàng)建的2個Session變量;其中g(shù)oodsid存儲商品的ID,goodsnum存儲商品的數(shù)量。Session購物車創(chuàng)建的代碼如下:
復(fù)制代碼 代碼如下:
<?php 
 session_start();  //初始化session變量
 session_register("goodsid"); //定義session變量用于存儲商品ID
 session_register("goodsnum"); //定義session變量用于存儲購買商品的數(shù)量
?>

session_register()函數(shù),在整個域范圍內(nèi)增加一個Session變量。語法:boolean session_register(string name);
參數(shù)name用于指定新Session變量的名稱。
4,通過數(shù)組函數(shù)判斷購物車是否存在指定商品
為了避免在購物車中出現(xiàn)商品的重復(fù)添加,要對添加的商品與購物車中存儲的商品進行判斷。
a)應(yīng)用explode()函數(shù),將goodsid變量中存儲的字符串以@為分隔符轉(zhuǎn)換到數(shù)組中。
explode()函數(shù),返回由字符串組成的數(shù)組,其中的每個元素都是由separator作為邊界點分割出來的子字符串。
語法:array explode(string separator,string string,[ing limit])
參數(shù)說明:
separator:必須,規(guī)定在哪里分割字符串。不能為空字符串,否則explode()返回FALSE
string:必須,要分割的字符串。limit:可選,規(guī)定所返回的數(shù)組元素的最大數(shù)目。如果設(shè)置了limit參數(shù),則返回的數(shù)組包含最多l(xiāng)imit個元素,而最后那個元素將包含string的剩余部分。如果limit參數(shù)是負數(shù),則返回除了最后的-limit個元素之外的所有元素。

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

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

5,驗證輸入商品數(shù)量值是否有效
在preg_match()函數(shù)中,判斷提交的商品數(shù)量的值是否符合正則表達式的標準,如果符合則有效,否則將給出提示信息。程序關(guān)鍵代碼如下:
復(fù)制代碼 代碼如下:
$id=$_POST["id"];       //獲取商品id
$num=$_POST["goodsnum"];     //獲取商品數(shù)量
$preg="/^[0-9]*[0-9]$|^[0-9]*[0-9]$/";  //編寫正則表達式
if($num==""){        //判斷提交的值是否為空
 echo "<script>alert('數(shù)量不能為空!');history.back();</script>";
 exit;
}else if(!preg_match($preg,$num,$str)){  //判斷提交的數(shù)據(jù)是否是正整數(shù)
  echo "<script>alert('數(shù)量只能為正整數(shù)!');history.back();</script>";
  exit;
}

preg_match()函數(shù),在字符串中搜索所有與給出的正則表達式匹配的內(nèi)容,如果存在則返回True,否則返回False。語法如下:
語法:int preg_match(string pattern,string sbuject[,array matches[,int flags]])
參數(shù)說明:
pattern:必要參數(shù),需要匹配的正則表達式
subject:必要參數(shù),輸入的字符串matches:可選參數(shù)。輸出的搜索結(jié)果的數(shù)組,例如$out[0]將包含與整個模式匹配的結(jié)果,$out[1]將包含與第一個捕獲的括號中的子模式所匹配的結(jié)果,一次類推
flags:可選參數(shù),標記:PREG_OFFSET_CAPTURE,對每個出現(xiàn)的匹配結(jié)果頁同時返回共附屬的字符串偏移量

三,函數(shù)實現(xiàn)過程
1,添加商品功能
添加商品功能的實現(xiàn)原理是:首先創(chuàng)建一個購物車,然后以商品展示頁中“購買”鏈接傳遞的商品ID($_GET[id])為依據(jù),向購物車中添加商品(商品ID),并且不允許重復(fù)添加。向購物車中添加商品的操作通過by_commodity.php文件來完成。
首先,創(chuàng)建一個購物車。
然后,判斷購物車中是否為空,如果為空,則將商品的ID和數(shù)量添加到購物車中;如果不為空,則要判斷添加商品的ID是否在購物車中已經(jīng)存在,如果存在則不能重復(fù)添加,否則將商品ID添加到購物車中。
添加商品程序代碼如下:
復(fù)制代碼 代碼如下:
<?php
 header("Content-type:text/html;charset= utf-8");
 session_start();  //初始化session變量
 session_register("goodsid"); //定義session變量用于存儲商品ID
 session_register("goodsnum"); //定義session變量用于存儲購買商品的數(shù)量
 if($_SESSION["goodsid"]=="" && $_SESSION["goodsnum"]==""){  //判斷session變量是否為空
  $_SESSION["goodsid"]=$_GET["id"]."@";      //如果session變量為空,則為其賦值為商品的ID,并以@分隔
  $_SESSION["goodsnum"]="1@";      //如果session變量為空,則為其賦值為1,并以@分隔
 }else{            //如果session變量不為空
   $array=explode("@",$_SESSION["goodsid"]);  //則以@為分隔符,將session變量中的數(shù)據(jù)寫入到數(shù)組中
   if(in_array($_GET["id"],$array)){    //如果判讀數(shù)組中是否存在指定的ID
     echo "<script>alert('該商品已經(jīng)被放入購物車!');history.back();</script>";
     exit;
   }
  //如果數(shù)組中不存在指定的ID,則說明該商品還沒有放入購物車中
  $_SESSION["goodsid"].=$_GET["id"]."@";   //將該商品添加到購物車中
  $_SESSION["goodsnum"].="1@";     //更改商品數(shù)量
 }
 echo "<script>window.location.href='shopping_car.php';</script>";
?>

2,刪除購物車中商品功能的實現(xiàn)
刪除購物車中商品的操作是根據(jù)“刪除該項”超級鏈接中傳遞的商品ID($_GET[id])執(zhí)行的。在delete_commodity.php文件中,根據(jù)$_GET[id]傳遞的值,執(zhí)行刪除購物車中商品的操作。
首先,獲取$_GET[id]傳遞的值。然后,應(yīng)用explode()函數(shù),將Session變量中存儲的商品ID和數(shù)量的數(shù)據(jù)寫入數(shù)組,并以@作為分隔符。
接著,應(yīng)用array_search()函數(shù),獲取數(shù)組中指定ID商品的鍵名,并根據(jù)獲取的鍵名將數(shù)組中指定的數(shù)據(jù)賦值為空。
最后,將數(shù)組中重新賦值的空數(shù)據(jù)寫入購物車中,從而完成刪除購物車中指定商品的操作。
復(fù)制代碼 代碼如下:
<?php
 session_start();    //初始化session變量
 require("config.php");   //連接smarty模板
 $id=$_GET["id"];    //獲取要刪除商品的ID
 $arrayid=explode("@",$_SESSION["goodsid"]);  //將購物車中存儲的商品ID的字符串轉(zhuǎn)換到數(shù)組中
 $arraynum=explode("@",$_SESSION["goodsnum"]); //將購物車中存儲的商品數(shù)量的字符串轉(zhuǎn)換到數(shù)組中
 $key=array_search($id,$arrayid);    //獲取到數(shù)組中指定的數(shù)據(jù),并返回鍵名
 $arrayid[$key]="";        //根據(jù)返回的鍵名,將數(shù)組中的數(shù)據(jù)賦值為空
 $arraynum[$key]="";        //根據(jù)返回的鍵名,將數(shù)組中的數(shù)據(jù)賦值為空
 $_SESSION["goodsid"]=implode("@",$arrayid);  //重新將數(shù)組中的數(shù)據(jù)添加到購物車中
 $_SESSION["goodsnum"]=implode("@",$arraynum); //重新將數(shù)組中的數(shù)據(jù)添加到購物車中
 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中存在多余的數(shù)據(jù)@。
解決方法:
復(fù)制代碼 代碼如下:
<?php
 session_register("goods"); //創(chuàng)建session數(shù)組
 $id=$_GET['id'];
 $arraygoods=$_SESSION["goods"];
 if($_SESSION["goods"]==""){
  $_SESSION["goods"][$id]="$id,1"; //根據(jù)商品ID保存商品,鍵名為$id,鍵值為$id,1(商品ID和購買商品數(shù)量,默認購買數(shù)量為1)
 }else{
  if(array_key_exists($id,$_SESSION["goods"])){
    echo "<script>alert('該商品已經(jīng)被放入購物車!');history.back();</script>";
    exit;
  }
  $_SESSION["goods"][$id]="$id,1";
 }
?>

商品信息以數(shù)組形式保存,[4] => 4,4。鍵名為商品ID,值為鍵名和購買商品數(shù)量。添加刪除商品只需要根據(jù)ID號找到對應(yīng)商品修改信息即可。
復(fù)制代碼 代碼如下:
Array
(
    [4] => 4,4
    [3] => 3,5
    [1] => 1,10
    [2] => 2,1
)

3,生成訂單功能的實現(xiàn)
生成訂單功能就是從數(shù)據(jù)庫中讀取出填寫的訂單信息,對其內(nèi)容進行重新整合,形成一個訂單模式,并且實現(xiàn)訂單打印和訂單預(yù)覽的功能。訂單生成的操作通過兩個文件來完成,一個是從數(shù)據(jù)庫中讀取數(shù)據(jù),將所需的數(shù)據(jù)賦值給指定的Smarty模板變量,并指定模板頁。
復(fù)制代碼 代碼如下:
<?php
 session_start();
 header("Content-type:text/html;charset= utf-8");
 require_once("conn.php");
 require_once("config.php");
 $array=array();        //定義一個空數(shù)組
 $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);    //將獲取的數(shù)組值寫入到新的數(shù)組中
 $smarty->assign("info",$array);
 $array=explode("@",$info["spc"]);
 $arraynum=explode("@",$info["slc"]);
 $totalprice=0;         //定義價格變量
 $arrayinfo=array();        //創(chuàng)建數(shù)組
 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); //讀取數(shù)據(jù)庫中數(shù)據(jù)
   $totalprices=$infocart["tb_commodity_price"]*$arraynum["$i"];  //計算總的價格
   array_push($infocart,$arraynum["$i"]);  //將購買數(shù)量的數(shù)據(jù)寫入到數(shù)據(jù)庫中返回的數(shù)組中   
   array_push($infocart,$totalprices);  //將購買數(shù)量的數(shù)據(jù)寫入到數(shù)據(jù)庫中返回的數(shù)組中   
   array_push($arrayinfo,$infocart);       //將整理的數(shù)據(jù)壓入到創(chuàng)建的新數(shù)組中
   $totalprice+=$infocart["tb_commodity_price"]*$arraynum["$i"];  //計算總的價格
  }
 }
 session_unregister("goods");
 if(count($arrayinfo)>0){      //判斷數(shù)組是否為空
  $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模板頁,輸出模板變量中存儲的數(shù)據(jù),生成一個訂單。

四,源代碼下載:點擊下載

php技術(shù)深入PHP購物車模塊功能分析(函數(shù)講解,附源碼),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久亭亭 | 亚洲福利视频网址 | 国产成人www | 午夜国产小视频 | 久久精品国产亚洲婷婷 | 成年午夜视频 | 亚洲天堂婷婷 | 中文字幕在线有码 | 色老板最新网址 | 精品五月天 | 97精品久久久久中文字幕 | 区二区三区四区免费视频 | 国产一级在线观看www色 | 久久精彩免费视频 | 97影院午夜在线观看视频 | 成人精品国产 | 国产69页| 深爱五月激情 | 国产九九视频在线观看 | 亚洲国产成人精品女人久久久 | 99精品国产福利在线观看 | 男女视频免费网站 | 色哟哟在线观看视频高清大全 | 精品久久久久久免费影院 | 一区二区中文字幕在线观看 | 五月月色开心婷婷久久合 | 伊人精品成人久久综合欧美 | 91在线亚洲综合在线 | www.色老板| 色偷偷7777www人| 国产男女视频在线观看 | 国产中文在线视频 | 天天拍夜夜拍高清视频 | 亚色成人 | 俄罗斯freexxxx性特大另类 | 日韩精品资源 | 黄色在线免费观看 | 97久久精品国产精品青草 | 99情趣网| 日韩美女在线视频 | 国产精品视频999 |