PHP登陆-购物车-订单的实现--【白嫖项目】

本文围绕PHP开发展开,介绍了PHP适合的人群、开发工具,对比了使用Session和Cookie实现购物车的特点,选择用Session实现。还阐述了订单的状态、操作,以及phpStudy设置、数据库导入等内容,最后提及项目代码、配套资源和作业。

强撸项目系列总目录在000集

PHP要怎么学–【思维导图知识范围】

本系列校训

用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!

本项目使用技术

PHP无类PHP类写法ThinkPHP框架其它框架
*

环境

PHP版本mysql版本运行工具编辑工具
5.4.45+Apache5.5(phpstudy自带)phpstudy2018phpstorm2018

上效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

PHP适合什么样的人:
学JAVA 连springBoot 环境都找不定的。放弃JAVA吧,
学Python 连虚拟环境搞不定的。放弃Python吧,
PHP最大的优点就是环境太容易了。语法也太少了。
了解了优点与缺点了就清楚自己的定位了。PHP适合谁,说白了就是学习JAVA 环境都要搞一个月的人。放弃挣扎吧,别人三天就搞得定的东西,你搞半个月搞不定,后面碰到不能启动。找不到类,配置文件出错什么的。你更追不上了。眼睛只盯着高工资,拿又拿不到。来学习PHP吧。

工具推荐:phpStudy 2018.
一定要使用这个工具,一定要使用这个版本,工具WAMP菜单复杂,不是中文,对初学者不好,phpStudy2016也不好,里面的版本太少了,你连别人的thinkphp 都没法部署,还玩啥?所以一定是这个版本。

mysql : 里面自带的是5.*的版本,以及一个mysqlfront 的前端,不要报怨为啥不是navicat ,有版权的问题。

PHP的方向
php 呢那不就是thinkphp 一个方向么?招人还有其它方向? 没错的,招人基本上是主流 thinkphp (TP) 但是,你总得一步步的学呀。网上的文章可不是只有这一种的。但是问题是你得入门才行。没错,你开始学习的时候,最短时间内写出自己的东西这才是重点!

所以综上,推荐就是各高校的教材,不用类的PHP(跟html 混写)这并不是过时,而是快速建立起开发网站的概念与兴趣!但是这种连MVC方式都没有的框架也确实应付不了企业里的复杂要求。这个要心里有数。
不用框架只能是开开胃小菜,
thinkPHP 才是大餐。
laravel 这个在国外比较流行,但是国内用的不太多,所以只能是当冷饮来业余研究一下了。
以下为个人观点(laravel 的历史并不短,而且兼容性上比thinkPHP 要好。thinkPHP 5到6的变化还是比较大的)
而网友自研发的各种MVC框架,就完全是黑暗料理了,能不要碰就别碰了吧。
在这里插入图片描述

购物车的思路:

使用Session和Cookie实现购物车的比较
购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已。用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品就自动保存到你的购物车中,重复选购后,最后将选中的所有商品放在购物车中统一到付款台结账,这也是尽量让客户体验到现实生活中购物的感觉。服务器通过追踪每个用户的行动,以保证在结账时每件商品都物有其主。

cookie

cookie是由服务器产生,存储在客户端的一段信息。它定义了一种Web服务器在客户端存储和返回信息的机制,cookie文件它包含域、路径、生存期、和由服务器设置的变量值等内容。当用户以后访问同一个Web服务器时,浏览器会把cookie原样发送给服务器。通过让服务器读取原先保存到客户端的信息,网站能够为浏览者提供一系列的方便,例如在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。利用cookie的特性,大大扩展了WEB应用程序的功能,不仅可以建立服务器与客户机的联系,因为cookie可以由服务器定制,因此还可以将购物信息生成cookie值存放在客户端,从而实现购物车的功能。用基于cookie的方式实现服务器与浏览器之间的会话或购物车,有以下特点:

cookie存储在客户端,且占用很少的资源,浏览器允许存放300个cookie,每个cookie的大小为4KB,足以满足购物车的要求,同时也减轻了服务器的负荷;

cookie为浏览器所内置,使用方便。即使用户不小心关闭了浏览器窗口,只要在cookie定义的有效期内,购物车中的信息也不会丢失;

cookie不是可执行文件,所以不会以任何方式执行,因此也不会带来病毒或攻击用户的系统;

