- 登入流程中,首先要判斷是否有 action 是 login 的狀態,若是,才開始登入的檢驗。
- 進入登入流程檢驗之後,進行如下的判斷流程:
- 先檢查驗證碼,若驗證碼正確,則下一步,否則直接回傳錯誤,並回到登入畫面
- 開始取得帳號與密碼,並將密碼編碼
- 以上述資訊來與資料庫同時比對,比對正確則直接跳到下一關,否則直接回傳錯誤,並回登入畫面
- 登入正確給予 $_SESSION[username] 與 $_SESSION[userlevel] 兩個項目,作為未來判斷帳號之用
- 不要顯示登入畫面,而是顯示使用者資訊才對!
- 開始來實做整個 PHP 的程式碼:
$ vim login.php
<?php
session_start();
include ('include/config.php');
if ( isset ( $_REQUEST['action'] ) ) {
if ( $_REQUEST['action'] == 'login' ) {
// 先取得所有的參數
$checking = $_REQUEST['checking'];
$login_name = trim($_REQUEST['login_name']); // trim 在去除一段文字的頭尾空白(包括 ENTER)
$login_pass = trim( hash ('sha256', $_REQUEST['login_pass']));
// 先設定一個名為 msg 的變數,這個變數內容如果是空的,代表沒有錯誤,若非為空,則是有錯誤!
$msg = '';
// 先確認是否取得正確的註冊驗證碼
if ( $_SESSION['CAPTCHA'] != $checking ) {
$msg = '驗證碼錯誤!請重新取得正確的驗證碼資訊';
} else {
// 開始取得帳號與密碼
$sql = "select login_name, realname from userinfo where login_name = '$login_name' and login_pass = '$login_pass'";
$result = mysql_query ($sql, $db_link );
$usernu = mysql_num_rows($result);
if ( $usernu < 1 ) {
// 找不到資料的結果,就是給予錯誤訊息
$msg = '查不到這個帳號或密碼錯誤';
} else {
$row = mysql_fetch_row($result);
$_SESSION['username'] = $row[1];
$_SESSION['userlevel'] = 'user';
}
}
}
}
include ('include/captcha.php');
?>
<!doctype html>
.....
<tr><td colspan="2" ><?php if ( $msg != '' ) echo $msg ?></td></tr>
<tr>
<td colspan="3" style="text-align:center; ">
<input type="hidden" name="action" value="login" />
<input type="submit" value="登入" />
</td>
</tr>
</table>
</form>
.....
- 上述流程中,如果登入錯誤時,帳號資訊並沒有繼續留下來,有點詭異~我們修改一下這個防呆項目:
$ vim login.php
.....
<td>登入帳號:</td>
<td><input type="text" name="login_name" required="required" id='login_name' style="width: 150px"
<?php if ( isset ($login_name) ) echo "value='$login_name'" ?> /></td>
.....
- 你會發現,即使已經登入了,還是會出現登入資訊...這不對啊!所以開始使用判斷式:
- 當 $_SESSION['username'] 存在時,代表使用者登入了,這時就不要顯示登入畫面
- 承上,那顯示的資訊就變成使用者參數說明了!
依舊使用 PHP 的 if ... else 功能即可!
$ vim login.php
.....
if ( ! isset( $_SESSION['username'] ) ) { // 同樣的,如果沒有登入才需要取得驗證碼的模組啊!
include ('include/captcha.php');
}
.....
<body>
<?php
if ( ! isset ( $_SESSION['username'] ) ) {
?>
<form id="loginform" onsubmit="return checkinput()" method="post"
style="width: 270px; border: 1px solid gray; padding: 5px; text-align: center;">
.....
</script>
<?php } else { ?>
<div style="width: 270px; border: 1px solid gray; padding: 5px; text-align: center;">
親愛的<?php echo $_SESSION['username'] ?>!歡迎光臨!
</div>
<?php } ?>
</body>
</html>
- 接下來,你會發現到雖然已經登入了,不過,卻沒有登出的畫面!這不合理~因此,再加上一個登出的資訊。
$ vim login.php
.....
親愛的<?php echo $_SESSION['username'] ?>!歡迎光臨!<br />
<div style="text-align:right;">
<a style="text-decoration: none; color: blue;" href="<?php echo $_SERVER['PHP_SELF']; ?>?action=logout">按我登出</a>
</div>
</div>
.....
- 其實登出流程還挺笨的,就是將 $_SESSION['username'] 與 $_SESSION['userlevel'] 的設定取消,這樣就沒有跟伺服器註冊 (SESSION 功能),
所以就會直接跳到登入的畫面中囉!
$ vim login.php
session_start();
include ('include/config.php');
if ( isset ( $_REQUEST['action'] ) ) {
if ( $_REQUEST['action'] == 'login' ) {
// 先取得所有的參數
.....
}
if ( $_REQUEST['action'] == 'logout' ) {
unset($_SESSION['username']);
unset($_SESSION['userlevel']);
$urltmp = explode('?',$_SERVER['PHP_SELF']);
$url = $urltmp[0];
echo "<script>window.location = '$url'</script>";
die;
}
}