Blogger Information
Blog 36
fans 4
comment 3
visits 31558
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
7.26 分别使用cookie 和session完成登录验证
大灰狼的博客
Original
867 people have browsed it

使用cookie验证用户登录

1.png

database.php 

<?php
//将配置信息 封装成数组
	return[
	'type'=>'mysql',
	'host'=>'127.0.0.1',
	'dbname'=>'music',
	'username'=>'root',
	'password'=>'root',
	];
?>

connect.php

<?php
$db=require 'database.php';

$dns="{$db['type']}:host={$db['host']};dbname={$db['dbname']}";
$username=$db['username'];
$password=$db['password'];
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8");
try{
	$pdo=new PDO($dns,$username,$password,$opt);
//	var_dump($pdo); //可以打印pdo对象  有对象就说明成功了
}catch(PDOException $e){
	die('连接失败'.$e->getMessage());
}

以上2个是公用文件 cookie验证 和session验证用户登录案例都使用了以上2个数据库链接配置文件。

==========================

index.php  首页

实例

<?php
//1 已登录显示用户信息 和退出按钮
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	echo "用户 :{$_COOKIE['username']} 已登录<br> ";
	echo "<a href='dispatch.php?action=logout'>用户退出</a>";
} else {
	echo "<a href='dispatch.php?action=login'>请登录</a>";
}

运行实例 »

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

dispatch.php 派发器 (不管啥事找我 我告诉你该找谁办)

实例

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

//连接数据库
require __DIR__.'/inc/connect.php';

//获取请求参数  如果$action 未设置没传参 就指定一个默认值login
$action=isset($_GET['action'])?$_GET['action']:'login';

//为了安全进行参数处理 reim清除参数2边空格 strtolower 转全部小写 htmlentities将把字符转换为 HTML 实体字符
$action=htmlentities(strtolower(trim($action)));

//请求派发器
switch($action){
	case 'login':
		//加载表单
		require __DIR__.'/login.php';
		break;
	case 'check':
		//验证登录
		require __DIR__.'/check.php';
		break;
	case 'logout':
		//退出登录
		require __DIR__.'/logout.php';
		break;
	default:
		//出现未知参数 或者请求 php代码方式跳转到首页
		header('location:index.php');
}

运行实例 »

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

login.php 登录(你是谁 先亮出是否 来填写身份表格  没身份你就在我首页逛逛)

实例

<?php 
//防止用户重复登录
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	echo "<script>alert('请勿重复登录');location.assign('index.php');</script>";
};
?>
<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<meta http-equiv="X-UA-Compatible" content="ie=edge" />
	<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" value=""/>
		</p>
		<p>
			<label for="password">密码</label>:
			<input type="password" name="password" id="password" value=""/>
		</p>
		<!--<button>登录</button>-->
		<input type="submit" id="" name="登录" />
	</form>
	<script type="text/javascript">
		function isEmpty () {
			var email=document.getElementById('email').value;
			var password=document.getElementById('password').value;
			if (email.length===0) {
				alert('邮箱或密码不能为空!');
				return false;
			};
		};
	</script>
</body>
</html>

运行实例 »

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

check.php (等会 让我在档案里看看有你没 数据库查询核对下。)

实例

<?php

//检测 是否存在get传参 email进来 返回布尔值
//	var_dump(filter_has_var(INPUT_GET,'email'));
//检测 是否存在post传参 email进来 返回布尔值
//	var_dump(filter_has_var(INPUT_POST,'email'));

//1 判断用户请求类型是否是 post方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
	//2 获取表单数据
	$email = isset($_POST['email']) ? $_POST['email'] : null;
	$password = isset($_POST['password']) ? sha1($_POST['password']) : null;
	
	//3 进行数据库查询验证  代码应该放到if 判断变量是否为null要不要执行
    $sql = 'SELECT * FROM `user` WHERE `email` = :email AND `password` = :password LIMIT 1';	
	$stmt = $pdo->prepare($sql); 
	$stmt->execute(["email"=>$email,"password"=>$password]);//执行sql语句查询
//	$stmt->debugDumpParams(); //查看预处理语句 非最终执行语句
	$user=$stmt->fetch(PDO::FETCH_ASSOC); //拿到一条结果赋值给 $user
	
	//$user 会是一个布尔值 未查找到数据是false 查找到数据会是一个数组
	//4 判断验证结果
	if($user===false){
		//验证失败
		echo "<script>alert('验证失败');history.back();</script>";
		die;
	}else{
		//验证成功 
		//把用户信息写入到cookie
		setcookie('username',$user['username']);
		echo "<script>alert('登录成功');location.assign('index.php');</script>";
		exit;
	};
	
	
} else {
	die('请求类型错误!');
}

运行实例 »

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

logout.php 退出离开 (我走了 你后面有啥事别记在我头上)

实例

