正文内容

这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正

项目中需要添加购物车。

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

PHP实现购物车的思路和源码分析的更多相关文章

  1. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  2. Android Debuggerd 简要介绍和源码分析(转载)

    转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...

  3. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  4. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

  5. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  6. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  7. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

  8. 自定义圆形头像CircleImageView的使用和源码分析

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0806/3268.html tools:context="com.ex ...

  9. Mybatis的缓存——一级缓存和源码分析

    目录 什么是缓存? 一级缓存 测试一. 测试二. 总结: 一级缓存源码分析: 1. 一级缓存到底是什么? 得出结论: 2. 一级缓存什么时候被创建? 3. 一级缓存的执行流程 结论: 一级缓存源码分析 ...

随机推荐

  1. Leetcode16.3Sum Closest最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

  2. JavaScript 中的多线程通信的方法

    在Html 5诞生之后,我们可以使用javascript来实现多线程处理.H5 新增了一个web workers api,使用这个API,用户可以很容易地创建在后台运行的线程,H5 中被称为workd ...

  3. mac 下的 homebrew

    如果安装了macport 就不能安装homebrew ,必须先卸载macport $ sudo port -f uninstall installed$ sudo rm -rf \/opt/local ...

  4. C#中Object转化为json对象

    比如定义一个类: public class Lines { public string X1 { get; set; } public string X2 { get; set; } public s ...

  5. php文件上传$_FILES数组格式

    <form action="" enctype="multipart/form-data" method="post"> < ...

  6. CMake学习笔记一

    #设置cmake最低版本号 CMAKE_MINIMUM_REQUIRED(VERSION ) #设置工程名称 PROJECT(HelloWorld) #设置工程包含当前目录,非必须 SET(CMAKE ...

  7. MySQL遇到经典例子--(遇到就写)

    1,一般的搜索只会搜索标题,也有特殊的情况,就是标题和内容一起搜索! -- 模糊搜索只是搜索标题 $sql = "select count(*) as sum from publish wh ...

  8. SPSS详细操作:生存资料的Cox回归分析

    SPSS详细操作:生存资料的Cox回归分析 一.问题与数据 某研究者拟观察某新药的抗肿瘤效果,将70名肺癌患者随机分为两组,分别采用该新药和常规药物进行治疗,观察两组肺癌患者的生存情况,共随访2年.研 ...

  9. SQLServer → 09:索引

    一.索引概念 用途 我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 概念 索引是一个单独的,存储在磁盘上的数据结构,它们包含则对数据表里 ...

  10. 2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记

    title author date CreateTime categories Inno Setup 安装包脚本 Run 的 Flags 标记 lindexi 2019-10-26 08:42:39 ...