目录
一、前言
手写的一个PHP登录验证,使用session鉴权。
对于密码进行了md5加密处理,用户名使用htmlspecialchars函数转化为html实体,在一定程度上避免了SQL注入。
连接数据库使用的myqli_connect函数,当然也可以选则使用PDO,关于PDO在我的另一篇博客中有讲解。
二、数据库创建
首先需要建立一个数据库,以便后面的数据存储。
建立数据库的方法多种多样,我选择用PHPstudy自带的myadmin直接建立数据库。
将数据库名设为exp4。据库exp4里建立一张user表,里面设如下几个字段,用于存放用户信息。
三、开工
index.php
这个页面是用户登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户登录</title>
<style type="text/css">
@import url("index.css");
</style>
</head>
<body background = 'background.jpg'>
<form action="login.php" method="post" name ="login">
<fieldset>
<legend align = 'center'>用户登录</legend>
<table align ="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
<tr>
<td><a href="register.php">用户注册</a></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
login.php
用户登陆后数据将被提交到login.php页面进行处理,login.php处理登录逻辑。
<?php
$username = htmlspecialchars($_POST['username']); //使用htmlspecialchars函数将用户名转为HTML实体
$password = md5($_POST['password']); //md5加密密码
//连接参数
$host = '127.0.0.1';
$db_username = 'root';
$db_pwd = '123456';
$db_name = 'exp4';
//开始连接数据库
$conn = mysqli_connect($host,$db_username,$db_pwd,$db_name);
if(!$conn)
{
die("连接数据库失败!请检查数据库是否开启 ".mysqli_connect_error());
}
else
{
//echo '成功!';
//数据库查询语句
$check_query = mysqli_query($conn,"select id from user where username='$username' and password='$password'");
$arr = mysqli_fetch_assoc($check_query); //获取结果集作为关联数组
//print_r($arr); //打印数组看看
if($arr)
{
//登陆成功
session_start();//开启session会话
$time = 2 * 60; //session过期时间为2分钟
setcookie(session_name(),session_id(),time()+$time,"/"); //设置session过期时间
$_SESSION['username'] = $username;
$_SESSION['id'] = $arr['id'];
//使用JS进行跳转
echo "<script language='javascript'>alert('登陆成功!');
location='welcome.php'</script>";
}
else{
echo "<script language='javascript'>alert('用户名或密码错误!');location='index.php'</script>";
}
}
mysqli_free_result($check_query); //释放内存
mysqli_close($conn); //关闭连接
?>
个人信息页面welcome.php
登录成功后将会跳转到这个页面,展示用户的个人信息
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户页面</title>
<style type="text/css">
@import url("table.css");
</style>
</head>
<body background='background.jpg'>
<?php
session_start();
$time = 5 * 60; //session过期时间
setcookie(session_name(),session_id(),time()+$time,"/"); //手动设置session过期时间
//检测是否登录,若没登录则转向登录界面
if(!isset($_SESSION['id'])){
echo "<script>alert('请先登录!');location='index.php'</script>";
exit();
}
//数据库连接
//连接参数
$host = 'localhost';
$db_username = 'root';
$db_pwd = '123456';
$db_name = 'exp4';
//开始连接数据库
$conn = mysqli_connect($host,$db_username,$db_pwd,$db_name);
if(!$conn)
{
die("连接数据库失败!请检查数据库是否开启 ".mysqli_connect_error());
}
else
{
$username = $_SESSION['username'];
$check_query = mysqli_query($conn,"select * from user where username='$username' limit 1");
$data = mysqli_fetch_assoc($check_query);
//print_r($data); //显示出来看看
}
mysqli_free_result($check_query); //释放内存
mysqli_close($conn); //关闭连接
?>
<br/><br/><br/><br/><br/><br/><br/><br/>
<h2 align = 'center'>欢迎你,<?php echo $username;?></h2>
<table border = '1' class = 'table' align = 'center'>
<th>用户名</th>
<th>年龄</th>
<th>性别</th>
<th>自我介绍</th>
<?php
echo'<tr>';
echo '<td>'.$username.'</td>';
echo '<td>'.$data['age'].'</td>';
echo '<td>'.$data['sex'].'</td>';
echo '<td>'.$data['information'].'</td>';
echo'</tr>';
?>
<div align = 'center'>
<a href = 'safe.php'>注销用户</a>
</div>
</table>
</body>
</html>
注册页面register.php
注册页面,用于新用户注册
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户注册</title>
</head>
<body background = "background.jpg">
<form action = "doregister.php" method = "post" name = "register">
<h3 align = "center">用户注册</h3>
<table align = "center">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type="password" name="repassword"></td>
</tr>
<tr>
<td> 年 龄:</td>
<td><input type="text" name="age"></td>
</tr>
<tr>
<td>性 别:</td>
<td><input type="radio" name="sex" value = "男">男</td>
<td><input type="radio" name="sex" value = "女">女</td>
</tr>
<tr>
<td>个人介绍(50字以内):</td>
<td><input type="text" cols= "50" name="information"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
<td><a href = "index.php">返回登陆</a></td>
<tr>
</tr>
</table>
</form>
</body>
</html>
登录处理页面doregister.php
doregister.php页面连接数据库使用PDO,这样比较简单一点,如果用mysqli_connect连接,很多地方要手动释放内存。
doregister.php页面对前端提交的密码做了md5加密,用户名等做了html实体转化。
并且判断了注册用户名是否被占用。如果用户名被占用,则取消此次注册跳转到主页面。
判断了两次输入密码是否相同,以及用户名或密码输入是否为空。
<?php
//接受前端数据
$data = [];
$data['username'] = htmlspecialchars($_POST['username']);
$data['password'] = md5($_POST['password']);
$data['age'] = htmlspecialchars($_POST['age']);
$data['sex'] = $_POST['sex'];
$data['information'] = htmlspecialchars($_POST['information']);
$username = $data['username'];
$data['repassword'] = md5($_POST['repassword']);
//print_r($data);
//连接参数
$host = '127.0.0.1';
$db_username = 'root';
$db_pwd = '123456';
$db_name = 'exp4';
$dbms = 'mysql';
$dsn = "$dbms:host=$host;dbname=$db_name";
//开始连接数据库
try
{
$conn = new PDO($dsn, $db_username, $db_pwd);
}
catch(Exception $e)
{
die('连接失败!');
}
if($data['repassword'] != $data['password'])//判断两次密码是否相同
{
echo "<script language='javascript'>alert('两次密码不同!');location='register.php';</script>";
}
else
{
//准备SQL语句
$sql_select = "select id from user where username = '$username'";
$select = $conn->prepare($sql_select);
$select->execute();//执行SQL语句
$arr = $select->fetch(PDO::FETCH_BOUND); //返回布尔类型
if($arr)//检测用户名是否存在
{
echo "<script language='javascript'>alert('该用户名已存在!');location='register.php';</script>";
}
else
{
//验证用户名或密码是否为空
if(empty($data['username']) || empty($data['password'] || empty($data['repassword'])))
{
echo "<script language='javascript'>alert('用户名或密码不能为空!');location='register.php';</script>";
}
else
{
$sql_insert = "insert into user values(NULL,'".$data['username']."','".$data['password']."','".$data['age']."',
'".$data['information']."','".$data['sex']."')"; //插入数据库SQL语句
$arr2 = $conn->exec($sql_insert); //执行插入语句,返回受影响行数
print_r($arr2);
if($arr2)
{
echo "<script language='javascript'>alert('注册成功');location='index.php';</script>";
}
else
{
echo "<script language='javascript'>alert('注册失败');location='index.php';</script>";
}
}
}
}
?>
表格美化table.css
.table{
text-align:center;
width:70%;
padding:15px;
background-color:skyblue;
border:5px solid green;
border-collapse:collapse;
}
实现注销
<?php
session_start(); //开启会话
unset($_SESSION['username']); //删除session
unset($_SESSION['id']); //删除session
session_destroy(); //销毁会话
echo '<script language="javascript">alert("注销成功");location="index.php";</script>'
?>
当然我这个登录功能并不完美,前端实在丑得可怕。以后学了一些前端美化再来优化一下。
转载至本人小网站:我的博客