PHP实现购物车的思路和源码分析

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,这个图自己随便找一个测试。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113071.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springcloud微服务搭建_域名301重定向教程

    springcloud微服务搭建_域名301重定向教程前言1.由于我只有一台nginx服务器,那么想要实现一个服务器的多个网站的搭建,在html目录下建立多个文件夹,并用url转发使得不同的二级域名指向html文件夹下的不同子文件夹,这样做便能做到“多个网站”的效果。2.url转发也能够使得一个网站拥有几个域名比如wikipedia.com和wikipedia.net都指向了wikipedia.org。当你访问wikipedia.com或wikipedia.net的时候,跳转出来的页面是wikipedia.org的页面3.重定向是带有状态码的响应,我

    2022年10月19日
    5
  • 基于机器学习的文本分类算法的研究[通俗易懂]

    基于机器学习的文本分类算法的研究[通俗易懂]1.简述文本分类的方法属于有监督的学习方法,分类过程包括文本预处理、特征抽取、降维、分类和模型评价。本文首先研究了文本分类的背景,中文分词算法。然后是对各种各样的特征抽取进行研究,包括词项频率-逆文档频率和word2vec,降维方法有主成分分析法和潜在索引分析,最后是对分类算法进行研究,包括朴素贝叶斯的多变量贝努利模型和多项式模型,支持向量机和深度学习方法。深度学习方法包括多层感知机,卷积神…

    2022年6月8日
    41
  • 香农编码的matlab实现实验总结_香农编码C语言

    香农编码的matlab实现实验总结_香农编码C语言中南大学《信息论与编码》实验报告题目信源编码实验指导教师学院专业班级姓名学号日期目录一、香农编码…………………………………………..3实验目的………………………………………………………………………3实验要求……………..

    2025年10月18日
    0
  • 【leetcode】23. Merge k Sorted Lists

    【leetcode】23. Merge k Sorted Lists

    2021年6月10日
    119
  • SecureCRT中文乱码解决方法(6)

    SecureCRT中文乱码解决方法(6)1、重新查看会话,是否中文显示正常2、依然无法正常显示中文,可能是由于Linux系统中默认的字符编码非UTF8所致用root用户登录。输入cat/etc/sysconfig/i18n如果安装系统为中文系统,则修改【LANG=“zh_CN.UTF-8”】如果安装系统为英文系统,则修改【LANG=“en_US.UTF-8”】保存文件。断开SSH,重新登录。就正常了下面是修改…

    2022年7月17日
    20
  • navict15激活码【在线注册码/序列号/破解码】

    navict15激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号