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


正文內容

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

項目中需要添加購物車。

目錄說明
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');

 

 

 

test.png,這個圖自己隨便找一個測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM