博客列表 >cookie和session实现用户登录与验证

cookie和session实现用户登录与验证

THPHP
THPHP原创
2018年09月11日 18:05:452004浏览

流程:

1、公共代码分离(html头部和尾部)

2、登陆表单代码使用login_page.php,分离

3、使用login.php文件来判断用户登陆,并加载数据库,公共函数库

4、最后写入登陆成功和退出页面

index.php文件:

实例

<?php
// 导入公共头部文件
include 'inc/header.php';
// 在公共头部判断是否有$title_page值,有就为自定义的值
$title_page = '我是首页';
// 判断当前的cookie是否有id字段,和当前页面不等于退出页面
echo '<h2 style="color:red">我是首页</h2>';
if(isset($_COOKIE['id']) && basename($_SERVER['PHP_SELF']) != 'logout.php'){
    echo '<a href="logout.php">退出</a>';
}else {
    echo '<a href="login.php">登录</a>';
}
// 导入公共底部文件
include 'inc/footer.php';

运行实例 »

点击 "运行实例" 按钮查看在线实例

登陆表单页面login_page.php:

实例

<?php
// 设置自定义的 title值
$title_page = '用户登陆';
// 导入公共头部文件
include "inc/header.php";
// 错误信息提示
if(isset($errors) && !empty($errors)){
   $errors_msg = '<p style="color:blue">';
    foreach ($errors as $msg){
        $errors_msg .= $msg.'<br>';
    }
    echo $errors_msg.'</p>';
}
?>
<h2 style="color:red">用户登陆</h2>
<form action="login.php" method="post">
    <p>
        <table for="email">邮箱:</table>
        <input type="email" name="email" id="email" value="<?php echo isset($_POST['email']) ? $_POST['email'] : '' ?> ">
    </p>
    <p>
        <table for="password">密码:</table>
        <input type="password" name="password" id="password" value="<?php echo isset($_POST['password']) ? $_POST['password'] : '' ?>">
    </p>
    <p>
        <button type="submit">登陆</button>
    </p>

</form>
<!-- 导入公共底部文件 -->
<?php include "inc/footer.php"; ?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

login.php文件:

实例

<?php
if($_SERVER['REQUEST_METHOD'] =='POST'){
    // 加载函数
    require 'inc/function.php';

    // 加载数据库
    require 'inc/connect.php';
    
    // 验证判断
    list($check,$data) = check_login($dbc,$_POST['email'],$_POST['password']);
    // 检测,如果通过就设置cookie
    if($check){
        setcookie('id',$data['id']);
        setcookie('name',$data['name']);
        redirect_user('loggedin.php');
    }else{
        $errors = $data;
    }
    // 关闭数据库
    mysqli_close($dbc);
}

// 导入登陆表单
include "login_page.php";

运行实例 »

点击 "运行实例" 按钮查看在线实例

函数库function.php:

实例

