强撸项目系列总目录在000集
本系列校训
用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干!
只要自己有电脑,前后项目都能搞!N年苦学无人问,一朝成名天下知!
本项目使用技术
PHP无类 | PHP类写法 | ThinkPHP框架 | 其它框架 |
---|---|---|---|
* |
环境
PHP版本 | mysql版本 | 运行工具 | 编辑工具 |
---|---|---|---|
5.4.45+Apache | 5.5(phpstudy自带) | phpstudy2018 | phpstorm2018 |
上效果图
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,美化前台页面