購物車管理包含功能:提交商品到購物車、顯示購物車列表、刪除購物車裏商品、修改購物車、清空購物車等等
1、 購物車的實現方式:
① 可以把購物車的數據,給存儲到 session 裏面,一旦關閉瀏覽器,則商品數據就丟失;
②可以把購物車的數據,給存儲到 cookie 裏面,可以長久的保存購物車裏面的數據;
③可以把購物車的數據,給存儲到數據庫裏面,可以長久的保存購物車裏面的數據;
④可以把購物車的數據,給存儲到緩存裏(memcache,redis),也可以長久的保存購物車的數據。
注:Session 可能會引起併發問題,如果腳本很短,這通常沒有問題。但如果腳本運行時間比較長,那就可能會產生問題。在現代 Web 應用程序開發中,有一個非常常見的情況,就是使用 AJAX 技術在同一個頁面內發送多個請求獲取數據。
如果這些請求都需要使用Session,那麼第一個請求到達服務器後會取得 Session 鎖,其它請求就必須等待,所有請求將串行處理,即使它們彼此之間並沒有依賴關係。這將大大增加頁面的響應時間。
有一個方法可以避免這個問題,就是在使用完 Session 以後立即調用 session_write_close()方法關閉 Session。這樣 Session 鎖就會釋放,即使當前腳本還在等在處理。需要注意的是,調用該方法後,當前腳本就不能進一步操作 Session 了
2、實例:京東購物車的設置,如果用戶已經登錄,則把購物車數據保存到數據庫裏面,如果沒有登錄,則把購物車的數據給保存到 cookie 裏面,當登錄時,要判斷 cookie是否有購物車的數據,如果有,則把 cookie 裏面的數據給移動到數據庫裏面。
3、提交商品到購物車:在前臺模塊裏新建一個 CartController 控制器,添加 addCart方法
實現代碼
<?php
namespace app\index\controller;
use think\Controller;
use think\Validate;
class Cart extends Controller
{
private $redis = null;
public function __construct() //可以使用單例模式
{
$this->redis = new \Redis();
$this->redis->connect('127.0.0.1','6379');
}
public function index()
{
$data = $_POST;
//1.添加購物車操作測試
/* $rule0 = [
'userid'=> "require|number",
'goodid'=> "require|number",
'goodname'=>"require"
];
$validate = new Validate($rule0);
if ($validate->check($data)){
$userid = $_POST['userid'];
$goodid = $_POST['goodid'];
$goodname = $_POST['goodname'];
//添加購物車操作
//$this->addcart($userid,$goodid,$goodname);
//單獨刪除購物車商品
//$this->removecart($userid,$goodid,$goodname);
}else{
echo $validate->getError();
}
*/
//2.獲取購物車的所有商品
$rule0 = [
'userid'=> "require|number",
];
$validate = new Validate($rule0);
if ($validate->check($data)){
$userid = $_POST['userid'];
//獲取購物車商品操作
// $data = $this->getCartList($userid); var_dump($data);
$this->delcart($userid);
}else{
echo $validate->getError();
}
}
/**
* 添加購物車
* @param $userid 用戶id
* @param $goodid 商品id
* @param $goodname 商品名稱
* (購物車沒有添加時間)
*/
public function addcart($userid,$goodid,$goodname)
{
$hashKey = 'cart_'.$userid; //hash名稱
$key = $goodid."_".$goodname; //hsah鍵名
$this->redis->hincrby($hashKey,$key,1); //設置hash鍵名+1
}
/**
* 用戶清空購物車
* @param $userid 用戶id
*/
public function delcart($userid)
{
$hashKey = 'cart_'.$userid;
$this->redis->del($hashKey);
}
/**
*用戶移除購物車中某件商品(可以根據商品id獲取商品名稱,這裏爲了方便)
* @param $userid
* @param $goodid
*/
public function removecart($userid,$goodid,$goodname)
{
$hashKey = 'cart_'.$userid; //hash名稱
$key = $goodid."_".$goodname; //hsah鍵名
$this->redis->hdel($hashKey,$key);
}
/**
*
*/
public function getCartList($userid)
{
$hashKey = 'cart_'.$userid; //hash名稱
$data = $this->redis->hGetAll($hashKey);
return $data;
}
}