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

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

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

本系列校训

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

本项目使用技术

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

环境

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

上效果图

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

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 所以需要登陆!

phpStudy 设置

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

在这里插入图片描述

导数据库

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

在这里插入图片描述

项目目录如图:

在这里插入图片描述

颜色插件:Material_Theme 参考《没有颜值插件的编辑器是没有灵魂的–【idea-theme插件】

代码部分:

主页

<?php
session_start(); // 启动会话
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>网上书城系统</title>

</head>
<body>
<?php
include 'HeaderNav.php'; // 包含页头与导航页
?>
<!-- 内容区的元素 -->
<?php
// 显示图书的类别
// 引用数据库连接文件
require_once 'Conn.php';
// 设置字符集,避免中文乱码
$db->query("SET NAMES utf8");
// 定义SQL语句,按学号查询信息
$sql = "SELECT categoryid,NAME,descn,Image FROM category;";
// 执行查询
$result = $db->query($sql);
// 查询到记录,返回查询结果并用表格显示
if ($result->num_rows >= 1) {
    echo "<div id=\"main\">";
    echo "<table width=80% align=center>";
    // 获取数据
    // <a href="http://www.w3school.com.cn">W3School</a>
    $i = 0;
    while ($row = $result->fetch_assoc()) {
        $temp = "<td align=center><a href=\"Products.php?cateid=" . $row["categoryid"] . "\"><img src='Images\\" . $row['Image'] . "' height=150px width=100px></a><br/>" . $row["NAME"] . "</td>";
        // 按照每行四列排列
        $i ++;
        if (($i - 1) % 4 == 0) {
            // 第一列
            echo "<tr>" . $temp;
        } elseif ($i % 4 == 0) {
            // 第四列
            echo $temp . "</tr>";
        } else {
            // 第二三列
            echo $temp;
        }
    }
    echo "</table>";
    echo "</div>";
} // 没有查询到记录
else {
    echo "<div style='color:red;margin-top:50px;'>没有查到书籍类别内容!</div>";
}
// 释放结果集
$result->close();
// 关闭连接
$db->close();
?>

<?php
include 'Footer.html'; // 包含页脚页
?>
</body>
</html>

登陆

<?php 
//用户单击“登录”按钮返回页面,判断登录是否成功
if(isset($_POST["btnSubmit"])){
    //登录
    $userName=$_POST["userName"];    //用户输入的用户名
    $pwd=$_POST["pwd"];    //用户输入的密码
    
    //引用数据库连接文件
    require_once 'Conn.php';
    //定义SQL语句
    $sql = "SELECT * FROM account WHERE username='$userName' AND Password='$pwd'";
    //执行查询
    $result = $db->query($sql);
    //登录成功    
    if ($result->num_rows>=1){
        //使用Session保存登录的用户名信息
        session_start();   //启动会话
        $_SESSION['userName']=$_POST["userName"];  
                
        //使用Cookie保存登录的用户名信息,保存30天
        setcookie("userName",$_POST["userName"], time()+60*60*24*30);
        
        //默认返回的页面为主页
        $backUrl="Index.php";
        //若页面接收到了“frompage”参数传值,登录成功后跳转到“frompage”参数传递的网页文件地址
        if(isset($_GET["frompage"])){
            $backUrl=$_GET["frompage"].'.php';
        } 
        //页面跳转
        echo "<script>window.location='{$backUrl}'</script>";
    }
    //登录失败,弹出提示框
    else{
        echo "<script>window.alert('用户名或密码错误!')</script>";
    }
}
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<style type="text/css">
#login{
    width:300px;
    border:1px solid blue;
    line-height:40px;
    margin:0 auto;
    padding-left:50px;
    padding-top:15px;
    padding-bottom:15px;
    text-align:left;
    font-size:14px;
}
.error{
    color:red;
}
</style>
</head>
<body>
<?php 
include 'HeaderNav.php';  //包含页头与导航页

//$actionUrl变量为登录form表单的action的URL地址,设置为登录页面自身
$actionUrl=$_SERVER['PHP_SELF'];   
//如果页面接收到了URL的“frompage”参数传值,form表单的action的URL地址继续传递该参数
if(isset($_GET["frompage"])){
    $actionUrl=$actionUrl.'?frompage='.$_GET["frompage"];
}  
?>

<h1>用户登录</h1>
<form action="<?=$actionUrl?>" method="post" enctype="multipart/form-data">
<div id="login">
	<div>
		 用户名:<input type="text" name="userName"
		 <?php
		 //如果读取到了Cookie保存的用户名信息,显示在文本框中
		 if (isset($_COOKIE["userName"]))
		     echo " value='".$_COOKIE["userName"]."'";
		 ?>
		 /><span class="error">*</span>
	</div>
	<div>
		密码:<input type="password" name="pwd"/><span class="error">*</span>
	</div>
	<div style="margin-left:85px;">
		<input type="submit" name="btnSubmit" value="登录"/>
	</div>
</div>
</form>

<script type="text/javascript">
var elform = document.getElementsByTagName("form")[0]; //获取表单
elform.onsubmit=function(){ 
	//表单提交,调用checkData()函数验证数据,如果验证出错,中止表单提交
	return checkData(); 
}
//验证各项用户输入的数据
function checkData(){
	var valid=true;  //验证是否通过的标识
	//用户名必填
	var eluserName=document.getElementsByName("userName")[0];  //获取用户名文本框
    if(eluserName.value==""){
    	eluserName.nextSibling.innerHTML="*用户名必填!";	//用户名文本框右侧的文字标签显示提示信息
		valid=false;  //验证错误
    }
    else{
    	eluserName.nextSibling.innerHTML="*";  //清除错误提示信息
    }

	//密码必填
	var elPwd=document.getElementsByName("pwd")[0];  //获取密码文本框
	if(elPwd.value==""){
		elPwd.nextSibling.innerHTML="*密码必填!";	
		valid=false;        
    }
	else{
		elPwd.nextSibling.innerHTML="*";
    }
 
	return valid;  //返回验证结果
}  
</script>

<?php 
include 'Footer.html';   //包含页脚页
?>
</body>
</html>

后台关键逻辑代码:

<?php
session_start(); // 启动会话
                 // 如果未登录,没有设置Session变量“userName”,跳转到登录页
if (! isset($_SESSION['userName'])) {
    header('Location:Login.php');
}
?>
<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8">
<title>购物车</title>
<script type="text/javascript">
//捕获文本框失去焦点事件
function updateQuantity(productid)
{
	document.getElementById("txt_p"+productid).value=document.getElementById("txt_p"+productid).value.replace(/[^0-9-]+/,'');
	window.location.href="ShoppingCart.php?productid="+productid+"&count="+document.getElementById("txt_p"+productid).value;
}
//捕获回车事件
function quantityUp(productid)
{
	if(window.event.keyCode == 13){ 
		document.getElementById("txt_p"+productid).value=document.getElementById("txt_p"+productid).value.replace(/[^0-9-]+/,'');
		window.location.href="ShoppingCart.php?productid="+productid+"&count="+document.getElementById("txt_p"+productid).value;
	}
}
</script>

</head>
<body>
<?php
include 'HeaderNav.php'; // 包含页头与导航页
?>
<!-- 内容区的元素 -->
<?php
// 显示购物车
// 如果有删除标志,则删除购物车中的该书籍,
// 如果有数量更新标志,则更新购物车中该书籍的数量
// 先读取用户的购物车内容,再判断用户选购的书籍是否已经在购物车中,如果已经在购物车中,数量加1,
// 如果不在购物车中,加入购物车,更新数据库,并显示购物车中的内容。
// 引用数据库连接文件
require_once 'Conn.php';
// 设置字符集,避免中文乱码
$db->query("SET NAMES utf8");
// 书籍id
$productid = $_GET['productid'];
// 删除标志
$del = $_GET['del'];
// 数量更新标志
$count = $_GET['count'];

