使用cookie验证用户登录
database.php
<?php //将配置信息 封装成数组 return[ 'type'=>'mysql', 'host'=>'127.0.0.1', 'dbname'=>'music', 'username'=>'root', 'password'=>'root', ]; ?>
connect.php
<?php $db=require 'database.php'; $dns="{$db['type']}:host={$db['host']};dbname={$db['dbname']}"; $username=$db['username']; $password=$db['password']; $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"); try{ $pdo=new PDO($dns,$username,$password,$opt); // var_dump($pdo); //可以打印pdo对象 有对象就说明成功了 }catch(PDOException $e){ die('连接失败'.$e->getMessage()); }
以上2个是公用文件 cookie验证 和session验证用户登录案例都使用了以上2个数据库链接配置文件。
==========================
index.php 首页
<?php //1 已登录显示用户信息 和退出按钮 if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') { echo "用户 :{$_COOKIE['username']} 已登录<br> "; echo "<a href='dispatch.php?action=logout'>用户退出</a>"; } else { echo "<a href='dispatch.php?action=login'>请登录</a>"; }
点击 "运行实例" 按钮查看在线实例
dispatch.php 派发器 (不管啥事找我 我告诉你该找谁办)
<?php //请求派发器 前端控制器 //功能就是获取到用户的请求,并调用不同的脚本进行处理和响应 //连接数据库 require __DIR__.'/inc/connect.php'; //获取请求参数 如果$action 未设置没传参 就指定一个默认值login $action=isset($_GET['action'])?$_GET['action']:'login'; //为了安全进行参数处理 reim清除参数2边空格 strtolower 转全部小写 htmlentities将把字符转换为 HTML 实体字符 $action=htmlentities(strtolower(trim($action))); //请求派发器 switch($action){ case 'login': //加载表单 require __DIR__.'/login.php'; break; case 'check': //验证登录 require __DIR__.'/check.php'; break; case 'logout': //退出登录 require __DIR__.'/logout.php'; break; default: //出现未知参数 或者请求 php代码方式跳转到首页 header('location:index.php'); }
点击 "运行实例" 按钮查看在线实例
login.php 登录(你是谁 先亮出是否 来填写身份表格 没身份你就在我首页逛逛)
<?php //防止用户重复登录 if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') { echo "<script>alert('请勿重复登录');location.assign('index.php');</script>"; }; ?> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>用户登录</title> </head> <body> <h3>用户登录</h3> <form action="dispatch.php?action=check" method="post" onsubmit="return isEmpty();"> <p> <label for="email">邮箱</label>: <input type="email" name="email" id="email" value=""/> </p> <p> <label for="password">密码</label>: <input type="password" name="password" id="password" value=""/> </p> <!--<button>登录</button>--> <input type="submit" id="" name="登录" /> </form> <script type="text/javascript"> function isEmpty () { var email=document.getElementById('email').value; var password=document.getElementById('password').value; if (email.length===0) { alert('邮箱或密码不能为空!'); return false; }; }; </script> </body> </html>
点击 "运行实例" 按钮查看在线实例
check.php (等会 让我在档案里看看有你没 数据库查询核对下。)
<?php //检测 是否存在get传参 email进来 返回布尔值 // var_dump(filter_has_var(INPUT_GET,'email')); //检测 是否存在post传参 email进来 返回布尔值 // var_dump(filter_has_var(INPUT_POST,'email')); //1 判断用户请求类型是否是 post方式 if ($_SERVER['REQUEST_METHOD'] === 'POST') { //2 获取表单数据 $email = isset($_POST['email']) ? $_POST['email'] : null; $password = isset($_POST['password']) ? sha1($_POST['password']) : null; //3 进行数据库查询验证 代码应该放到if 判断变量是否为null要不要执行 $sql = 'SELECT * FROM `user` WHERE `email` = :email AND `password` = :password LIMIT 1'; $stmt = $pdo->prepare($sql); $stmt->execute(["email"=>$email,"password"=>$password]);//执行sql语句查询 // $stmt->debugDumpParams(); //查看预处理语句 非最终执行语句 $user=$stmt->fetch(PDO::FETCH_ASSOC); //拿到一条结果赋值给 $user //$user 会是一个布尔值 未查找到数据是false 查找到数据会是一个数组 //4 判断验证结果 if($user===false){ //验证失败 echo "<script>alert('验证失败');history.back();</script>"; die; }else{ //验证成功 //把用户信息写入到cookie setcookie('username',$user['username']); echo "<script>alert('登录成功');location.assign('index.php');</script>"; exit; }; } else { die('请求类型错误!'); }
点击 "运行实例" 按钮查看在线实例
logout.php 退出离开 (我走了 你后面有啥事别记在我头上)
<?php //判断是否已登录用户 if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') { //登录用户 进行退出操作 setcookie('username','',time()-3600); echo "<script>alert('退出成功');location.assign('index.php');</script>"; } else { //未登录用户 提示让先登录 echo "<script>alert('请先登录');location.assign('index.php');</script>"; } ?>
点击 "运行实例" 按钮查看在线实例
注意:cookie 不可以单独用来做登录安全验证 有严重安全问题。 建议配合session来验证比较安全。
============================一下就是 session登录验证案例
inc目录 数据库链接2个文件前面已经展示 这里不在重复发了。
index.php
<?php session_name('websss'); session_start(); //1 已登录显示用户信息 和退出按钮 if (isset($_SESSION['username']) && isset($_SESSION['email'])) { echo "用户 :{$_SESSION['username']} 已登录<br> "; echo "<a href='dispatch.php?action=logout'>用户退出</a>"; } else { echo "<a href='dispatch.php?action=login'>请登录</a>"; }
点击 "运行实例" 按钮查看在线实例
dispatch.php
<?php //请求派发器 前端控制器 //功能就是获取到用户的请求,并调用不同的脚本进行处理和响应 //连接数据库 require __DIR__.'/inc/connect.php'; //获取请求参数 如果$action 未设置没传参 就指定一个默认值login $action=isset($_GET['action'])?$_GET['action']:'login'; //为了安全进行参数处理 reim清除参数2边空格 strtolower 转全部小写 htmlentities将把字符转换为 HTML 实体字符 $action=htmlentities(strtolower(trim($action))); //请求派发器 switch($action){ case 'login': //加载表单 require __DIR__.'/login.php'; break; case 'check': //验证登录 require __DIR__.'/check.php'; break; case 'logout': //退出登录 require __DIR__.'/logout.php'; break; default: //出现未知参数 或者请求 php代码方式跳转到首页 header('location:index.php'); }
点击 "运行实例" 按钮查看在线实例
login.php
<?php session_name('websss'); session_start(); //防止用户重复登录 if (isset($_SESSION['username']) && isset($_SESSION['email'])) { echo "<script>alert('请勿重复登录');location.assign('index.php');</script>"; }; ?> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>用户登录</title> </head> <body> <h3>用户登录</h3> <form action="dispatch.php?action=check" method="post" onsubmit="return isEmpty();"> <p> <label for="email">邮箱</label>: <input type="email" name="email" id="email" value=""/> </p> <p> <label for="password">密码</label>: <input type="password" name="password" id="password" value=""/> </p> <!--<button>登录</button>--> <input type="submit" id="" name="登录" /> </form> <script type="text/javascript"> function isEmpty () { var email=document.getElementById('email').value; var password=document.getElementById('password').value; if (email.length===0) { alert('邮箱或密码不能为空!'); return false; }; }; </script> </body> </html>
点击 "运行实例" 按钮查看在线实例
check.php
<?php session_name('websss'); session_start(); //检测 是否存在get传参 email进来 返回布尔值 // var_dump(filter_has_var(INPUT_GET,'email')); //检测 是否存在post传参 email进来 返回布尔值 // var_dump(filter_has_var(INPUT_POST,'email')); //1 判断用户请求类型是否是 post方式 if ($_SERVER['REQUEST_METHOD'] === 'POST') { //2 获取表单数据 $email = isset($_POST['email']) ? $_POST['email'] : null; $password = isset($_POST['password']) ? sha1($_POST['password']) : null; //3 进行数据库查询验证 代码应该放到if 判断变量是否为null要不要执行 $sql = 'SELECT * FROM `user` WHERE `email` = :email AND `password` = :password LIMIT 1'; $stmt = $pdo->prepare($sql); $stmt->execute(["email"=>$email,"password"=>$password]);//执行sql语句查询 // $stmt->debugDumpParams(); //查看预处理语句 非最终执行语句 $user=$stmt->fetch(PDO::FETCH_ASSOC); //拿到一条结果赋值给 $user //$user 会是一个布尔值 未查找到数据是false 查找到数据会是一个数组 //4 判断验证结果 if($user===false){ //验证失败 echo "<script>alert('验证失败');history.back();</script>"; die; }else{ //验证成功 //把用户信息写入到session $_SESSION['username']=$user['username']; $_SESSION['email']=$user['email']; echo "<script>alert('登录成功');location.assign('index.php');</script>"; exit; }; } else { die('请求类型错误!'); }
点击 "运行实例" 按钮查看在线实例
logout.php
<?php session_name('websss'); session_start(); //判断是否已登录用户 if (isset($_SESSION['username']) && isset($_SESSION['email'])) { //登录用户 进行退出操作 //清除内存中session变量 session_unset(); //删除服务器上session文件 session_destroy(); //删除session 没有意义因为只要绘画开启状态 再刷新一次会在次写入session!!! // setcookie("websss", "Mr Zhu you forgot domain ", time() - 3600, "/"); echo "<script>alert('退出成功');location.assign('index.php');</script>"; } else { //未登录用户 提示让先登录 echo "<script>alert('请先登录');location.assign('index.php');</script>"; } ?>
点击 "运行实例" 按钮查看在线实例