搜尋
首頁後端開發php教程PHP使用者登入驗證模組

PHP使用者登入驗證模組

May 15, 2018 pm 05:37 PM
php模組驗證

這篇文章介紹的內容是關於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
您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

什麼是內容安全策略(CSP)標頭,為什麼重要?什麼是內容安全策略(CSP)標頭,為什麼重要?Apr 09, 2025 am 12:10 AM

CSP重要因為它能防範XSS攻擊和限制資源加載,提升網站安全性。 1.CSP是HTTP響應頭的一部分,通過嚴格策略限制惡意行為。 2.基本用法是只允許從同源加載資源。 3.高級用法可設置更細粒度的策略,如允許特定域名加載腳本和样式。 4.使用Content-Security-Policy-Report-Only頭部可調試和優化CSP策略。

什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用?什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用?Apr 09, 2025 am 12:09 AM

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

什麼是HTTP,為什麼對Web應用程序至關重要?什麼是HTTP,為什麼對Web應用程序至關重要?Apr 09, 2025 am 12:08 AM

HTTPS是一種在HTTP基礎上增加安全層的協議,主要通過加密數據保護用戶隱私和數據安全。其工作原理包括TLS握手、證書驗證和加密通信。實現HTTPS時需注意證書管理、性能影響和混合內容問題。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用