PHP實現購物車的思路和源碼分析

這裏主要是記錄下自己的購物車的思路,具體功能實現,但是尚未在實際項目中用到,不對之處歡迎指正

項目中需要添加購物車。

https://mp.weixin.qq.com/s/VyO1U4R24_8rJ5cHpSOwbw

目錄說明
buy.php     點擊購買之後的操作
car.php     購物車,顯示購買的東西
conn.php    數據庫連接參數
delete.php  刪除商品
index.php   入口文件
shop.sql    數據庫sql文件
test.png    商品圖片

 

首先需要理解的是,購物車操作是SESSION的原理

一個物品加進去是一個數組,存ID NAME NUM

那麼兩個物品就是二維數組,所以用二維數組來操作就可以了。

1.創建數據庫shop,導入shop.sql。這是我們的產品

2.修改conn中的鏈接數據庫密碼

3.仔細閱讀源碼

3.1 點擊購買之後轉到buy.php中

3.2.0 判斷購物車的SESSION是否是數組,是則購物車有物品[產品ID是數組的KEY]

3.2.1 判斷傳遞的ID在購物車的SESSION是否存在,不存在就添加進去,數量默認爲1[產品ID是數組的KEY]

3.2.2 判斷傳遞的ID在購物車的SESSION是否存在,存在就把數量+1[產品ID是數組的KEY]

3.2.3 判斷購物車的SESSION是否是數組,不是則直接存入SESSION[產品ID是數組的KEY]

3.3 添加完成後轉到car.php,循環展示出購買的東西

3.4 點擊不想購買的商品,刪除delete.php,刪除對應SESSION下key對應的ID值即可

index.php


 

<?php
include ("conn.php");//引入數據配置
$sql="select * from produce";//查詢所有商品
$rs=mysql_query($sql,$conn);//執行sql語句,得到一個結果集
while($row=mysql_fetch_array($rs))//遍歷結果集
{
?>
<table width="343" height="152" border="1" style="float:left">
  <tr>
   <td width="124" rowspan="3"><img src="<?php echo $row['pimg']?>" width="123" height="121" border="0"/></td>
   <td width="203" height="35">貨物名稱:<?php echo $row["name"]?></td>
  </tr>
  <tr>
   <td height="28">貨物價格:<?php echo $row["price"]?></td>
  </tr>
  <tr>
   <td height="27"align="center"><a href="buy.php?id=<?php echo $row["id"]?>&pname=<?php echo $row["name"]?>">購買</a></td>
 </tr>
</table>
<?php
}
?>

 

buy.php


 

<?php
session_start();//使用session之前一定要將session開啓
ob_start();//要清空緩存就必須ob_start()
$pid=$_GET["id"];//得到購買物品的id
$name=$_GET["pname"];//得到購買物品的名字
$arr=$_SESSION["mycar"];//將session中的變量取出來
//下面先判斷這個變量是否是數組,可以得到以前是否買過東西
if(is_array($arr))
{
//如果是數組,說明以前買過東西
//如果買過東西又分兩種情況:
     if(array_key_exists($pid,$arr))
     {
     //1、array_key_exists($pid,$arr)判斷$arr中是否存在鍵值爲$pid的一個一維數組,如果存在的話,就說明此商品以前購買過,只需要把數量加1
          $uu=$arr[$pid]; //從二維數組裏拿出對應的一維數組,該一維數組包括id name num 三個值
          $uu["num"]=$uu["num"]+1;  //改變數量,將數量加1
          $arr[$pid]=$uu; //改完後再將此一維數組放回二維數組中
     }
     else
     {   //2.此商品第一次購買,就將得到的id和name值組成一個一維數組
          $arr[$pid]=array("pid"=>$pid,"name"=>$name,"num"=>1);
     }
}
else
{
//還沒有買過東西
$arr[$pid]=array("pid"=>$pid,"name"=>$name,"num"=>1);
}
$_SESSION["mycar"]=$arr;//購買完後,將此數組重新放入session中,便可以在各個頁面看到此session
ob_clean();//清空緩存
header("location:car.php");//跳轉到購物車界面(car.php)
//var_dump($_SESSION);
?>

 

car.php


 

<?php
session_start();//啓用session
$arr=$_SESSION["mycar"];//從session中拿出二維數組
?>
將數組裏的數據即客戶所購買的物品展示出來
<table width="600" height="37"border="1">
  <tr>
   <td width="96">商品ID</td>
   <td width="158">商品名稱</td>
   <td width="154">商品數量</td>
   <td width="177">刪除</td>
  </tr>
<?php
foreach($arr as $a)//遍歷這個二維數組
{
?>
     <tr>
     <td width="96"><?php echo $a["pid"]?></td>//物品的id
   <td width="158"><?php echo $a["name"]?></td>//物品的名稱
   <td width="154"><?php echo $a["num"]?></td>//物品的數量
   <td width="177"><a href="delete.php?id=<?php echo $a['pid']?>">刪除</a></td>//點擊刪除超鏈接到”delete.php”,將物品的id傳過去
</tr>
<?php
}
?>
</table>
<a href="index.php">返回繼續購物</a>

 

conn.php


 

<?php
 $conn=mysql_connect("localhost","root","root");//連接數據庫服務器
 mysql_select_db("shop",$conn);//選擇數據庫
 mysql_query("set names utf8");//設置連接數據庫編碼
?>

 

delete.php


 

<?php
session_start();//啓動session
ob_start();//清空緩存必須啓動的項
$pid=$_GET["id"];//得到通過get方式傳過來的id
$arr=$_SESSION["mycar"];//拿出session裏的二維數組
foreach($arr as$key=>$proId)//遍歷該二維數組中的鍵值,這裏也就是商品的id
{
     if($key==$pid)//判斷鍵值等於傳過來的商品id
     {
          unset($arr[$key]);//清除該一維數組
     }
}
$_SESSION["mycar"]=$arr;//將清除之後的二維數組重新放到session裏
ob_clean();//清除緩存
header("location:car.php");//跳轉到購物車
?>

 

shop.sql


 

/*
Navicat MySQL Data Transfer
Source Server         : 127.0.0.1
Source Server Version : 50536
Source Host           : localhost:3306
Source Database       : shop
Target Server Type    : MYSQL
Target Server Version : 50536
File Encoding         : 65001
Date: 2016-04-25 09:35:18
*/
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');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章