首頁  >  文章  >  後端開發  >  PHP使用者登入驗證模組

PHP使用者登入驗證模組

不言
不言原創
2018-05-15 17:37:2122413瀏覽

這篇文章介紹的內容是關於PHP用戶登入驗證模組 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

##實現用戶登入

>>>1 建立登入表單
##登入表單的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檔案並在瀏覽器中運行。


>>>2 驗證登入名稱和密碼

使用者在登入表單中輸入登入資訊之後,資料被提交回本頁面login. php進行處理,下面在login.php的頭部加入驗證使用者名稱和密碼是否正確的程式碼。 login.php程式碼變更如下:

<br/>
<?php
require_once(&#39;common.php&#39;); // 引入公共文件,其中实现了SQL注入漏洞检查的代码 $username = trim($_POST[&#39;username&#39;]);
// 取得客户端提交的密码并用md5()函数时行加密转换以便后面的验证
$pwd = md5($_POST[&#39;pwd&#39;]);
// 设置一个错误消息变量,以便判断是否有错误发生
// 以及在客户端显示错误消息。 其初值为空
$errmsg = &#39;&#39;;
if (!empty($username)) { // 用户填写了数据才执行数据库操作
//---------------------------------------------------------
// 数据验证, empty()函数判断变量内容是否为空
if (empty($username)) {
$errmsg = &#39;数据输入不完整&#39;;
}
//---------------------------------------------------------
if(empty($errmsg)) { // $errmsg为空说明前面的验证通过
// 调用mysqli的构造函数建立连接,同时选择使用数据库&#39;test&#39;
$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=&#39;$username&#39; AND f_password=&#39;$pwd&#39;";
$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並在表單中輸入資料嘗試登入。


>>>3 更新使用者登入資訊

在使用者資訊表t_user中,f_logintimes欄位用來記錄使用者的登入次數,f_lasttime欄位用來記錄使用者最後一次登入的時間,f_login欄位用來記錄使用者最後一次登入的IP,資料庫中記錄這些資訊主要是為管理提供統計使用者登入次數和使用者地理分佈的方便。這些資料在使用者 每次登入後都要更新,以下來新增更新這些資料的程式碼。
開啟login.php文件,將其頭部的PHP程式碼變更如下:


<?php
......
if ($rs && $rs->num_rows > 0) {
// 在实际应用中可以使用前面提到的重定向功能转到主页
第4 / 6页
$errmsg = "登录成功!";

// 更新用户登录信息
$ip = $_SERVER[&#39;REMOTE_ADDR&#39;]; // 获取客户端的IP
$sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,";
$sql .= "f_lasttime=now(), f_loginip=&#39;$ip&#39; ";
$sql .= " WHERE f_username=&#39;$username&#39;";
$db->query($sql);
}
else {
$errmsg = "用户名或密码不正确,登录失败!";
}
......
?>
以上粗體部分為新添的程式碼,程式碼中先從自動全域變數$_SERVER中取得客戶端的IP位址,然後建構SQL語句並執行該語句以更新使用者登入資訊。值得 注意的是該SQL語句中對f_lasttime的賦值是透過呼叫MySQL的內部函數now()來實現的,MySQL的now()函數傳回的是伺服器上的 當前時間。


>>>4 用Session儲存使用者資訊

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[&#39;uid&#39;] = $username;

// 在实际应用中可以使用前面提到的重定向功能转到主页
$errmsg = "登录成功!";

// 更新用户登录信息
$ip = $_SERVER[&#39;REMOTE_ADDR&#39;]; // 获取客户端的IP
$sql = "UPDATE t_user SET f_logintimes = f_logintimes + 1,";
$sql .= "f_lasttime=now(), f_loginip=&#39;$ip&#39; ";
$sql .= " WHERE f_username=&#39;$username&#39;";
$db->query($sql);
}
......
?>

不要濫用Session,Session最大的功能是在頁面之間維持狀態。許多初學者在掌握Session技術後,很容易將Session作為儲存 資料的 法寶,在Session裡放置許多資料。由於這些資料直到Session過期才會被釋放,因此會對伺服器造成很大的負擔。

判斷使用者是否已登入

既然上一小節已經完成了將使用者名稱儲存到Session中的工作,判斷使用者是否已經登入就很簡單,程式碼如下:

<?php
session_start();
if (empty($_SESSION[&#39;uid&#39;])) {
echo "您还没有登录,不能访问当前页面!";
exit;
}
?>

通过判断自动全局变$_SESSION中的uid是否为空,就可以判断用户是否已经登录。如果用户没有登录,就提示其无法访问当前页面,并终止程序的运行(或者使用一条重定向语句将页面导向登录页)。

相关推荐:

php用户注册时密码使用crypt加密示例

以上是PHP使用者登入驗證模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn