简单思路分析
首先需要理解的是,购物车操作是SESSION的原理
一个物品加进去是一个数组,存ID NAME NUM
那么两个物品就是二维数组,所以用二维数组来操作就可以了。
表结构:
- SET FOREIGN_KEY_CHECKS=0;
- -- ----------------------------
- -- Table structure for `produce`
- -- ----------------------------
- DROP TABLE IF EXISTS `produce`;
- CREATE TABLE `produce` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(50) DEFAULT NULL,
- `pimg` varchar(200) DEFAULT NULL,
- `price` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
- -- ----------------------------
- -- Records of produce
- -- ----------------------------
- INSERT INTO `produce` VALUES ('1', '测试', 'test.png', '1');
- INSERT INTO `produce` VALUES ('2', '测试2', 'test.png', '2');
- INSERT INTO `produce` VALUES ('3', '测试3', 'test.png', '1');
- INSERT INTO `produce` VALUES ('4', '测试4', 'test.png', '2');
- INSERT INTO `produce` VALUES ('5', '测试5', 'test.png', '9');
商品列表方法:
- public function index()
- {
- $produce = Db::name('produce')->select();
- return view('index',['list'=>$produce]);
- }
商品列表页面:
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Titletitle>
- head>
- <body>
- <h1><header>商品列表header>h1>
- <table width="343" height="152" border="1" style="float:left">
- {volist name="list" id="row"}
- <tr>
- <td width="124" rowspan="3"><img src="" width="123" height="121" border="0"/>td>
- <td width="203" height="35">货物名称:td>
- tr>
- <tr>
- <td height="28">货物价格:td>
- tr>
- <tr>
- <td height="27"align="center"><a href="buy?pid={$row['id']}&pname={$row['name']}">加入购物车a>td>
- tr>
- {/volist}
- table>
-
- body>
- html>
加入购物车处理方法,加入成功后跳转到购物车列表页
- public function buy()
- {
- // echo '
';
- // Session::clear();die;
- $param = request()->param();
-
- //物品id
- $pid = $param['pid'];
-
- //物品名称
- $pname = $param['pname'];
- $arr = session('mycar');
- //先判断这个变量是否是数组,可以得到以前是否买过东西
- if(is_array($arr)){
- //是数组,买过东西
- //买过东西分两种,这种东西是否买过,买过对其数量加1,没买过,将此商品id和name值组建成一个一维数组
- if(array_key_exists($pid,$arr)){
- //拿出这个商品的信息
- $uu = $arr[$pid];
- $uu['num'] = $uu['num']+1;
- //该商品加1后重新赋值
- $arr[$pid] = $uu;
- }else{
- $arr[$pid] = array('pid'=>$pid,'name'=>$pname,'num'=>1);
- }
- }else{
- $arr[$pid] = array('pid'=>$pid,'name'=>$pname,'num'=>1);
- }
- //处理完后,重新将此数据放入session中,便可以在各个页面进行赋值
- session('mycar',$arr);
-
- //这里要使用重定向
- return redirect('/car');
- }
购物车列表页
- //购物车页面
- public function car()
- {
- $arr = session('mycar');
- return view('car',['list'=>$arr]);
- }
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>购物车title>
- head>
- <body>
- <h1><header>购物车header>h1>
- <table width="600" height="37"border="1">
- <tr>
- <td width="96">商品IDtd>
- <td width="158">商品名称td>
- <td width="154">商品数量td>
- <td width="177">删除td>
- tr>
- {volist name="list" id="a"}
- <tr>
- <td width="96">{$a['pid']}td>
- <td width="158">{$a['name']}td>
- <td width="154">{$a['num']}td>
- <td width="177"><a href="delete?pid={$a['pid']}">移除该商品a> <a href="reduce?pid={$a['pid']}">减1a> <a href="buy?pid={$a['pid']}&pname={$a['name']}">加1a>td>
- tr>
- {/volist}
- table>
- body>
- html>
从购物车移除该商品
- //从购物车移除该商品
- public function delete()
- {
- $param = request()->param();
- $pid = $param['pid'];
-
- $arr = session('mycar');;//拿出session里的二维数组
- foreach($arr as $key=>$proId)//遍历该二维数组中的键值,这里也就是商品的id
- {
- if($key==$pid)//判断键值等于传过来的商品id
- {
- unset($arr[$key]);//清除该一维数组
- }
- }
- session('mycar',$arr);
-
- return redirect('/car');
- }
购物车商品数量减1
- //购物车商品数量减1
- public function reduce()
- {
- $param = request()->param();
- $pid = $param['pid'];
- // echo '
';
- // echo $pid;
- $arr = session('mycar');//拿出session里的二维数组
- foreach($arr as $key=>$proId)//遍历该二维数组中的键值,这里也就是商品的id
- {
- if($key==$pid)//判断键值等于传过来的商品id
- {
- $uu = $arr[$key];
- $uu['num'] = $uu['num'] - 1;
- //减1后等于0,移除该商品
- if($uu['num'] == 0 || $uu['num'] < 0){
- unset($arr[$key]);//清除该一维数组
- }else{
- $arr[$key] = $uu;
- }
-
- }
- }
- // print_r($arr);die;
- session('mycar',$arr);
-
- return redirect('/car');
- }
相关路由:
- //加入购物车
- Route::get('buy', 'index/index/buy','GET');
-
- //购物车列表
- Route::rule('car', 'index/index/car');
- //从购物车移除
- Route::get('delete', 'index/index/delete');
- //从购物车减去该商品数量1个
- Route::get('reduce', 'index/index/reduce');
以上就是在thinkphp5中实现购物车功能的全部代码,逻辑大部分写在注释里面