Rumah > Artikel > pembangunan bahagian belakang > PHP用户登录验证模块
这篇文章介绍的内容是关于PHP用户登录验证模块 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
登录表单的HTML代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!— .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
将以上代码保存为login.php文件并在浏览器中运行。
用户在登录表单中输入登录信息之后,数据被提交回本页面login.php进行处理,下面在login.php的头部添加验证用户名和密码是否正确的代码。login.php代码更改如下:
<br/>
<?php require_once('common.php'); // 引入公共文件,其中实现了SQL注入漏洞检查的代码 $username = trim($_POST['username']); // 取得客户端提交的密码并用md5()函数时行加密转换以便后面的验证 $pwd = md5($_POST['pwd']); // 设置一个错误消息变量,以便判断是否有错误发生 // 以及在客户端显示错误消息。 其初值为空 $errmsg = ''; if (!empty($username)) { // 用户填写了数据才执行数据库操作 //--------------------------------------------------------- // 数据验证, empty()函数判断变量内容是否为空 if (empty($username)) { $errmsg = '数据输入不完整'; } //--------------------------------------------------------- if(empty($errmsg)) { // $errmsg为空说明前面的验证通过 // 调用mysqli的构造函数建立连接,同时选择使用数据库'test' $db = @new mysqli("127.0.0.1", "developer", "123456", "test"); // 检查数据库连接 if (mysqli_connect_errno()) { $errmsg = "数据库连接失败! \n"; } else { // 查询数据库,看用户名及密码是否正确 $sql = "SELECT * FROM t_user WHERE f_username='$username' AND f_password='$pwd'"; $rs = $db->query($sql); // $rs->num_rows判断上面的执行结果是否含有记录,有记录说明登录成功 if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; } else { $errmsg = "用户名或密码不正确,登录失败!"; } // 关闭数据库连接 $db->close(); } } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>User Login</title> <style type="text/css"> <!-- .alert {color: red} .textinput {width:160px} .btn {width:80px} table {border: 3px double;background-color:#eeeeee;} --> </style> </head> <body> <form name="frmLogin" method="post" action="login.php" onSubmit="return doCheck();"> <table border="0" cellpadding="8" width="350" align="center"> <tr><td colspan="2" align="center" class="alert"><?echo $errmsg;?></td></tr> 用户名: <td><input name="username" type="text" id="username" class="textinput" value="<?echo $username;?>" /></td> </tr> <tr><td>密码:</td> <td><input name="pwd" type="password" id="password" class="textinput" /></td> </tr> <tr><td colspan="2" align="center"> <input type="submit" class="btn" value="登录"> <input type="reset" class="btn" value="重置"> </td> </tr> </form> </body> </html>
以粗体显示部分是新添的代码,大部分语句都已有详细注释。值得注意的是在HTML表单中添加的代码,其中在的第一行的单元格中加入PHP代码用以输 出服务 器端处理过程可能发生的错误或提示,另外在用户名的输入框标记的value属性中添加了PHP代码用以输出上次提交的用户名,以便因为输入密码错误而不能 登录的用户在重试的时候只需要输入密码。
再次运行login.php并在表单中输入数据尝试登录。
用户信息表t_user中,f_logintimes字段用来记录用户的登录次数,f_lasttime字段用来记录用户最后一次登录的时 间,f_login字段用来记录用户最后一次登录用的IP,数据库中记录这些信息主要是为管理提供统计用户登录次数和用户地域分布的方便。这些数据在用户 每次登录后都要更新,下面来添加更新这些数据的代码。
打开login.php文件,将其头部的PHP代码更改如下:
<?php ...... if ($rs && $rs->num_rows > 0) { // 在实际应用中可以使用前面提到的重定向功能转到主页 第4 / 6页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } else { $errmsg = "用户名或密码不正确,登录失败!"; } ...... ?>
以上粗体部分为新添的代码,代码中首先从自动全局变量$_SERVER中获得客户端的IP地址,然后构造SQL语句并执行该语句以更新用户登录信 息。值得 注意的是该SQL语句中对f_lasttime的赋值是通过调用MySQL的内部函数now()来实现的,MySQL的now()函数返回的是服务器上的 当前时间。
HTTP协议是无状态的。它完成的事情只是简单地发送请求到服务器,以及从服务器获取数据;除此之外一无所知,即使两次请求同一个PHP文件,它也不会认为两次请求之间有任何联系。
由于HTTP协议的无状态,这就使得无法在两个不同的请求之间共享信息,如无法记录“当前访问者”的信息。虽然在登录过程已经验证了用户的用户名与 密码是 正确的,但是当用户跳转到其他页面时,从登录页面获得的用户信息全部丢失,这是用户不希望发生的。同时,要求用户进入每一个页面时都要输入用户名与密码进 行验证又是不现实的,这就要求可以在不同页面之间共享信息。
一般来说,对于PHP以及其他的Web编程语言,可以使用Cookie或者是Session来解决这个问题。
Cookie是保存在客户端的一个小文件,可以将一些需要在页面间共享的资料存储在这个文件中。但Cookie有3个缺点:一是大小不可以超过 4KB(不 同的浏览器可能限制不同),二是用户可以在浏览器设置中禁用Cookie,三是Cookie是在客户端记录资料安全性较差。 Session一般是通过Cookie来实现的,如果用户禁用了Cookie,Session也同样失效。不同于Cookie的是,Session 只是把 一个信息的标识通过Cookie放在客户端而实际的信息却存放在服务器上,这样安全性能上有较大的提高。现在也有另外一种不通过Cookie而使用 Session的方法,即URL重写技术。这种方法是将Session的标识作为URL的参数与服务进行交互,其好处是不受客户端对Cookie禁用的限 制,缺点是使用起来较为麻烦。
在PHP中使用Session非常简单。PHP提供了一个自动全局变量$_SESSION用于处理Session。但是需要注意的是,如果在PHP 的配置 文件中没有设置自动启动Session的话,在使用Session之前一定要调用session_start()函数启动Session。
再次打开login.php,添加以下以粗体显示的代码,以记录用户信息。
<?php ...... if ($rs && $rs->num_rows > 0) { // 使用session保存当前用户 session_start(); $_SESSION['uid'] = $username; // 在实际应用中可以使用前面提到的重定向功能转到主页 $errmsg = "登录成功!"; // 更新用户登录信息 $ip = $_SERVER['REMOTE_ADDR']; // 获取客户端的IP $sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,"; $sql .= "f_lasttime=now(), f_loginip='$ip' "; $sql .= " WHERE f_username='$username'"; $db->query($sql); } ...... ?>
不要滥用Session,Session最大的作用是在页面之间维持状态。许多初学者在掌握Session技术后,很容易将Session作为存储 数据的 法宝,在Session里放置很多数据。由于这些数据直到Session过期才会被释放,因此会给服务器带来很大的负担。
既然上一小节已经完成了将用户名保存到Session中的工作,判断用户是否已经登录就很简单,代码如下:
<?php session_start(); if (empty($_SESSION['uid'])) { echo "您还没有登录,不能访问当前页面!"; exit; } ?>
通过判断自动全局变$_SESSION中的uid是否为空,就可以判断用户是否已经登录。如果用户没有登录,就提示其无法访问当前页面,并终止程序的运行(或者使用一条重定向语句将页面导向登录页)。
相关推荐:
Atas ialah kandungan terperinci PHP用户登录验证模块 . Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!