PHP使用者登入驗證模組

來源:互聯網
上載者:User
這篇文章介紹的內容是關於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代碼更改如下:


<?phprequire_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並在表單中輸入資料嘗試登入。

>>>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['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()函數返回的是伺服器上的 目前時間。

>>>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['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中的工作,判斷使用者是否已經登入就很簡單,代碼如下:

<?phpsession_start();if (empty($_SESSION['uid'])) {echo "您還沒有登入,不能訪問當前頁面!";exit;}?>

通過判斷自動全域變$_SESSION中的uid是否為空白,就可以判斷使用者是否已經登入。如果使用者沒有登入,就提示其無法訪問當前頁面,並終止程式的運行(或者使用一條重新導向語句將頁面導向登入頁)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.