// 先判断删除标志
if (isset($del)) {
    $sql = "delete from cart where username = '" . $_SESSION['userName'] . "' and productid = '" . $productid . "'";
    $result = $db->query($sql);
} else {
    // 判断数量更新标志
    if (isset($count)) {
        $sql = "update cart set quantity = " . $count . " where username = '" . $_SESSION['userName'] . "' and productid = '" . $productid . "'";
        $result = $db->query($sql);
    } else {
        // 定义SQL语句,查询用户购物车中是否已经存在该书籍
        $sql = "select count(*) c from cart where username = '" . $_SESSION['userName'] . "' and productid = '" . $productid . "'";
        // 执行查询
        $result = $db->query($sql);
        $row = $result->fetch_assoc();
        $totalNumber = $row["c"];
        if ($totalNumber > 0) {
            // 购物车已经有这个书籍了,将数据库中该记录的数量加一
            $sql = "update cart set quantity = quantity +1 where  username = '" . $_SESSION['userName'] . "' and productid = '" . $productid . "'";
        } else {
            // 购物车中没有这个书籍,将该数据插入数据库中去
            // INSERT INTO cart (username,productid,NAME,listprice,quantity) (SELECT 'aaa','1',NAME,listprice,1 FROM product WHERE productid = '1');
            $sql = "insert into cart (username,productid,name,listprice,quantity) (select '" . $_SESSION['userName'];
            $sql = $sql . "','" . $productid . "',NAME,listprice,1 FROM product WHERE productid = '" . $productid . "');";
        }
        // echo $sql;
        // 更新数据库
        $result = $db->query($sql);
    }
}
// 重新查询数据库中的购物车记录,返回查询结果并用表格显示
$sql = "select productid,name,quantity,listprice from cart where username = '" . $_SESSION['userName'] . "'";
$result = $db->query($sql);
$sql = "SELECT SUM(listprice*quantity) s FROM cart WHERE username = '" . $_SESSION['userName'] . "'";
$result2 = $db->query($sql);
$row2 = $result2->fetch_assoc();
if ($result->num_rows >= 1) {
    echo "<div id=\"main\">";
    echo "<table class='tb' width=100%><tr><th>书籍名称</th><th>数量</th><th>单价</th><th>删除</th></tr>";
    // 获取数据
    while ($row = $result->fetch_assoc()) {
        echo "<tr><td>" . $row["name"] . "</td><td>";
        echo "<input type=\"text\" id=\"txt_p" . $row["productid"] . "\" value=" . $row["quantity"];
        echo " οnblur=\"updateQuantity(" . $row["productid"] . ")\" ";
        echo " onKeyUp=\"quantityUp(" . $row["productid"] . ")\" ";
        echo "/>";
        echo "</td><td>" . $row["listprice"] . "</td><td><a href = \"ShoppingCart.php?del=1&productid=" . $row["productid"] . "\">删除</a></td></tr>";
    }
    echo "<tr><th></th><th>总价:</th><th>" . $row2["s"] . "</th><th></th></tr>";
    echo "</table>";
    
    echo "<li><a href=\"Index.php\"> 继续选购</a></li>";
    echo "<li><a href=\"CheckOut.php\"> 结算</a></li>";
    
    echo "</div>";
}
// 计算总价

// 释放结果集
$result->close();
$result2->close();
// 关闭连接
$db->close();

?>

<?php
include 'Footer.html'; // 包含页脚页
?>
</body>
</html>

将上面的代码整理成流程图,即:
在这里插入图片描述

配套资源

PHP登陆-购物车的实现–【白嫖项目】
https://download.csdn.net/download/dearmite/88224192

作业:

PHP,美化前台页面

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

项目花园范德彪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值