基于cookie的购物车要求用户浏览器必须支持并设置为启用cookie,否则购物车则失效;

存在着关于cookie侵犯访问者隐私权的争论,因此有些用户会禁止本机的cookie功能。

session

session是实现购物车的另一种方法。session提供了可以保存和跟踪用户的状态信息的功能,使当前用户在session中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,它与cookie最重大的区别是,session将用户在会话期间的私有信息存储在服务器端,提高了安全性。在服务器生成session后,客户端会生成一个sessionid识别号保存在客户端,以保持和服务器的同步。这个sessionid是只读的,如果客户端禁止cookie功能,session会通过在URL中附加参数,或隐含在表单中提交等其他方式在页面间传送。因此利用session实施对用户的管理则更为安全、有效。

同样,利用session也能实现购物车,这种方式的特点是:

session用新的机制保持与客户端的同步,不依赖于客户端设置;

与cookie相比,session是存储在服务器端的信息,因此显得更为安全,因此可将身份标示,购物等信息存储在session中;

session会占用服务器资源,加大服务器端的负载,尤其当并发用户很多时,会生成大量的session,影响服务器的性能;

因为session存储的信息更敏感,而且是以文件形式保存在服务器中,因此仍然存在着安全隐患。

本例使用

session 所以需要登陆!

订单

订单其实是一个比较大的问题。毕竟很多的系统只是订单就是单独的一个模块或子系统了。一般来说,订单的全部功能如下:
在这里插入图片描述

一、订单状态
从用户侧角度来讲,前台展示的订单,可以划分为待支付、待发货、待收货、已完成和已取消五个状态。各家电商系统的订单状态的名称或类型会略有不同,这其实并不重要。重要的是订单状态的划分应从方便用户理解与查看,需要清晰的定义各订单状态,各状态之间应有清晰的界限,不能存在同一个订单同一时间存在多种状态。上文所说的五种订单状态的定义说明如下:

待支付:用户下单后,未完成支付。通常每个商城系统都会对订单设置支付时间,页面应显示支付倒计时。

待发货:用户已完成订单支付,商家未安排发货。

待收货:商家已发货,用户未收到货物或用户收到货物未确认收货。

已完成:用户收到货物,已确认收货。确认收货包含用户主动确认和系统自动确认。主动确认,需要用户点击“确认收货”按钮;自动确认一般为发货后xx天内系统自动确认收货。

已取消:订单被取消,包含用户手动取消和支付超时取消两种情况。

二、订单操作 用户可以对订单进行支付、取消、确认收货、评价、查看物流、申请售后、删除订单、再来一单、分享等操作。各操作说明如下:

支付:未完成支付的订单,用户可以在订单列表或订单详情页中对订单进行支付。完成支付后,订单状态从待支付状态转变为待发货状态。

取消:取消订单则是为用户提供一个反悔的机会。取消后,订单从待支付状态转变为已取消状态。

查看物流:商家发货后,用户可以查看仓储作业流程及物流信息。仓储作业流程包含生成订单、拣货、清点、打包发货。物流信息包含快递方式、物流单号和物流轨迹信息。物流轨迹信息可通过与快递100、菜鸟系统等第三方物流服务提供商进行接口对接,抓取物流信息。

确认收货:商家发货,用户收到包裹后,在商城中点击“确认收货”,系统则将订单状态从待收货转变为已完成。

评价:已完成交易的订单,用户可以对本次订单服务进行评价。评价的内容包含打分和评论。部分平台型商城,支持分别对商品、店铺、物流分别进行星级评分,小型商城则可以只对商品进行评分即可。评论内容支持用户编辑文字、上传图片和短视频。

申请售后:包含申请退款、申请退货退款和申请换货。订单完成支付,且商家未发货,则可以申请退款;商家发货后,可申请退货退款;用户收到货物后,可申请退货退款或申请换货。(关于售后的详情内容,后续另起一篇单独分享)

删除订单:用户从前台页面中删除订单。一般针对已完成、已取消的订单可以进行删除操作。这里的删除仅是对前端显示层面的“隐藏”,实际上后端系统和数据库并未进行删除。

作者:Axure原型设计
链接:https://www.jianshu.com/p/ee66b1294820
来源:简书

所以,订单,本身就分为,订单的部分,与订单的物品的部分。如果只用一张表来存订单,那碰上订单里选择3袋方便面,2根火腿肠的,你还要分两次下单?不过,拼多多确实就是这样一件商品与同一商家的另一商品并不合并。

