-
COOKIE
HTTP很重要的一个特点就是无状态,如果单纯希望通过我们的服务端去记住每一个访问者是不可能的,所以必须借助一些手段来让服务器记住客户端,这种手段就是Cookie
Cookie就像是在超市买东西拿到的小票,由超市(服务器)发给消费者(客户端),超市不需要记住消费者的脸,但是他们认识消费者手里的小票(Cookie),可以通过小票知道消费者之间的一些消费信息(在服务端产生的数据)
Cookie的一个案例-猜数字
<?php
//判断游戏开始的条件,如果cookie为空,则生成一个cookie
if (empty($_COOKIE['num'])) {
//生成一个1-100的随机数
$num = rand(0,100);
//将这个数以cookie的方式储存到本地
setcookie('num',$num);
}else {
//每执行一次else就相当于提交了一次
$count = empty($_COOKIE['count']) ? 0 : (int)$_COOKIE['count'];
if ($count < 10) {
//在游戏中cookie和用户提交的数字进行对比
$result = (int)$_GET['num']-(int)$_COOKIE['num'];
if ($result == 0) {
echo "猜对了";
setcookie('num');
setcookie('count');
}elseif ($result > 0) {
echo "太大了";
}elseif ($result < 0) {
echo "太小了";
}
setcookie('count',$count +1);
}else {
echo "太low了";
setcookie('num');
setcookie('count');
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>猜数字</title>
<style>
body {
padding: 100px 0;
background-color: #2b3b49;
color: #fff;
text-align: center;
font-size: 2.5em;
}
input {
padding: 5px 20px;
height: 50px;
background-color: #3b4b59;
border: 1px solid #c0c0c0;
box-sizing: border-box;
color: #fff;
font-size: 20px;
}
button {
padding: 5px 20px;
height: 50px;
font-size: 16px;
}
</style>
</head>
<body>
<h1>猜数字游戏</h1>
<p>Hi,我已经准备了一个0~100的数字,你需要在仅有的10机会之内猜对它。</p>
<?php if (isset($message)): ?>
<p><?php echo $message; ?></p>
<?php endif ?>
<form action="index1.php" method="get">
<input type="number" min="0" max="100" name="num" placeholder="随便猜">
<button type="submit">试一试</button>
</form>
</body>
</html>
-
Session
由于Cookie是服务端下发给客户端由客户端本地保存的。换而言之客户端可以在本地对其随意操作,包括删除和修改。如果客户端随意伪造一个Cookie的话,对于服务端是无法辨别的,就会造成服务端被蒙蔽,构成安全隐患。
于是有了另外一种基于Cookie基础之上的手段:Session
Session区别于Cookie一个很大的地方就是Session把数据存在了服务端,而给到客户端本地的只是一把‘钥匙’,伪造一把可以用的钥匙,可能性是极地的,所以不需要在意
下面是基于Session的猜数字案例
<?php
session_start();
//判断游戏开始的条件,如果session为空,则生成一个session
if (empty($_SESSION['num']) || empty($_SESSION['count'])) {
//生成一个1-100的随机数
$num = rand(0,100);
//存在本地不安全,存在服务端的箱子里
$_SESSION['num'] = $num;
}else {
//每执行一次else就相当于提交了一次
$count = empty($_SESSION['count']) ? 0 : (int)$_SESSION['count'];
if ($count < 10) {
//在游戏中cookie和用户提交的数字进行对比
$result = (int)$_GET['num']-$_SESSION['num'];
if ($result == 0) {
echo "猜对了";
unset($_SESSION['num']);
unset($_SESSION['num']);
}elseif ($result > 0) {
echo "太大了";
}elseif ($result < 0) {
echo "太小了";
}
$_SESSION['count'] = $count +1;
}else {
echo "太low了";
unset($_SESSION['num']);
unset($_SESSION['num']);
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>猜数字</title>
<style>
body {
padding: 100px 0;
background-color: #2b3b49;
color: #fff;
text-align: center;
font-size: 2.5em;
}
input {
padding: 5px 20px;
height: 50px;
background-color: #3b4b59;
border: 1px solid #c0c0c0;
box-sizing: border-box;
color: #fff;
font-size: 20px;
}
button {
padding: 5px 20px;
height: 50px;
font-size: 16px;
}
</style>
</head>
<body>
<h1>猜数字游戏</h1>
<p>Hi,我已经准备了一个0~100的数字,你需要在仅有的10机会之内猜对它。</p>
<?php if (isset($message)): ?>
<p><?php echo $message; ?></p>
<?php endif ?>
<form action="index1.php" method="get">
<input type="number" min="0" max="100" name="num" placeholder="随便猜">
<button type="submit">试一试</button>
</form>
</body>
</html>
-
基于数据库的增删改案例
1、index页面
通过与数据库的连接拿到一些储存在服务端的数据(假数据)
<?php
//连接数据库
$conn = mysqli_connect('127.0.0.1','root','123','demo');
if (!$conn) {
exit('<h1>数据库连接失败</h1>');
}
//查询
$query = mysqli_query($conn,'select * from users;');
if (!$query) {
exit('<h1>查询失败</h1>');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XXX管理系统</title>
<link rel="stylesheet" href="assets/css/bootstrap.css">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
<nav class="navbar navbar-expand navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">XXX管理系统</a>
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.html">用户管理</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">商品管理</a>
</li>
</ul>
</nav>
<main class="container">
<h1 class="heading">用户管理 <a class="btn btn-link btn-sm" href="add.php">添加</a></h1>
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>头像</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th class="text-center" width="140">操作</th>
</tr>
</thead>
<tbody>
<?php while ( $item = mysqli_fetch_assoc($query)):?>
<tr>
<th scope="row"><?php echo $item['id'] ?></th>
<td><img src="<?php echo $item['avatar']; ?>" class="rounded" alt="<?php echo $item['name'] ?>"></td>
<td><?php echo $item['name'] ?></td>
<td><?php echo $item['gender'] == 0 ? '♀':'♂'; ?></td>
<td><?php echo $item['birthday'] ?></td>
<td class="text-center">
<a class="btn btn-info btn-sm" href="edit.php?id= <?php echo $item['id'] ?>">编辑</a>
<a class="btn btn-danger btn-sm" href="delete.php?id= <?php echo $item['id'] ?>">删除</a>
</td>
</tr>
<?php endwhile ?>
</tbody>
</table>
<ul class="pagination justify-content-center">
<li class="page-item"><a class="page-link" href="#">«</a></li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">»</a></li>
</ul>
</main>
</body>
</html>
2、add页面
添加页面,通过数据库把用户添加的信息传到服务端进行解析,呈现到网页上
<?php
function add(){
//1.验证非空
if (empty($_POST['name'])) {
$GLOBALS['error_message'] = '请输入姓名';
return;
}
if (!(isset($_POST['gender']) && $_POST['gender'] !== '-1')) {
$GLOBALS['error_message'] = '请选择性别';
return;
}
if (empty($_POST['birthday'])) {
$GLOBALS['error_message'] = '请输入生日';
return;
}
//2.取值
$name = $_POST['name'];
$gender = $_POST['gender'];
$birthday = $_POST['birthday'];
//3.接收文件并验证
if (empty($_FILES['avatar'])) {
$GLOBALS['error_message'] = '上传文件失败';
return;
}
$files = $_FILES['avatar'];
if ($files['error'] !== UPLOAD_ERR_OK) {
$GLOBALS['error_message'] = '请上传文件';
return;
}
$ect = pathinfo($files['name'],PATHINFO_EXTENSION);
$target = '../upload/'. uniqid() . '.' . $ect;
if (!move_uploaded_file($files['tmp_name'], $target)) {
$GLOBALS['error_message'] = '上传文件失败';
return;
}
//4.保存
$avatar = substr($target, 2);
//连接数据库
$conn = mysqli_connect('127.0.0.1','root','123','demo');
if (!$conn) {
exit('<h1>数据库连接失败</h1>');
}
//增加
$query = mysqli_query($conn,"insert into users values(null,'{$avatar}','{$name}',$gender,'$birthday');");
if (!$query) {
exit('<h1>查询数据失败</h1>');
}
$rows = mysqli_affected_rows($conn);
if ($rows !== 1) {
exit('<h1>增加失败</h1>');
}
//5.响应
header('Location:index.php');
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
add();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XXX管理系统</title>
<link rel="stylesheet" href="assets/css/bootstrap.css">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
<nav class="navbar navbar-expand navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">XXX管理系统</a>
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.html">用户管理</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">商品管理</a>
</li>
</ul>
</nav>
<main class="container">
<h1 class="heading">添加用户</h1>
<?php if (isset($error_message)): ?>
<div class="alert alert-warning">
<?php echo $error_message ?>
</div>
<?php endif ?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method = 'post' enctype = 'multipart/form-data' autocomplete='Off'>
<div class="form-group">
<label for="avatar">头像</label>
<input type="file" class="form-control" id="avatar" name="avatar">
</div>
<div class="form-group">
<label for="name">姓名</label>
<input type="text" class="form-control" id="name" name="name">
</div>
<div class="form-group">
<label for="gender">性别</label>
<select class="form-control" id="gender" name="gender">
<option value="-1">请选择性别</option>
<option value="1">男</option>
<option value="0">女</option>
</select>
</div>
<div class="form-group">
<label for="birthday">生日</label>
<input type="date" class="form-control" id="birthday" name="birthday">
</div>
<button class="btn btn-primary">保存</button>
</form>
</main>
</body>
</html>
3、删除页面
通过执行PHP代码把数据库中想要删除的那一条删掉
<?php
//获取到要删除的数据
if (empty($_GET['id'])) {
exit('<h1>请正确删除</h1>');
}
$id = $_GET['id'];
//连接数据库
$conn = mysqli_connect('127.0.0.1','root','123','demo');
if (!$conn) {
exit('<h1>数据库连接失败</h1>');
}
//删除
$query = mysqli_query($conn,'delete from users where id = ' . $id . ';');
if (!$query) {
exit('<h1>查询数据失败</h1>');
}
$rows = mysqli_affected_rows($conn);
if ($rows <=0) {
exit('<h1>删除失败</h1>');
}
header('Location:index.php');
4、编辑页面
通过PHP代码修改数据库中想要修改的那一条数据
<?php
//获取到要编辑的数据
if (empty($_GET['id'])) {
exit('<h1>请正确选择</h1>');
}
$id = $_GET['id'];
//连接数据库
$conn = mysqli_connect('127.0.0.1','root','123','demo');
if (!$conn) {
exit('<h1>数据库连接失败</h1>');
}
//查询
$query = mysqli_query($conn,"select * from users where id = {$id} limit 1;");
if (!$query) {
exit('<h1>查询数据失败</h1>');
}
$users = mysqli_fetch_assoc($query);
if (!$users) {
exit('<h1>找不到你要编辑的数据</h1>');
}
function edit(){
global $users;
//1.验证非空
if (empty($_POST['name'])) {
$GLOBALS['error_message'] = '请输入姓名';
return;
}
if (!(isset($_POST['gender']) && $_POST['gender'] !== '-1')) {
$GLOBALS['error_message'] = '请选择性别';
return;
}
if (empty($_POST['birthday'])) {
$GLOBALS['error_message'] = '请输入生日';
return;
}
//2.取值
$users['name'] = $_POST['name'];
$users['gender'] = $_POST['gender'];
$users['birthday'] = $_POST['birthday'];
//var_dump($users);
//检验是否提交了新头像
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] == UPLOAD_ERR_OK) {
$ect = pathinfo($_FILES['avatar']['name'],PATHINFO_EXTENSION);
$target = '../upload/'. uniqid() . '.' . $ect;
if (!move_uploaded_file($_FILES['avatar']['tmp_name'], $target)) {
$GLOBALS['error_message'] = '上传文件失败';
return;
}
//4.保存
$users['avatar'] = substr($target, 2);
}
$conn = mysqli_connect('127.0.0.1','root','123','demo');
if (!$conn) {
exit('<h1>数据库连接失败</h1>');
}
//查询
$query = mysqli_query($conn,"update users set name = '{$users['name']}',avatar='{$users['avatar']}',gender = {$users['gender']},birthday = '{$users['birthday']}' where id = {$users['id']};");
if (!$query) {
exit('<h1>查询数据失败</h1>');
}
$user = mysqli_affected_rows($conn);
if ($user < 0) {
exit('<h1>更新失败</h1>');
}
header('Location:index.php');
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
edit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XXX管理系统</title>
<link rel="stylesheet" href="assets/css/bootstrap.css">
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
<nav class="navbar navbar-expand navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">XXX管理系统</a>
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="index.html">用户管理</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">商品管理</a>
</li>
</ul>
</nav>
<main class="container">
<h1 class="heading">编辑"<?php echo $users['name'] ?>"</h1>
<?php if (isset($error_message)): ?>
<div class="alert alert-warning">
<?php echo $error_message ?>
</div>
<?php endif ?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>?id=<?php echo $users['id'] ?>" method = 'post' enctype = 'multipart/form-data' autocomplete='Off'>
<img src="<?php echo $users['avatar'] ?>"" alt="">
<div class="form-group">
<label for="avatar">头像</label>
<input type="file" class="form-control" id="avatar" name="avatar">
</div>
<div class="form-group">
<label for="name">姓名</label>
<input type="text" class="form-control" id="name" name="name" value="<?php echo $users['name'] ?>">
</div>
<div class="form-group">
<label for="gender">性别</label>
<select class="form-control" id="gender" name="gender">
<option value="-1">请选择性别</option>
<option value="1"<?php echo $users['gender'] === '1' ? ' selected':''; ?>>男</option>
<option value="0"<?php echo $users['gender'] === '0' ? ' selected':''; ?>>女</option>
</select>
</div>
<div class="form-group">
<label for="birthday">生日</label>
<input type="date" class="form-control" id="birthday" name="birthday" value="<?php echo $users['birthday'] ?>">
</div>
<button class="btn btn-primary">保存</button>
</form>
</main>
</body>
</html>