博客列表 >7.26 分别使用cookie 和session完成登录验证

7.26 分别使用cookie 和session完成登录验证

大灰狼的博客
大灰狼的博客原创
2019年07月30日 23:30:31866浏览

使用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>";
}

?>

运行实例 »

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


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