1、编写用户登录页面(login_html.php)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>用户登录</title>
</head>
<body>
<form method="post">
    <table>
        <tr><th>用户名</th><td><input type="text" name="username"/></td></tr>
        <tr><th>密码</th><td><input type="password" name="password"/></td></tr>
        <tr><td colspan="2">
                <input type="submit" value="提交登录"/>
                <input type="reset" value="重新填写"/>
            </td></tr>
    </table>
</form>
</body>
</html>
<?php if(!empty($error)): ?>
    <div class="error-box">登录失败,错误信息如下:
        <ul><?php foreach($error as $v) echo "<li>$v</li>"; ?></ul>
    </div>
<?php endif; ?>

2、编写用户登录功能(login.php)

接受用户登录表单,验证用户名和密码格式,根据用户名到数据库中取出密码,判断密码是否正确。

当用户登录成功后,服务器需要记住该用户已经登录,并且这个已登录的状态只能在该用户的浏览器上生效。这就需要SESSION技术。当PHP启动Session时,服务器会为每个用户的浏览器创建一个独有的Session文件,该文件存储在服务器中,用于保存用户信息。每一个Session文件都有一个唯一的会话ID,从而实现每个会话的区分。

<?php
header('Content-Type:text/html; charset=utf-8');
require '../chapter3/public_function.php';
require './check_form.php';
//保存错误信息
$error=array();
//当有表单提交时
if(!empty($_POST)){
    //接收用户登录表单
    $username=isset($_POST['username'])?trim($_POST['username']):'';
    $password=isset($_POST['password'])?$_POST['password']:'';
    //验证用户名和密码格式
    if($result=checkUsername($username)!=true) $error[]=$result;
    if($result=checkPassword($password)!=true) $error[]=$result;
    //表单验证通过,再到数据库中验证
    if(empty($error)){
        //连接数据库,设置字符集,选择数据库
        dbInt();
        //处理用户名和密码
        $username=mysql_real_escape_string($username);//SQL转义
        //根据用户名取出用户信息
        $sql="select `id`,`password` from `user` where `username`='$username'";
        if($res=mysql_query($sql)){//执行sql,获得结果集;
            $row=mysql_fetch_assoc($res);//处理结果集
            $password=md5($password);//计算密码的MD5
            if($password==$row['password']){//判断密码是否正确
                //die('欢迎登录!');
                //登录成功,保存用户会话
                //启动SESSION。当Session启动后服务器就会创建Session文件,并向浏览器的Cookie中设置会话ID
                session_start();
                //将用户信息保存到$_SESSION数组中,PHP会自动保存到Session文件中
                $_SESSION['userdata']=array(
                    'id'=>$row['id'],//将用户id保存到Session
                    'username'=>$username//将用户名保存到Session
                );
                //跳转到会员中心
                //当页面跳转到user.php时,浏览器会将带有会话ID的Cookie发送给服务器,因此在user.php中可以通过会话ID读取到login.php保存的Session信息。
                header('Location:./user.php');
                //终止脚本继续执行
                die;
            }
        }
        $error[]='用户名不存在或密码错误。';
    }
}
//加载视图文件
require './login_html.php';

3、编写user.php,判断用户是否登录

<?php
session_start();//启动SESSION
//判断SESSION中是否存在用户信息
if(isset($_SESSION['userdata'])){
    //用户信息存在,说明用户已经登录
    $login=true;//保存用户登录状态
    $userdata=$_SESSION['userdata'];//保存用户信息
}else{
    //用户信息不存在,说明用户没有登录
    $login=false;
}
//用户退出功能
if((isset($_GET['action']) && $_GET['action']=='logout')){
    unset($_SESSION['userdata']);//清除SESSION数据
    //如果SESSION中没有其他数据,则销毁SESSION
    if(empty($_SESSION)) session_destroy();
    header('Location:./login.php');//跳转到登录页面
    die;//终止脚本
}
//加载视图文件
require './user_html.php';

4、编写user_html.php,展示用户登录状态

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>会员中心</title>
</head>
<body>
<?php if($login): ?>
    <div><?php echo $userdata['username']; ?>您好,欢迎来到会员中心。<a href="?action=logout">退出</a></div>
<?php else: ?>
    <div>您还未登录,请先<a href="./login.php">登录</a>或<a href="./register.html">注册新用户</a>。</div>
<?php endif; ?>
</body>
</html>

5、知识点

(1)Session技术

Session亦称为“会话”,指得是用户在浏览某个网站时,从进入网站到关闭网站所经过的这段时间。Session技术是一种服务器端的技术,它的生命周期从用户访问页面开始,直到断开与网站的连接时结束。当PHP启动Session时,服务器会为为每个用户的浏览器创建一个供其独享的Session文件,通常用于保存用户状态、保存生成的验证码等。

当服务器创建Session时,每一个Session文件都具有一个唯一的会话ID,用于标识不同的用户。会话ID分别保存在客户端和服务器端两个位置。在客户端通过浏览器Cookie来保存,在服务器端以文件的形式保存在了指定的Session目录中。在浏览器中通过开发者工具可以查看Cookie。Session文件的保存目录可以通过php.ini修改,其默认路径位于“C:\windows\Temp”,打开这个目录可以查看Session文件。

Cookie中保存了会话ID,其名称为“PHPSESSID:mr5lf......”;其对应的Session文件为“sess_mr5lf...”。

使用session实现用户登录验证 web用session实现用户登录_使用session实现用户登录验证


(2)Session的使用

session_start();   启动Session

通过超全局变量$_SESSION添加、读取、修改Session中的数据。

//启动Session
session_start();
//向Session中添加数据(字符串)
$_SESSION['username']='袁先生';
//向Session中添加数据(数组)
$_SESSION['info']=array(
    '年龄'=>'18',
    '心愿'=>'吃屁屁'
);
//判断Session中是否存在username
if(isset($_SESSION['username'])){
    //读取Session中的username
    $username=$_SESSION['username'];
}
//删除单个数据
unset($_SESSION['username']);
//删除所有数据(该Session文件仍然存在,是个空文件)
$_SESSION=array();
//结束当前会话(空文件也会被删除掉)
session_destroy();

(3)HTTP响应消息头

HTTP协议分为请求和响应。在通信时,浏览器会发出请求消息头,服务器会发出响应消息头。服务器通过请求消息头可以获取浏览器的基本信息,浏览器通过响应消息头可以获取服务器的基本信息。

常见的HTTP响应消息头:

Location

控制浏览器显示哪个页面

Server

服务器的类型

Content-Type

服务器发送内容的类型和编码说明

Last-Modified

服务器最后一次修改的时间

Date

响应网站的时间

虽然响应消息头由服务器自动发出,不过可以通过PHP的header()函数自定义响应消息头,如下列代码所示:

//设定编码格式
header('Content-Type:text/html; charset=utf-8');
//页面跳转
header('Location: login.php');