<?php
// 用户登陆成功默认跳转函数库
function redirect_user($page = 'index.php'){
    // 默认的url地址
    $url = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
    // 统一为 /
    $url = rtrim($url,'/\\');
    $url .= '/'.$page;
    header('Location:' .$url);
    exit();
}
// 验证函数库
function check_login($dbc,$email,$password){
    // 初始化错误信息
    $errors=[];
    // 邮箱判断
    if(empty($email)){
        $errors [] = '邮箱不能为空';
    }else{
        $e = mysqli_real_escape_string($dbc,trim($email));
    }
    // 密码判断
    if(empty($email)){
        $errors [] = '密码不能为空';
    }else{
        $p = mysqli_real_escape_string($dbc,trim($password));
    }
    // 如果为空就到数据表中进行验证
    if(empty($errors)){
        // 根据数据库表中的email password ,并返回id name
        $sql = "SELECT `id`,`name` FROM `lianxi` WHERE `email`='$e' AND `password`='$p'";
        // mysql_query(链接数据库,数据库语句) 函数执行一条 MySQL 查询
        $res = mysqli_query($dbc,$sql);
        //  mysqli_num_rows()返回结果集中行的数量:
        if(mysqli_num_rows($res) == 1){
            // mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有
            //返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
            $row = mysqli_fetch_array($res,MYSQLI_ASSOC);
            // 如果成功就返回 true $row
            return [true , $row];
        }else{
            $errors[] = '邮箱密码不正确,请从新输入';
        }
        return[false,$errors];
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

数据库connect.php:

实例

<?php
// 连接数据库
$dbc = mysqli_connect('127.0.0.1','root','root','php');
// 判断是否连接失败
if(mysqli_connect_errno()){
    die('连接失败'.mysqli_connect_error());
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

登陆成功页面loggedin.php:

实例

<?php
// 登陆成功
 if(!isset($_COOKIE['id'])){
     require 'inc/function.php';
     redirect_user();
 }
 $page_title = '登陆成功';
include "inc/header.php";

echo <<< "HEREDOC"
<h2 style="color:red">登陆成功</h2>
<p>欢迎你:{$_COOKIE['name']}</p>
<p><a href="logout.php">退出</a></p>
HEREDOC;


include "inc/footer.php";

运行实例 »

点击 "运行实例" 按钮查看在线实例

退出页面logout.php:

实例

<?php
if(!isset($_COOKIE['id'])){
    require 'inc/function.php';
    redirect_user();
}else{
    setcookie('id','',time()-3600);
    setcookie('name','',time()-3600);
}
$page_title = '退出';
include "inc/header.php";
echo <<< "HEREDOC"
<h2 style="color:red">退出成功</h2>
<p><a href="login.php">登陆</a></p>
HEREDOC;
include "inc/footer.php";

运行实例 »

点击 "运行实例" 按钮查看在线实例

公共头部header页面:

实例

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><?php echo isset($title_page) ? $title_page : '默认页面'; ?></title>
</head>
<body>
<h2>我是公共头部</h2>

运行实例 »

点击 "运行实例" 按钮查看在线实例

公共底部footer页面:

实例

<h2>我是公共底部</h2>
</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例

使用session验证登陆:

只要在有cookie的地方开启session_start(); 会话模式,并替换cookie

在cookie验证登陆页面有:

index.php

实例

<?php
session_start();
// 导入公共头部文件
include 'inc/header.php';
// 在公共头部判断是否有$title_page值,有就为自定义的值
$title_page = '我是首页';
// 判断当前的cookie是否有id字段,和当前页面不等于退出页面
echo '<h2 style="color:red">我是首页</h2>';
if(isset($_SESSION['id']) && basename($_SERVER['PHP_SELF']) != 'logout.php'){
    echo '<a href="logout.php">退出</a>';
}else {
    echo '<a href="login.php">登录</a>';
}
// 导入公共底部文件
include 'inc/footer.php';

运行实例 »

点击 "运行实例" 按钮查看在线实例

login.php:

实例

<?php
if($_SERVER['REQUEST_METHOD'] =='POST'){
    // 加载函数
    require 'inc/function.php';

    // 加载数据库
    require 'inc/connect.php';
    
    // 验证判断
    list($check,$data) = check_login($dbc,$_POST['email'],$_POST['password']);
    // 检测,如果通过就设置cookie
    if($check){
        $_SESSION('id',$data['id']);
        $_SESSION('name',$data['name']);
        redirect_user('loggedin.php');
    }else{
        $errors = $data;
    }
    // 关闭数据库
    mysqli_close($dbc);
}

// 导入登陆表单
include "login_page.php";

运行实例 »

点击 "运行实例" 按钮查看在线实例

logout.php:

实例

<?php
if(!isset($_COOKIE['id'])){
    require 'inc/function.php';
    redirect_user();
}else{
    session_destroy(); //服务器上的session信息消除
    setcookie('PHPSESSID','',time()-3600);
}
$page_title = '退出';
include "inc/header.php";
echo <<< "HEREDOC"
<h2 style="color:red">退出成功</h2>
<p><a href="login.php">登陆</a></p>
HEREDOC;
include "inc/footer.php";

运行实例 »

点击 "运行实例" 按钮查看在线实例

除了这些代码,其他的代码跟cookie代码保持不变

cookie与session会话机制的优缺点分析:

1、session会把用户信息保存在服务器端。而cookie会把用户信息保持在浏览器端,下次用户不用再次输入账号与密码。

2、相对来说,个人觉得session保持在服务器端比较安全点!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议