<?php
//判断是否已登录用户
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	//登录用户 进行退出操作 
	setcookie('username','',time()-3600);
	echo "<script>alert('退出成功');location.assign('index.php');</script>";
} else {
	//未登录用户 提示让先登录
	echo "<script>alert('请先登录');location.assign('index.php');</script>";
}

?>

运行实例 »

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


注意:cookie 不可以单独用来做登录安全验证 有严重安全问题。 建议配合session来验证比较安全。

============================一下就是 session登录验证案例

inc目录 数据库链接2个文件前面已经展示 这里不在重复发了。

9.png

index.php

实例

<?php
session_name('websss');
session_start();
//1 已登录显示用户信息 和退出按钮
if (isset($_SESSION['username']) && isset($_SESSION['email'])) {
	echo "用户 :{$_SESSION['username']} 已登录<br> ";
	echo "<a href='dispatch.php?action=logout'>用户退出</a>";
} else {
	echo "<a href='dispatch.php?action=login'>请登录</a>";
}

运行实例 »

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


dispatch.php

实例

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

//连接数据库
require __DIR__.'/inc/connect.php';

//获取请求参数  如果$action 未设置没传参 就指定一个默认值login
$action=isset($_GET['action'])?$_GET['action']:'login';

//为了安全进行参数处理 reim清除参数2边空格 strtolower 转全部小写 htmlentities将把字符转换为 HTML 实体字符
$action=htmlentities(strtolower(trim($action)));

//请求派发器
switch($action){
	case 'login':
		//加载表单
		require __DIR__.'/login.php';
		break;
	case 'check':
		//验证登录
		require __DIR__.'/check.php';
		break;
	case 'logout':
		//退出登录
		require __DIR__.'/logout.php';
		break;
	default:
		//出现未知参数 或者请求 php代码方式跳转到首页
		header('location:index.php');
}

运行实例 »

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


login.php

实例

<?php 
session_name('websss');
session_start();
//防止用户重复登录
if (isset($_SESSION['username']) && isset($_SESSION['email'])) {
	echo "<script>alert('请勿重复登录');location.assign('index.php');</script>";
};
?>
<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<meta http-equiv="X-UA-Compatible" content="ie=edge" />
	<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" value=""/>
		</p>
		<p>
			<label for="password">密码</label>:
			<input type="password" name="password" id="password" value=""/>
		</p>
		<!--<button>登录</button>-->
		<input type="submit" id="" name="登录" />
	</form>
	<script type="text/javascript">
		function isEmpty () {
			var email=document.getElementById('email').value;
			var password=document.getElementById('password').value;
			if (email.length===0) {
				alert('邮箱或密码不能为空!');
				return false;
			};
		};
	</script>
</body>
</html>

运行实例 »

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

check.php

实例

<?php
session_name('websss');
session_start();
//检测 是否存在get传参 email进来 返回布尔值
//	var_dump(filter_has_var(INPUT_GET,'email'));
//检测 是否存在post传参 email进来 返回布尔值
//	var_dump(filter_has_var(INPUT_POST,'email'));

//1 判断用户请求类型是否是 post方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
	//2 获取表单数据
	$email = isset($_POST['email']) ? $_POST['email'] : null;
	$password = isset($_POST['password']) ? sha1($_POST['password']) : null;
	
	//3 进行数据库查询验证  代码应该放到if 判断变量是否为null要不要执行
    $sql = 'SELECT * FROM `user` WHERE `email` = :email AND `password` = :password LIMIT 1';	
	$stmt = $pdo->prepare($sql); 
	$stmt->execute(["email"=>$email,"password"=>$password]);//执行sql语句查询
//	$stmt->debugDumpParams(); //查看预处理语句 非最终执行语句
	$user=$stmt->fetch(PDO::FETCH_ASSOC); //拿到一条结果赋值给 $user
	
	//$user 会是一个布尔值 未查找到数据是false 查找到数据会是一个数组
	//4 判断验证结果
	if($user===false){
		//验证失败
		echo "<script>alert('验证失败');history.back();</script>";
		die;
	}else{
		//验证成功 
		//把用户信息写入到session
		$_SESSION['username']=$user['username'];
		$_SESSION['email']=$user['email'];
		echo "<script>alert('登录成功');location.assign('index.php');</script>";
		exit;
	};
	
	
} else {
	die('请求类型错误!');
}

运行实例 »

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


logout.php

实例

<?php
session_name('websss');
session_start();
//判断是否已登录用户
if (isset($_SESSION['username']) && isset($_SESSION['email'])) {
	//登录用户 进行退出操作
	//清除内存中session变量 
	session_unset();
	//删除服务器上session文件
	session_destroy();
	//删除session 没有意义因为只要绘画开启状态 再刷新一次会在次写入session!!!
//	setcookie("websss", "Mr Zhu you forgot domain ", time() - 3600, "/");
	echo "<script>alert('退出成功');location.assign('index.php');</script>";
} else {
	//未登录用户 提示让先登录
	echo "<script>alert('请先登录');location.assign('index.php');</script>";
}

?>

运行实例 »

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


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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!