php mysql购物车实现原理_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

include ("conn.php");//引入数据配置

$sql="select * from produce";//查询所有商品

$rs=mysql_query($sql,$conn);//执行sql语句,得到一个结果集

while($row=mysql_fetch_array($rs))//遍历结果集

{

?>

<?php%20echo%20%24row%5B'pimg'%5D?>货物名称:<?php echo $row["name"]?>
货物价格:<?php echo $row["price"]?>
&pname=<?php echo $row["name"]?>">购买

}

?>

buy.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

session_start();//启用session

$arr=$_SESSION["mycar"];//从session中拿出二维数组

?>

将数组里的数据即客户所购买的物品展示出来

商品ID商品名称商品数量删除

foreach($arr as $a)//遍历这个二维数组

{

?>

<?php echo $a["pid"]?>//物品的id<?php echo $a["name"]?>//物品的名称<?php echo $a["num"]?>//物品的数量删除//点击删除超链接到”delete.php”,将物品的id传过去

}

?>

返回继续购物

conn.php

$conn=mysql_connect("localhost","root","root");//连接数据库服务器

mysql_select_db("shop",$conn);//选择数据库

mysql_query("set names utf8");//设置连接数据库编码

?>

delete.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');

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 文件目录_Java——文件及目录File操作

packagefile;importjava.io.File;/*** 删除文件和目录**/public classDeleteFileUtil {/*** 删除文件&#xff0c;可以是文件或文件夹**paramfileName* 要删除的文件名*return删除成功返回true&#xff0c;否则返回false*/public static booleandelete(String fileName) {File …

java 对象池 实现_Java对象池技术的原理及其实现

看到一片有关于java 对象基础知识&#xff0c;故转载一下&#xff0c;同时学习一下。摘 要 本文在分析对象池技术基本原理的基础上&#xff0c;给出了对象池技术的两种实现方式。还指出了使用对象池技术时所应注意的问题。关键词 对象池&#xff1b;对象池技术&#xff1b;Java…

java heap 参数_java heap space解决方法和JVM参数设置

因为程序要从数据读取近10W行记录处理&#xff0c;当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误。在网上一查可能是JAVA的堆栈设置太小的原因。跟据网上的答案大致有这两种解决方法&#xff1a;1、设置环境变量set JAVA_OPTS -Xms32m -Xmx512…

java 进程崩溃_java程序崩溃自启脚本

java程序崩溃自启脚本教程1.将java程序崩溃自启脚本下载下来,放入项目的同级目录,将proc_name"xxx.jar" 更改成对应的名称2.chmod 777 文件 给于权限3.将想要jar程序停止 执行./test.sh 如果出现-bash: ./practice1.sh: /bin/bash^M: bad interpreter: No such file…

java程序流程控制_java程序流程控制

顺序结构分支结构(条件结构)循环结构控制循环结构顺序结构&#xff1a;如果代码里没有流程控制&#xff0c;程序是至上而下一行一行执行的&#xff0c;一条语句执行完之后继续执行下一条语句&#xff0c;直到程序的最后。if语句:基本语法:if(表达式){方法体}else if(表达式){方…

java调用c视频接口_JAVA本地调用(JNI- java调用c)

记录一下工作内容&#xff0c;对术语了解不多&#xff0c;暂且这样记着吧。java调用c一、写jni的步骤如下&#xff1a;1.创建java类&#xff0c;定义接口函数&#xff0c;使用native修饰&#xff1b;2.将java类编译成class&#xff1b;3.将class编译成*.h头文件&#xff1b;4.在…

java 随机 数字 字母组合_java生成随机数字和字母组合

import java.util.Random;public String getCharAndNumr(int length){String val "";Random random new Random();for(int i 0; i < length; i){String charOrNum random.nextInt(2) % 2 0 ? "char" : "num"; // 输出字母还是数字if(&q…

java 声明抽象方法_java – 类必须声明为abstract或实现抽象方法错误

这是我的代码,假设在按下按钮时更改一些文本&#xff1a; –public class MyActivity extends ActionBarActivity {TextView txtview;Button butto;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.…

java socket 线程池_java socket编程的一个例子(线程池)

服务器程序EchoServer.java&#xff1b;import java.io.*;import java.net.*;import java.util.concurrent.*;public class EchoServer {private int port10000;private ServerSocket serverSocket;private ExecutorService executor;//线程池private final int pool_size4;pri…

java是值传递还是引用传递_Java 到底是值传递还是引用传递?

点赞、收藏还挺多&#xff0c;求一波关注------------------------------------------------------------没人邀请&#xff0c;自己强行回答一波。关于这个问题&#xff0c;引发过很多广泛的讨论&#xff0c;看来很多程序员对于这个问题的理解都不尽相同&#xff0c;甚至很多人…

java趣事_【趣事】Java程序员最年轻,C++程序员最年老

原标题&#xff1a;【趣事】Java程序员最年轻&#xff0c;C程序员最年老说起我们对编程世界现有的刻板印象&#xff0c;你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家&#xff0c;等等这样的话。为了分析这些刻板印象背后的真相&#xff0c;Trestle Technology的…

koa2 mysql 中间件_Koa2 和 Express 中间件对比

koa2 中间件koa2的中间件是通过 async await 实现的&#xff0c;中间件执行顺序是“洋葱圈”模型。中间件之间通过next函数联系,当一个中间件调用 next() 后&#xff0c;会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一…

mysql 索引 内存_mysql索引【第三篇】

##innodb引擎的数据是按页为单位的&#xff0c;当需要读一条记录时&#xff0c;并不是将这个记录本身从磁盘中读取出来&#xff0c;而是以页为单位将整个页读取到内存中&#xff0c;每个页默认大小为16kb数据查询过程&#xff1a; 磁盘---->内存---->返回结果数据更新过…

python notebook配置_使用 Jupyter Notebook 配置 Stata\Python\Julia\R

作者&#xff1a;许梦洁 (中山大学)E-mail: xumj9mail2.sysu.edu.cn原文链接&#xff1a;磐石若水 → 使用 Jupyter Notebook 配置 Stata/Python/Julia/RStata 连享会   课程主页 || 直播视频 || 知乎推文扫码查看连享会最新专题、公开课视频和 100 多个码云计量仓库链接。早在…

qt 飞扬青云_Qt编写带频谱的音乐播放器

之前有个项目需要将音频文件的频谱显示出来&#xff0c;想了很多办法&#xff0c;后面发现fmod这个好东西&#xff0c;还是跨平台的&#xff0c;就一个头文件一个库文件就行&#xff0c;简单小巧功能强大&#xff0c;人家做的真牛逼。为了不卡住界面&#xff0c;采用了多线程处…

java什么是工作流程_springmvc工作流程是什么

springmvc工作流程是什么&#xff1a;1、springmvc工作原理图2、springmvc工作流程1、 用户向服务端发送一次请求&#xff0c;这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知&#…

java se入门_java SE 入门之运算符(第三篇)

在 java 中主要有以上运算符&#xff0c;分为 赋值运算符 &#xff0c;算术运算符、关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符).我们一起来学习下吧&#xff01;一、赋值运算符赋值运算符主要有五个、分别是 (赋值)、(加上一个在赋值)、-(减去一个在赋值)、*…

java 封闭实例_不能访问类型…的封闭实例

出于教育目的&#xff0c;我尝试制作一个服务器和一个客户端&#xff0c;其中服务器从多个客户端接收数据并回显每条消息。问题是&#xff0c;当我尝试让服务器一次将回显发送到所有客户端时。public class SocketServer {ArrayList ts new ArrayList();ServerSocket serv;sta…

java接口权限管理在哪里_JAVA-访问权限控制

以前对于public、private、protect、default&#xff0c;都只是简单的知道其对应的访问权限范围&#xff0c;现在看了think in java中的描述&#xff0c;讲了这几种访问权限在什么场景下使用&#xff0c;觉得进一步的了解的它存在的意义和合理性。因为在我们的日常开发中&#…

java 重写session_使用Shiro重写Session 自定义SESSION

引入shiro的jar包1.2.3org.apache.shiroshiro-core${shiroVersion}org.apache.shiroshiro-web${shiroVersion}org.apache.shiroshiro-ehcache${shiroVersion}org.apache.shiroshiro-spring${shiroVersion}配置shiro(web.xml)shiroFilterorg.springframework.web.filter.Delegat…