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...”。
(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');