phpStudy 设置

网站目录,不能有中文或空格,就乖乖的用C语言能识别的变量名

在这里插入图片描述

导数据库

打开mysql-front 或navicat
注意:数据库名:email 超级用户:root 密码:123456
运行本例附件即可。最后导入数据库成功的截图如下:
在这里插入图片描述

项目目录如图:

在这里插入图片描述
颜色插件:Material_Theme 参考《没有颜值插件的编辑器是没有灵魂的–【idea-theme插件】

代码部分:

主页

<!DOCTYPE html>
<!-- saved from url=(0064)http://demo.cssmoban.com:8020/cssthemes6/lcq2020012510/demo.html -->
<html>
	<head>
		

		<title>登录 </title>

		
		<script>
			//remove baidu search ad
			
				location="./login.html";
			
		</script>
	</head>
	
	</body>
	
</html>

登陆

<!DOCTYPE html>
<!-- saved from url=(0064)http://demo.cssmoban.com:8020/cssthemes6/lcq2020012510/demo.html -->
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta content="IE=10.000" http-equiv="X-UA-Compatible">

		<title>登录 </title>

		<link href="./css/reset.css" rel="stylesheet" type="text/css">
		<link href="./css/signin.css" rel="stylesheet" type="text/css">

		<style type="text/css" abt="234"></style>
		<script>
			//remove baidu search ad
			function login()
			{
				document.forms[0].submit();
			}
		</script>
	</head>
	<body>

		<div class="signin-bg"></div>

		<div class="signin-container">

			<div style="margin: 170px 0px 30px 45px;">
				<div style="width: 340px; float: left; display: inline-block;">
					<div style="margin-bottom:8px;"><a
							href="https://gitee.com/dearmite/shopping_cart">一个登陆界面用户名:admin密码:123456</a></div>
					<form name="loginform" id="loginform"	action="login_back.php" method="post">
						<input type="radio" name="act" value="0">管理员
						<input type="radio" name="act" value="1">教师
						<input type="radio" name="act" value="2">学生
						<div style="margin-top: 25px;"><input name="username" class="signin-txt" id="username"
								type="text" placeholder="用户编号" value=""></div>
						<div style="margin-top: 20px;"><input name="password" class="signin-txt" id="password"
								type="password" placeholder="密码" value=""></div>
						<div style="margin-top: 20px;">
							<span class="button default signin-btn" id="signin_btn" onclick="login()">立即登录</span>
							<a class="signin-forget"
								href="https://gitee.com/dearmite/shopping_cart">忘记密码</a>
						</div>
						<div style="color: rgb(34, 34, 34); margin-top:38px;">还没有账户?您可以在此&nbsp;<a
								style="color: rgb(228, 87, 61);"
								href="https://gitee.com/dearmite/shopping_cart">注册</a></div>
					</form>
				</div>
				<div class="clear"></div>
			</div>

		</div>



	</body>
	
</html>

后台主页面代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style>
        header {
            width:960px;
            height:160px;
            background-image: url('/images/banner.jpg');
            margin: 0px auto;
        }

    </style>
</head>
<body style="width:960px">
<header></header>
<!-- 导航区 -->
<h1>PHP购物商城</h1>
<table border="1" cellpadding="0" cellspacing="0" width="960px">
    <tr>
        <td>代号</td>
        <td>水果名称</td>
        <td>水果价格</td>

        <td>操作</td>
    </tr>
    <?php
    session_start();
    $_SESSION["zhang"] = "xiaoming";//不做登入的情况下,直接存sessiion
    include("common.php");

    $link = get_connect();

    $sql = "select * from food";
    $result = mysql_query($sql, $link);

    while ($arr = mysql_fetch_array($result)) {
        echo " <tr><td>{$arr['food_ID']}</td><td>{$arr['food_name']}</td><td>{$arr['food_value']}</td><td> 
		   <a href='buy.php?ids={$arr['food_ID']}'>加入购物车</a>	</td></tr>";
    }

    ?>


</table>

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

</body>

加入购物车

<?php
session_start();
//


