本文介绍一个php实现的购物车代码,功能实现完整,具有一定的参考价值

这里我们为你提供个简单的php购物车代码,从增加购物产品与发生购买了,在商城开发中,这个功能是少不了的

具体分析如下:

对购物车里商品的操作大体上有以下几个:添加商品,删除商品,以及提交订单;

方法本质是:把session存入array,对array进行增加、删除、修改操作,array中的每一组记录都是一个商品的信息(个数,价格等);

解决购物车的思路是用session记录一个二维数组。一维代表每一个商品,二维包含了商品的id,商品的数量...等可以自行增加,反正都是二维了,自己愿意带多少个商品属性就加上去。

购物车的操作流程:首先,登录到网站中浏览商品;然后,购买指定的商品,进入购物车页面中,在该页面可以实现更改商品数量、删除商品、清空购物车、继续购物等;最后,生成订单,提交订单等操作。

详细请看强大的注释;

首先登入;

<body>
<h1>登入页面</h1>
<form action="dengrucl.php" method="post">
<div>帐号:<input type="text" name="zhang"/></div>
<div>密码:<input type="text" name="mi"/></div>
<input type="submit" value="登入"/>
</form> </body>

图:

登入处理:

<?php
session_start();
include ("db.class.php");
$db = new db();
$zhang = $_POST["zhang"];
$mi = $_POST["mi"];
$sql = "select mi from yonghu WHERE zhang = '{$zhang}'";
$arr = $db->Query($sql);
if(!empty($zhang)&&!empty($mi)&&$mi = $arr){
$_SESSION["zhang"] = $zhang;
header("location:zym.php");
}
else
{
echo "登入失败";
} ?>

很简单的一个登入,没啥说的;

他登入完了以后直接进入主页面:

<body>
<h1>长腿璇购物商城</h1>
<table border="1" cellpadding="0" cellspacing="0" width="100%" >
<tr>
<td>代号</td>
<td>水果名称</td>
<td>水果价格</td>
<td>水果产地</td>
<td>水果库存</td>
<td>操作</td>
</tr>
   <?php
session_start();
$_SESSION["zhang"] = "xiaoming";//不做登入的情况下,直接存sessiion
include ("db.class.php");
$db = new db();
$sql = "select * from sgbiao";
$arr = $db->Query($sql);
foreach ($arr as $v)
{
echo " <tr>
<td>{$v[0]}</td>
<td>{$v[1]}</td>
<td>{$v[2]}</td>
<td>{$v[3]}</td>
<td>{$v[4]}</td>
<td>
<a href='zymcl.php?ids={$v[0]}'>加入购物车</a> </td>
</tr>";
} ?>
<?php
//这里显示的是 购物车有多少产品,和产品的总价格
$ann=array();
if(!empty($_SESSION["gwc"]))
{
$ann=$_SESSION["gwc"]; }
$zhonglei = count($ann); $aa=0;
foreach($ann as $k)
{ $k[0];//水果代号
$k[1];//水果数量
$sql1="select jiage from sgbiao where ids='{$k[0]}'"; $danjia=$db->Query($sql1); foreach($danjia as $n)
{ $aa=$aa + $n[0]*$k[1];
} }
echo"数量:{$zhonglei}<br/>
价格:<mark>{$aa}元";
?>
</table>

<a href="tijiao.php">查看账户</a>
<a href="ckgwc.php">查看购物车</a> </body>

来图:

当我点击添加到购物车:

上面的数量与价格变了,说明已经加到了购物车里面;

来看一下是怎么处理的(强大的注释):

