php登陆验证会话机制/以cookie为例

本文深入探讨PHP的会话机制,包括cookie的工作原理及如何解决HTTP无状态问题。通过实例展示数据库配置与连接过程,使用PDO进行数据库操作。同时,提供登陆验证的实战案例,涵盖前端控制器、验证页面与首页的实现细节。
摘要由CSDN通过智能技术生成

1.会话机制

cookie

  • http协议的无状态问题
  • 服务器对用户访问的跟踪手段
  • $_COOKIE :超全局变量数组
  • setcookie() :设置客户端cookie
  • 常用操作:创建/读取/更新/删除

思维导图
在这里插入图片描述

2.数据库配置/连接

数据库信息

  • 项目根目录命名为domo ,子目录inc用来存储数据库文件
  • demo/inc/database.php 数据库信息配置文件
<?php
return [
		'type' => 'mysql',		//数据库类型
		'host' => '127.0.0.1',	//数据库主机名
		'dbname' => 'php',		//数据库名
		'username' => 'root',	//数据库账号
		'password' => 'root'	//数据库密码
	];

连接数据库

  • demo/inc/connect.php 数据库连接文件
<?php
// 连接数据库: PDO

//require加载detabase.php 数据库信息配置文件,用变量$db接收返回的数据
$db = require 'database.php';

//$dsn = '数据库的类型:host=数据库主机名;dbname=默认数据库名称';
$dsn = "{$db['type']}:host={$db['host']};dbname={$db['dbname']}";
$username = $db['username'];
$password = $db['password'];
//try是异常处理,将要执行的代码放入try块中,如果这些代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示。
//任何调用 可能抛出异常的方法的代码都应该使用try语句,Catch语句用来处理可能抛出的异常。
try {
    $pdo = new PDO($dsn, $username, $password);
//    var_dump($pdo);
} catch (PDOException $e) {
    die('连接失败' . $e->getMessage());
}

3.登陆验证会话实战

前端控制器
demo/dispatch.php

<?php

// 请求派发器:前端控制器
// 功能就是获取到用户的请求,共调用不同的脚本进行处理和响应

// require加载数据库
require __DIR__ . '/inc/connect.php';


// 获取请求参数
// 首先我们用isset判断下GET参数action是否存在,如果存在直接拿到这个参数,不存在则默认(login)登陆
$action = isset($_GET['action'])  ? $_GET['action'] : 'login';


// 如action获取到login参数后进行基本的过滤,确保login参数能正常匹配,我们考虑到这几种情况:login前后空格、大小写、实体字符...等。
// 过滤函数:
// strtolower(trim(str: 'LoGin')); 过滤大小写
// htmlentities(strtolower(trim(str: 'LoGin'))); 过滤大小写,实体字符
$action = htmlentities(strtolower(trim($action))); 



// 拿到请求参数之后进行请求分发,switch判断下action的值是什么类型
switch ($action) {
    // 1.登陆页面
    case 'login':
        //  include 加载登陆表单
        include __DIR__ . '/login.php';
    break;
    // 2.验证操作/登陆
    case 'check':
        include __DIR__ . '/check.php';
    break;
    // 3.退出登陆
    case 'logout':
        include __DIR__ . '/logout.php';
    break;
    // 默认操作
    default:
    // header()
    header('location:index.php');
}

验证页面
demo/check.php

<?php

// 1.判断用户的请求类型是否正确?
// 这里要用到一个超全局变量$_SERVER,这个超全局变量里保存着系统/服务器里的一些数据
// print_r($_SERVER);打印一下这个超全局变量查看数据,拿到[REQUEST_METHOD]这个键名,判断一下[REQUEST_METHOD] 是否=> POST,以确定用户发起的请求是正确的
if($_SERVER['REQUEST_METHOD'] === 'POST') {

    // 2.获取表单数据
    $email = $_POST['email'];
    $password = sha1($_POST['password']);

    // 3.用用户表user.dbf进行验证
    $sql = 'SELECT * FROM `user` WHERE `email` = :email AND `password` = :password LIMIT 1';
    $stmt = $pdo->prepare($sql);
    $stmt->execute(['email'=>$email, 'password'=>$password]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    // 4.判断验证的结果
    if(false === $user) {
        // 验证失败,history.back()返回上一个页面
        echo '<script>alert("验证失败");history.back();</script>';
        die;
    } 

    // 验证成功
    // 将用户的信息写到cookie中
    setcookie('username',$user['username']);
    echo '<script>alert("登陆成功");location.assign("index.php");</script>';
    exit;
    
} else{
    die('请求类型错误');
} 

首页
demo/index.php

<?php

// 为了简化程序,使用一个中间层:请求派发器,类似于框架的控制器,对用户的请求进行集中处理
// 1.已登陆:显示出用户的登陆信息,显示退出按钮
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
    echo '用户: ' . $_COOKIE['username'] . '已登陆<br>';
    echo '<a href="dispatch.php?action=logout">退出</a>';
} else {
// 2.未登录,就跳转到登陆页面
echo '<a href="dispatch.php?action=login">请登录</a>';
}



登陆页
demo/login.php

<?php
// 防止用户重复登录
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
    echo '<script>alert("不能重复登陆");location.assign("index.php");</script>';
}
?>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <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">
    </p>

    <p>
        <label for="password">密码:</label>
        <input type="password" name="password" id="password">
    </p>

    <p>
        <button>提交</button>
    </p>
</form>

<script>
function isEmpty() {
    var email = document.getElementById('email').value;
    var password = document.getElementById('password').value;

    if (email.length=== 0 || password.length===0) {
        alert('邮箱和密码不能为空');
        return false;
    }
}
</script>
</body>
</html>

退出按钮
demo/logout.php

<?php
// 必须在用户已经登陆的情况下再退出
if (isset($_COOKIE['username']) && $_COOKIE['username'] === 'admin') {
    setcookie('username', null, time()-3600);
    echo '<script>alert("退出成功");location.assign("index.php");</script>';
} else{
    //要求用户先登陆
    echo '<script>alert("请先登录");location.assign("login.php");</script>';
}

完结…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值