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)
源代码是很简单,若有网友有什么看法或者建议,或者有新猿们不明白的函数和代码段,欢迎留言,共同讨论,共同学习,成长。谢谢