会话控制
http 是基于无连接的网络协议, 每一次访问, 对于服务器来说, 都是全新的
就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的,这种无状态的的好处是快速,但是因为每次连接都是全新的,为了让用户体验更好,为了某个域名下的所有网页都能共享某些数据信息,就要用到cookie
或者session
。
cookie与session的区别
cookie
1.它是保存在客户端,变量名为$_COOKIE
,
2.设置它的专用函数为setcookie(键名,键值,time()设置过期时间)
3.它生效分为两步:第一步由PHP发出命令到浏览器,第二步由浏览器完成COOKIE的写入
session
1.它是保存在服务器端
2.变量:$_SESSION
3.使用的时候必须先开启会话,命令为session_start()
4.删除命令:session_destory()
会话实例(cookie)
首先新建一个登录表单
HTML代码
<!-- 这行PHP代码是判断COOKIE是否已经写入,如果已经写入说明已经登录,就不再允许重复登录 --><?phpif(filter_has_var(INPUT_COOKIE,'user')){ exit('<script>alert("请不要重复登录");location.href="index.php"</script>'); // exit('<script>alert("请不要重复登录");location.href="index.php"</script>');}?> <div> <!-- 跳转地址需要给一个get值,方便判断跳转链接的合法性 --> <form action="handle.php?action=login" method="POST"> <span>用户登录</span> <span> <label for="username">用户名:</label> <input type="text" name="username" id="username" require> </span> <span> <label for="password">密 码:</label> <input type="password" name="password" id="password" require> </span> <button>提交</button> </form> <a href="register.php">没有账号,注册一个</a> </div>
图:大概是这样的
然后建一个服务器数据文件
例:感觉比较关键,我就全写上来了
<?php//获取到跳转链接的action值$action = filter_input(INPUT_GET, 'action', FILTER_SANITIZE_STRING);//设置允许访问的链接(文件)$url = filter_input(INPUT_SERVER, 'HTTP_REFERER');//获取文件路径到目录位置$retname = dirname(filter_input(INPUT_SERVER, 'HTTP_REFERER'));//设置一个数组,使用获取到的文件目录拼接上允许访问的文件名$URLS = [$retname . '/login.php', $retname . '/register.php', $retname . '/index.php'];//因为没学习数据库,设置一个用户数据,来进行验证$users = [ [ 'id' => 1, 'name' => 'admin', 'password' => '7c4a8d09ca3762af61e59520943dc26494f8941b', 'email' => 'admin@qq.com' ], [ 'id' => 2, 'name' => 'test', 'password' => '7c4a8d09ca3762af61e59520943dc26494f8941b', 'email' => 'test@qq.com' ]];//判断访问链接是否合法if (in_array($url, $URLS)) { //链接如果合法则用$_GET获取到的action值,来判断跳转过来的是什么页面 switch ($action) { // 如果action=login为登录页面跳转 case 'login': //先验证链接的合法性 if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { //获取用户名与密码 $username = filter_var(filter_input(INPUT_POST, 'username'), FILTER_SANITIZE_STRING); //密码要嵌套加密 $password = sha1(filter_input(INPUT_POST, 'password')); //测试拿到数据没 // echo $username,$password; // array_filter(数组,(function(循环数值接收变量){输出语句})) //使用array_filter来测试用户登录的用户名与密码是否存在于服务器当中 $result = array_filter($users, function ($value) use ($username, $password) { return $username === $value['name'] && $password === $value['password']; }); // 测试数据有没有拿到 // echo '<pre>'.print_r($result,true).'</pre>'; //因为每个用户相对应的信息只有一条,所以使用count来查询获取到的数组长度,如果为一,则正确 if (count($result) === 1) { // 设置COOIKE,键名为USER,因为获取到的数据为数组,使用serialize,把数据序列化 setcookie('user', serialize(array_pop($result))); // 测试打印COOKIE是否拿到 // echo $_COOKIE['user']; echo '<span>登录成功</span><br><a href="index.php">点击跳转到首页</a>'; } else { echo '<a href="login.php">用户名或者密码错误重新输入</a><br><a href="register.php">没有账号请注册</a>'; } } else { exit('非法请求'); } break; //action=logout,为退出页面请求 case 'logout': // 先检测是否在登录状态(就是查看有没有cookie) if (filter_has_var(INPUT_COOKIE, 'user')) { // 如果有删除cookie,time()只要是负数就可以删除,正数为保存时间 setcookie('user', null, time() - 3600); exit('<script>alert("已退出登录");location.href="index.php"</script>'); } else { exit('<script>alert("不在登录状态");location.href="index.php"</script>'); } break; //如果action=register为注册页面 case 'register': //判断表单发送方式是否为POST if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { //获取表单发送的username $name = filter_input(INPUT_POST, 'username'); //获取表单发送的password $password = sha1(filter_input(INPUT_POST, 'password1')); //获取表单发送的email $email = filter_var(filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL), FILTER_SANITIZE_EMAIL); // echo $email; $id = 3; //把获取到的数据压缩为一个数组 $date = compact('id', 'name', 'password', 'email'); // array_push($users,$date); // echo '<pre>'.print_r($users,true).'</pre>'; // echo count($users); //把数组放进预先设置好的用户数据里面,然后判断是否只获取到一条用户数据(用户数据一次只允许获得一条) if(count(array_push($users,$date))===1){ echo('<script>alert("注册成功请登录");location.href="login.php"</script>'); }else{ exit('<script>alert("数据错误重新输入");location.href="register.php"</script>'); } } }}
开始验证
图1输入预先在PHP文件设置好的用户名与密码
图2验证通过
图3用户密码错误
图4判断是否重复登录
登录验证完毕,然后验证COOKIE是否写入
用HMTL建一个首页
<?php// 判断是否已经登录,如果登录了,就把COOKIE的值拿到,然后把登录更改为退出if(filter_has_var(INPUT_COOKIE,'user')){ $user = unserialize(filter_input(INPUT_COOKIE,'user'));?> <div class="header"> <a href="">我的测试页面</a> <!-- 判断是否登录,isset()函数,如果'变量'存在并且值不是'NULL'则返回 TRUE,否则返回 FALSE。 --> <?php if(isset($user)):?> <!-- 如果值存在则输出用户名,与退出 --> <a href="handle.php?action=logout"><span><?=$user['name']?></span>退出</a> <?php else:?> <a href="login.php">登录</a> <a href="register.php">注册</a> <?php endif;?> </div>
图:未登录状态大概是这样的
图2:登录通过,并检测到有写入COOKIE
使用session修改
要使用session一定要记住,在每个页面开始都要写上session_start()来开启会话
首页的修改
<?php//使用session要先开始对话session_start();//这里判断是否登录直接就用isset()函数,来查看session里面是否包含有user键if(isset($_SESSION['user'])){ //如果有直接拿到数据就行 $user = $_SESSION['user'];}// if(filter_has_var(INPUT_COOKIE,'user')){// $user = unserialize(filter_input(INPUT_COOKIE,'user'));// // 打印调试获取到的COOKIE是不是正确// // print_r($user);// }?><body> <div class="header"> <a href="">我的测试页面</a> <!-- 上面判断了数据并赋值给$user,这里判断是否有$user --> <?php if(isset($user)):?> <!-- 如果有判断为登录状态,把登录改为退出即可,使用$user['name']输出用户名,表示是谁登录的 --> <a href="handle.php?action=logout"><span><?=$user['name']?></span>退出</a> <?php else:?> <a href="login.php">登录</a> <a href="register.php">注册</a> <?php endif;?> </div></body></html>
最终所达到的效果是一样的
图1
图2
session的使用相对简单一点,不需要使用过滤器来获取数据,直接使用变量调用就行
附上笔记= = 比较潦草,就是怕忘记了
今天练习了过后,咦,,发现我也会了,感觉离目标越来越近了。数据验证的大体思路会了,在以后要写的时候,一开始就把思路离清楚,需要去验证些什么,大概要怎么验证。思路有了,其他的还远嘛!加油!