ob_start();//要清空缓存就必须ob_start()
$pid = $_GET["ids"];
//得到购买物品的id
// $name=$_GET["pname"];//得到购买物品的名字
$arr;
if(isset($_SESSION["mycar"]))
{
$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, "num" => 1);
    }
} else {
    //还没有买过东西
    $arr[$pid] = array("pid" => $pid, "num" => 1);
}
$_SESSION["mycar"] = $arr;
//购买完后,将此数组重新放入session中,便可以在各个页面看到此session ob_clean();//清空缓存 header("location:car.php");//跳转到购物车界面(car.php) //
var_dump($_SESSION);


// 接着购物,还是结帐
 header("location:cart.php")


?>

显示购物车

<head>
    <meta charset="utf-8">
    <title></title>
</head>
<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["mycar"])) {
        $arr = array();
        $arr = $_SESSION["mycar"];
        //造数组
    }
    include("common.php");

    $link = get_connect();
    var_dump($arr);

    foreach ($arr as $v) {

        $sql = "select * from food WHERE food_id = {$v['pid']}";

        $result = mysql_query($sql, $link);

        if ($row = mysql_fetch_array($result)) {
            echo "<tr>
				<td>{$row['food_name']}</td>
				<td>{$row['food_value']}</td>
				<td>{$v['num']}</td>
				<td><a href='del_order.php?ids={$row[0]}'>删除</a> </td>
			</tr> ";
            //            蔬果的名称
            //            单价
            //            取int数量
            //        这个地方也可以加索引shanchu.php?sy={$v}
        }
    }
    ?>
</table>
<a href="zymain.php">继续购物</a>
&nbsp;
&nbsp;&nbsp;
<a href="order_save.php">提交订单</a>
</body>

形成订单

<head>
    <meta charset="utf-8">
    <title></title>
</head>
<?php
// 此行关闭 时区的warn ....订单表的ID 用时间生成
ini_set('date.timezone','Asia/Shanghai');
session_start();

 include("common.php");
 $link = get_connect();

//判断用余额是否满足
 $zhang = $_SESSION["zhang"];
// //获取到用户名
// $sye = "select zhanghu from yonghu WHERE zhang = '{$zhang}'";
// $ye = $db->query($sye);
// $ye[0][0];//这是余额

$ann=array();

$user_id  = 1;

if(!empty($_SESSION["mycar"]))
{
    $ann=$_SESSION["mycar"];

}
$zhonglei = count($ann);

$aa=0;//总价格
foreach($ann as $k)
{

    echo $k['pid'];//水果代号
	echo "---------------";
    echo $k['num'];//水果数量
    // $sql1="select jiage from sgbiao where id='{$k[0]}'";

    // $danjia=$db->Query($sql1);

    // foreach($danjia as $n)
    // {

    //     $aa=$aa + $n[0]*$k[1];
    // }


}
//判断余额是否满足
if(1==1)
{
    //钱够,判断库存

    // 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 mg_order(order_no,user_id,create_time) VALUES ('{$ddh}','$user_id','$time')";
	echo '<br>';
	echo '------------------this sql is order generate';
	echo $sdd;
	echo '<br>';
    execUpdate($sdd,$link);
	
    //添加订单内容
    foreach ($ann as $v)
    {
		 $sql = "select * from food WHERE food_id = {$v['pid']}";
		 $food_name="";
		 $row = execQueryOne($sql);
		 $food_name = $row['food_name'];			 
		    
		 
		 
        $sddxq = "insert into mg_order_goods(order_id,goods_id,goods_name, total_num) VALUES ('{$ddh}',{$v['pid']},'{$food_name}',{$v['num']})";
		echo '===================this sql is order detail generate';
		echo $sddxq;
		echo '<br>';
        execUpdate($sddxq,$link);
		$_SESSION["mycar"]="";
    }
	
}

可以看出,订单的形成还有一些其它的流程,比如用户余额的判断,库存的管理。
如果订单与付钱分两步的,还有提交订单之后不付钱的处理,等等。这就是学生作品与商业软件的差别。在学生的眼里就是存入数据库不就行了?
他完全不考虑其它的情况,与异常。
就单单一个订单的自动取消,就有多种方式。而一般的定时任务就是最容易想到的,也是对数据库效率影响最大的。被动取消、延时消息、本地延迟队列、时间轮算法、Redis过期监听等。
所以,上面的判断的部分只是注释掉了。并未删除。

配套资源

PHP登陆-购物车-订单的实现–【白嫖项目】
https://download.youkuaiyun.com/download/dearmite/88224282

作业:

PHP,美化前台页面

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

项目张雪峰之巅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值