亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

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

2020-03-22 20:01:44
字體:
來源:轉載
供稿:網友
一,購物車概述
購物車是為消費者在網上購物中提供一個臨時存儲商品的地方。其主要功能包括:添加商品、刪除商品、更改商品數量、商品金額小計、商品金額總計和清空購物車;還包括生成訂單、訂單打印、訂單預覽、提交訂單和取消購物等。
購物車的操作流程:首先,登錄到網站中瀏覽商品;然后,購買指定的商品,進入購物車頁面中,在該頁面可以實現更改商品數量、刪除商品、清空購物車、繼續購物等;最后,填寫收貨人信息,生成訂單,訂單打印、預覽,提交訂單等操作。二,熱點關鍵技術
1,Smarty模塊的安裝配置
smarty是一個使用PHP寫出來的PHP模板引擎,它將一個html' target='_blank'>應用程序分成兩部分實現:視圖和邏輯控制。即將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()函數中,判斷提交的商品數量的值是否符合正則表達式的標準,如果符合則有效,否則將給出提示信息。程序關鍵代碼如下:
復制代碼 代碼如下:
$id=$_POST["id"];//獲取商品id
$num=$_POST["goodsnum"];//獲取商品數量
$preg="/^[0-9]*[0-9]$|^[0-9]*[0-9]$/";//編寫正則表達式
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()函數,在字符串中搜索所有與給出的正則表達式匹配的內容,如果存在則返回True,否則返回False。語法如下:
語法:int preg_match(string pattern,string sbuject[,array matches[,int flags]])
參數說明:
pattern:必要參數,需要匹配的正則表達式
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模板頁,輸出模板變量中存儲的數據,生成一個訂單。四,源代碼下載:點擊下載
PHP教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性av网站| 欧美性xxxx在线播放| 精品亚洲一区二区三区在线播放| 97人人爽人人喊人人模波多| 亚洲xxxx3d| 日本成人在线视频网址| 欧美成人免费播放| 2020欧美日韩在线视频| 国产乱肥老妇国产一区二| 中文字幕日韩在线播放| 亚洲国产精品va在线看黑人动漫| 欧美激情手机在线视频| 亚洲大尺度美女在线| 亚洲日韩中文字幕在线播放| 日韩在线播放视频| 麻豆国产va免费精品高清在线| 国产精品人成电影在线观看| 久久久久久久久久亚洲| 亚洲精品美女免费| 国产在线视频91| 欧美激情视频一区| 欧美成人激情图片网| 亚洲精品久久7777777| 精品久久久久久久久久国产| 亚洲sss综合天堂久久| 亚洲自拍偷拍视频| 日韩av快播网址| 欧美成人在线影院| 国产精品人人做人人爽| 久久久久久美女| 一本色道久久88精品综合| 国产手机视频精品| 欧美亚洲视频在线看网址| 久久久久一本一区二区青青蜜月| 中文字幕日韩免费视频| 亚洲人高潮女人毛茸茸| 欧美性受xxxx白人性爽| 日本不卡高字幕在线2019| 国产一区二区丝袜高跟鞋图片| 91在线色戒在线| 色偷偷av一区二区三区乱| 欧美激情videoshd| 亚洲乱码国产乱码精品精天堂| 久久99久国产精品黄毛片入口| 岛国av一区二区三区| 中文字幕日韩专区| 国产精品一区电影| 国产一区二区三区精品久久久| 亚洲变态欧美另类捆绑| 成人激情黄色网| 成人中文字幕+乱码+中文字幕| 日韩av在线免费看| 精品人伦一区二区三区蜜桃免费| 亚洲精品日韩激情在线电影| 成人欧美一区二区三区在线湿哒哒| 欧美成人精品xxx| 亚洲影院污污.| 欧美日韩一区二区三区| 亚洲一区999| 青青青国产精品一区二区| 人体精品一二三区| 亚洲嫩模很污视频| 亚洲a∨日韩av高清在线观看| 国产精品福利小视频| 国产精品极品尤物在线观看| 国内精品久久久久久影视8| 国产免费一区视频观看免费| 国外成人在线播放| 亚洲午夜未满十八勿入免费观看全集| 久久精品成人一区二区三区| 91成人精品网站| 亚洲成人亚洲激情| 国产精品久久久久久久久久小说| 综合国产在线视频| 亚洲老头老太hd| 久久久久久999| 国产亚洲精品一区二555| 国产精品一久久香蕉国产线看观看| 日韩va亚洲va欧洲va国产| 欧美亚洲国产另类| 久久久久久久色| 色偷偷偷综合中文字幕;dd| 国产成人一区二区三区| 亚洲精品一区二区三区不| 亚洲国产欧美一区二区三区久久| 欧美在线视频一区| 深夜精品寂寞黄网站在线观看| 日韩高清av一区二区三区| 欧美极品少妇xxxxx| 国产婷婷97碰碰久久人人蜜臀| 国产一区二区三区四区福利| 亚洲第一免费播放区| 久久99热精品这里久久精品| 国产日产欧美精品| 国产午夜精品视频免费不卡69堂| 欧美一区二粉嫩精品国产一线天| 国产在线视频欧美| 亚洲综合日韩在线| 欧美日韩精品在线观看| 国产精品美女网站| 日韩亚洲国产中文字幕| 国产一区二区三区欧美| 久久天天躁狠狠躁夜夜躁| 国模视频一区二区三区| 91精品免费久久久久久久久| 高清欧美一区二区三区| 久久久女人电视剧免费播放下载| 久久久久久高潮国产精品视| 麻豆乱码国产一区二区三区| 国产精品日本精品| 懂色aⅴ精品一区二区三区蜜月| 亚洲无av在线中文字幕| 欧美日韩国产一区在线| 国产有码在线一区二区视频| 欧美福利小视频| 久久久精品久久久久| 国产精品入口福利| 日本免费在线精品| 日本高清不卡的在线| 国产精品wwww| 日韩女优人人人人射在线视频| 亚洲欧美日韩中文在线制服| 欧美成人午夜激情在线| 国产精品主播视频| 欧美久久精品午夜青青大伊人| 中文字幕日韩欧美| 成人网在线免费观看| 国模gogo一区二区大胆私拍| 国产香蕉97碰碰久久人人| 91精品国产综合久久久久久蜜臀| 成人a级免费视频| 亚洲国产精品va在线| 欧美成人精品三级在线观看| 美女精品视频一区| 久久久国产精品亚洲一区| 亚洲日本成人女熟在线观看| 久久全国免费视频| 2018中文字幕一区二区三区| 日本精品久久久久影院| 黑人巨大精品欧美一区免费视频| 国产激情久久久久| 97国产精品人人爽人人做| 国产成人在线一区二区| 一个人看的www欧美| 亚洲日本欧美日韩高观看| 国产精品亚发布| 亚洲最大激情中文字幕| 欧美理论电影在线观看| 中文字幕日韩av电影| 亚州欧美日韩中文视频| 亚洲第一男人av| 国产精品99一区| 国语自产精品视频在线看一大j8| 亚洲国产精品久久| 国产欧美va欧美va香蕉在线| 久久中文久久字幕| 亚洲欧美一区二区三区情侣bbw| 国内精品久久久久影院优| 91精品久久久久久久久| 国产一区二区三区在线看| 成人国内精品久久久久一区| 美日韩精品免费观看视频| 亚洲天堂av高清| 亚洲精品一区久久久久久|