Blogger Information
Blog 35
fans 0
comment 0
visits 32591
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
cookie和session实现用户登录与验证
THPHP
Original
2006 people have browsed it

流程:

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保持在服务器端比较安全点!

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post