<?php
session_start();
//
$ids = $_GET["ids"];
if(empty($_SESSION["gwc"]))
{
//如果点击的购物车是空的(第一次添加) //如果购物车里是空的,造二维数组,
$arr = array(
array($ids,1)
//一维数组,取ids,第一次点击增加一个
);
$_SESSION["gwc"]=$arr;
//扔到session里面
}
else
//这里不是第一次点击
{
//先判断购物车里是否已经有了该商品,用$ids
$arr = $_SESSION["gwc"];
//把购物车的状态取出来 $chuxian = false;
//定义一个变量;用来表示是否出现,默认是未出现
foreach ($arr as $v) {
//便利他
//如果这里面有这件商品
if ($v[0] == $ids) //如果取过来的$v[0](商品的代号)等于$ids那么就证明购物车中已经有了这一件商品
{
$chuxian = true;
//如果出现,直接把chuxian改成true }
}
if($chuxian)
{
//购物车中有此商品
for($i=0;$i<count($arr);$i++)
{
if($arr[$i][0] == $ids)
{
//把点到的商品编号加1
$arr[$i][1] += 1;
}
}
$_SESSION["gwc"] = $arr; }
else
{
//这里就只剩下:购物车里有东西,但是并没有这件商品
$asg = array($ids,1);
//设一个小数组
$arr[] = $asg;
$_SESSION["gwc"]=$arr;
} }
header("location:zym.php") ?>

接下来做一下购物车的页面:

<body>
<h1>查看购物车</h1>
<table width="100%" border="1"cellspacing="0" cellpadding="0">
<tr>
<td>商品名称</td>
<td>商品单价</td>
<td>商品数量</td>
<td>操作</td>
</tr>
   <?php
session_start();
if(!empty($_SESSION["gwc"]))
{
$arr = array();
$arr = $_SESSION["gwc"];
//造数组
}
include ('db.class.php');
$db = new db();
foreach ($arr as $v)
{
global $db;
$sql = "select * from sgbiao WHERE ids = '{$v[0]}'";
$att = $db->query($sql);
foreach ($att as $a)
{
echo "<tr>
<td>{$a[1]}</td>
<td>{$a[2]}</td>
<td>{$v[1]}</td>
<td><a href='shanchu.php?ids={$a[0]}'>删除</a> </td>
</tr> ";
// 蔬果的名称
// 单价
// 取int数量
// 这个地方也可以加索引shanchu.php?sy={$v}
}
}
?>
</table>

<a href="tijiao.php">提交订单</a>
</body>

上图:

可以看到大苹果的数量是4,若是我点删除,其条件便是存在大苹果,且数量大于一,点击删除使数量减一:

白葡萄的数量是1,若我点击删除,其条件是数量不大于一,使其移除数组;

说了这些快来看看删除页面吧:

<?php
session_start();
$ids = $_GET["ids"];
$arr = $_SESSION["gwc"];
//var_dump($arr);
//取索引2(数量)
foreach ($arr as $key=>$v)
{
if($v[0]==$ids)
{
if($v[1]>1){
//要删除的数据
$arr[$key][1]-=1;
}
else{
//数量为1的情况下,移除该数组
unset($arr[$key]);
}
} } $_SESSION["gwc"] = $arr;
//记得扔到session里面
header("location:ckgwc.php");
//删除完跳转回去

高能!!

提交订单页面,我只来一个处理页面吧,小伙伴若有需要自己填链接即可:

<?php
session_start();
include ("db.class.php");
$db = new db(); //判断用余额是否满足
$zhang = $_SESSION["zhang"];
//获取到用户名
$sye = "select zhanghu from yonghu WHERE zhang = '{$zhang}'";
$ye = $db->query($sye);
$ye[0][0];//这是余额 $ann=array();
if(!empty($_SESSION["gwc"]))
{
$ann=$_SESSION["gwc"]; }
$zhonglei = count($ann); $aa=0;//总价格
foreach($ann as $k)
{ $k[0];//水果代号
$k[1];//水果数量
$sql1="select jiage from sgbiao where ids='{$k[0]}'"; $danjia=$db->Query($sql1); foreach($danjia as $n)
{ $aa=$aa + $n[0]*$k[1];
} }
//判断余额是否满足
if($ye[0][0]>=$aa)
{
//钱够,判断库存 foreach($ann as $v)
{
$skc = "select sgname,kucun from sgbiao WHERE ids='{$v[0]}'";
//水果代号$v[0]
$akc = $db->query($skc);
$akc[0][1];//库存
//比较是否满足库存
if($akc[0][1]<$v[1])
{
echo "{$akc[0][0]}库存不足";
//退出
exit;
} }
//提交订单:
//i. 从用户账户中扣除本次购买的总价格
//ii. 从商品库存中扣除本次每种商品的购买数量
//iii. 向订单表和订单内容表中加入本次购买的商品信息
//扣除账户余额
$skcye = "update yonghu set zhanghu = zhanghu-{$aa} WHERE zhang = '{$zhang}'";
$db->query($skcye,0);
//扣除库存
foreach($ann as $v)
{
$skckc = "update sgbiao set kucun = kucun-{$v[1]} WHERE ids='{$v[0]}'";
//水果代号$v[0]
$db->query($skckc,0);
}
//添加订单信息
//取当前时间
$time = time();
//自动生成订单号
$ddh = date("YmdHis");
$sdd = "insert into dingdan VALUES ('{$ddh}','$zhang','$time')";
$db->query($sdd,0);
//添加订单内容
foreach ($ann as $v)
{
$sddxq = "insert into ddneirong VALUES ('','$ddh','{$v[0]}','{$v[1]}')";
$db->query($sddxq,0);
} }
else
{
echo "钱不够";
exit;
}

如此一来,购物车大体上的功能都已实现;

来看看点击提交订单后的效果:

1.减少水果库存:

2.添加订单:

3.添加订单内容:

4.扣除购买人的账户余额:

以上便是购物车内容

php写购物车(思路&源码)的更多相关文章

  1. 手写Koa.js源码

    用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...

  2. 手写@koa/router源码

    上一篇文章我们讲了Koa的基本架构,可以看到Koa的基本架构只有中间件内核,并没有其他功能,路由功能也没有.要实现路由功能我们必须引入第三方中间件,本文要讲的路由中间件是@koa/router,这个中 ...

  3. C写的扫描器源码

    Title:C写的扫描器源码 --2010-10-27 20:02 无意间看见的一个源代码,弄回来读下. ----------------------------------------------- ...

  4. 手写Express.js源码

    上一篇文章我们讲了怎么用Node.js原生API来写一个web服务器,虽然代码比较丑,但是基本功能还是有的.但是一般我们不会直接用原生API来写,而是借助框架来做,比如本文要讲的Express.通过上 ...

  5. windows内存体系结构 内存查询,读,写(附录源码)

    “进程内存管理器”这个程序实现的最基本功能也就是对内存的读写,之前的两篇文章也就是做的一个铺垫,介绍了内核模式切换和IoDeviceControl函数进行的应用程序与驱动程序通信的问题.接下来就进入正 ...

  6. 淘宝网购物车jquery源码和网易新用户注册页面表单验证的练习

    淘宝网购物车源码: <html lang="en"> <head> <meta charset="UTF-8"> <t ...

  7. 学习写简单Spring源码demo

    最近在研究怎么实现简单的Spring的源码,通过注解的方式来实现对bean的加载管理. 首先先来看下我的工程结构: (1)spring-common:定义了常用的枚举常量,工具类(如FileUtils ...

  8. HDFS dfsclient写文件过程 源码分析

    HDFS写入文件的重要概念 HDFS一个文件由多个block构成.HDFS在进行block读写的时候是以packet(默认每个packet为64K)为单位进行的.每一个packet由若干个chunk( ...

  9. 使用dom4j写xml文件——源码

    1 dom4j下载与配置 1.1 dom4j下载 请移步下载链接 1.2 maven依赖 <dependency> <groupId>org.dom4j</groupId ...

随机推荐

  1. PHP新手之学习数组声明

    数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式.这些按序排列的同类数据元素的集合称为数组.下面介绍PHP中的数组声明. 一.数组的概述 1.数组的本质:管理 ...

  2. RadioGroup

    获取选中的Text radioGroup1.Properties.Items[radioGroup1.SelectedIndex].Description

  3. 递归求和1到n

    一般的方法 #include<stdio.h> int sum(int n){ if(n==1) return 1; else return n+sum(n-1);} int main(v ...

  4. HDU-4861-Couple doubi(数学题,难懂!难懂!)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4861 这个题只能说没弄懂,感觉很难,看博客也看不懂,只能,多看几次,看能不能有所突破了. 代码的话只有 ...

  5. js观察者模式与Model

    目的 观察者模式是常见的设计模式,可以被应用到MV*框架的Model上,来实现对数据变化的监听. 基本概念 观察者模式是一种常见的设计模式.被观察者可以被订阅(subscribe),并在状态发生改变时 ...

  6. 第五组UI组件:ProgressBar及其子类

    ProgressBar组件也是一组重要的组件,ProgressBar本身代表了进度条组件,它还派生了两个常用的组件:SeekBar和RatingBar.ProgressBar及其子类在用上十分相似,只 ...

  7. 动软模板系列二(Model层模板)

    动软模板其实和CodeSmith的模板差不多 实现的原理是一样的,但是CodeSmith貌似只支持表生成,而且不够“国人化”,所以打算研究下动软的模板,如果熟练掌握后想必以后开发项目效率可以提高很多了 ...

  8. 无限“递归”的python程序

    如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n): if n <= 2: return 1 else: return ...

  9. JS如何实现点击页面其他地方隐藏菜单?

    方法一: $("#a").on("click", function(e){  $("#menu").show();    $(documen ...

  10. [html]关于html标签的一些总结

    以下内容纯属个人对项目细节的总结,因为只是为了自己回顾方便,所以比较杂乱. 1.img 如果不指定img的高度和宽度,则img显示的是原图片的大小:如果只指定了高度和宽度中的一者,则为指定的一者等比例 ...