1. 程式人生 > >PHP簡單的會話控制 會話控制實現身份驗證 session_start()函式的使用

PHP簡單的會話控制 會話控制實現身份驗證 session_start()函式的使用

1.什麼是會話控制

大家應該聽說過“HTTP是無狀態的協議”。意思是HTTP協議沒有一個內建機制來維護兩個事務之間的狀態。當一個使用者在請求一個頁面後再請求另一個頁面時,HTTP將無法告知我們這兩個請求是來自同一個使用者的。簡單的來說就是會話控制即能夠在一個網站中根據一個會話來跟蹤使用者。
例如當你用一個瀏覽器登陸一個網站,比如淘寶,京東等,只需要登陸一次,無論你開啟多少個淘寶視窗,顯示的都是你的賬號資訊。

2.建立一個簡單的會話例子

會話控制最常見的用法就是在使用者通過一個簡單的登陸機制驗證後跟蹤該使用者的行為,在下面的這個程式中,我們將結合MySQL身份驗證和會話控制功能的使用來實現該功能。
程式共有四個部分
(1)authmain.php

<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<h1>Home page</h1>
	<form method="post" action="check.php" name="Login">
		User:<input type="text" name="user" value="">
		Password:<input type="text" name="password">
		<input type="submit" name="" value="Login in">
	</form>	<br>
	<a href="memberonly.php">Members</a>
</body>
</html>

該程式碼段主要是展現一個簡單的登陸首頁,效果如下:
兩個文字域,分別來接受使用者輸入的使用者名稱和密碼;一個登陸按鍵,和一個Members連結。
在這裡插入圖片描述
(2)check.php

<?php 
	session_start();
	if(isset($_POST['user'])&&isset($_POST['password'])){
		$userid = $_POST['user'];
		$password = $_POST['password'];
		$db = new mysqli('localhost','root','123456','php10');
		//echo "no question";
		if($db->connect_errno <> 0) {
			echo " Can't connect";
			exit();
		}
		$db->query("SET NAMES UTF8");
		$quary = "SELECT *FROM session WHERE name='$userid' AND password='$password'";
		$result = $db->query($quary);

		if ($result === false){
			echo "SQL錯誤";
			exit;
		}
		//var_dump($result);
		if(mysqli_num_rows($result)) {
			$_SESSION['valid_user'] = $userid;//將使用者ID傳給會話變數valid_user;
			//echo "查詢成功";
		}
		$db->close();//關閉資料庫
		if(isset($_SESSION['valid_user'])) {
			echo 'YOU :'.$_SESSION['valid_user'].' <br/>';
			echo '<a href="logout.php">Log out</a><br/>';
		}else{
			if(isset($userid)){
				echo 'Could not log you in.<br/>';
			}else{
				echo "you are not logged in <br/>";
			}
			echo '<a href="authmain.php"> Back to main</a><br/>';
		}
		echo '<a href="memberonly.php">Members</a>';
	}
?>

該程式碼主要是通過連結本地的MySQL,通過獲取到使用者輸入的使用者名稱和密碼,去本地的資料庫查詢是否有該條記錄。查詢成功後將使用者名稱儲存到一個全域性變數中($_SESSION[‘valid_user’] = $userid;)。如果檢測到與資料庫中的使用者名稱和密碼相匹配,則輸出當前使用者名稱資訊,並有一個Log out的連結。該連結作用在後面會講到。
(在我的資料庫中建立一個表,有name,和password兩個屬性,只有一條資料,即唯一可以驗證成功的使用者名稱(1)和密碼(aa)。
我的資料庫資訊
在這裡插入圖片描述
網頁效果
在這裡插入圖片描述在這裡插入圖片描述
(3)memberonly.php

<?php  
	session_start();
	echo "<h1>Member only</h1>";
	if(isset($_SESSION['valid_user']))
		{
			echo 'YOU :'.$_SESSION['valid_user'].'<br/>';
			echo "Member can go there";
		}
	else{
				echo 'Could not log you in.only member<br/>';
		}
		echo '<a href="authmain.php"> Back to main</a>';
?>

該段程式碼主要是通過點選Member這個連結,通過檢測是否為成員使用者,輸出只有成員使用者才能看到的資訊,其他成員若是沒有登陸也會有對應的顯示。
在這裡插入圖片描述在這裡插入圖片描述

(4)logout.php

<?php 
	session_start();
	$old_user = $_SESSION['valid_user'];
	unset($_SESSION['valid_user']);
	session_destroy();
?>
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
		<h1>Log Out</h1>
		<?php 
			if(!empty($old_user)){
				echo "Log out!!<br/>";
			}
			else{
				echo "no in ,no out";			}
		?>
		<a href="authmain.php">Back to log in</a>
</body>
</html>

該段程式碼主要是登出原來的使用者名稱(valid_user),相當於銷燬對話,即當前使用者已不存在,必須重新輸入使用者名稱和密碼才能得到相應的結果(點選log out)。
在這裡插入圖片描述如果現在再點選Back to log in,點選Member則顯示不了只有成員才能看到資訊,因為之前已經被登出!
在這裡插入圖片描述
通過上面的例子,我們會發現要想實現這個機制,必須再HTML檔案的內容輸出之前呼叫session_start();
其大致的工作原理為:
當瀏覽器第一次訪問 PHP 指令碼時,seesion_start() 函式會建立一個唯一的 Session ID(每個客戶端都有一個唯一的標識),並自動通過 HTTP 的響應頭,將這個 Session ID 儲存到客戶端 Cookie 中。同時,也在伺服器端建立一個以 Session ID 命名的檔案,用於儲存這個使用者的會話資訊;
當同一個使用者再次訪問這個網站時,會自動通過 HTTP 的請求頭將 Cookie 中儲存的 Seesion ID 再攜帶過來;
伺服器 PHP 指令碼接受到客戶端請求,這時 session_start() 函式就不會再去分配一個新的 Session ID,而是在伺服器的硬碟中去尋找和這個 Session ID 同名的 Session 檔案,將這之前為這個使用者儲存的會話資訊讀出。(http://www.php.cn/php-weizijiaocheng-391810.html)

原始碼是很簡單,若有網友有什麼看法或者建議,或者有新猿們不明白的函式和程式碼段,歡迎留言,共同討論,共同學習,成長。謝謝