PHP 第七章

来源:互联网 发布:台北北投温泉攻略 知乎 编辑:程序博客网 时间:2024/04/18 22:15

这章主要讲的是记录用户的方法

多个受保护的页面如何只登陆一次就记住用户呢,这种情况在浏览网站的时候经常见到,例如你玩游戏去官网管理自己账号的资料,只有登录了你才可以见到自己的账号信息,邮箱认证,修改密码等等功能分别对应于一个php脚本,这写脚本都是在知道你的账号密码为前提才能运作,但是并不见到你每访问一个邮箱认证你要输一次账号密码,访问修改密码页面又要输一次账号密码,而是输了一次账号密码之后那些页面都知道是哪一个用户在访问自己,并且有注销的功能,这章的内容就是解决这个问题。 

方法1:HTTP认证

每个受限制的页面都以一段HTTP认证开头,如果你已经通过认证就可以畅通浏览所有页面,没通过认证就要先通过认证之后才能访问页面,就算你去那个页面作为开始,只要你没通过验证,一开始都会先弹出个登陆窗口叫你填写资料的。

方法2:利用Cookie

首先cookie是浏览器存储在用户计算机上的小段数据。它和PHP变量类似都是?=?这样的对,不同的地方是有一个到期时间,到了这个时间它才会销毁。


设置cookie的值:setcookie('username',$username,time()+(60*60*1));

查看cookie的值:$_COOKIE['username']

删除cookie的值:setcookie('username','',time()-1);

if(!isset($_COOKIE['user_id']))//不存在cookie{if(isset($_POST['submit']))//提交表单:{$dbc=mysqli_connect('localhost','root','root','mismatch');$username=mysqli_real_escape_string($dbc,trim($_POST['username']));$password=mysqli_real_escape_string($dbc,trim($_POST['password']));if($username!='' && $password!=''){<span style="white-space:pre"></span>$query="SELECT * FROM mismatch_user WHERE username='$username' AND password=SHA('$password');";$result=mysqli_query($dbc,$query);if(mysqli_num_rows($result)==1){$row=mysqli_fetch_array($result);setcookie('user_id',$row['user_id'],time()+(60*30));setcookie('username',$row['username'],time()+(60*30));$home_url="http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/index.php";header('Location: '.$home_url);}else{$flag=true;$err_msg='<p class="error">your username or password maybe wrong.</p>';}}else{$flag=true;$err_msg='<p class="error">please enter your username and password.</p>';}}else//没提交表单的情况:{$flag=true;$err_msg='<p class="error">please enter your username and password.</p>';}}else//已经登陆{$home_url="http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/index.php";header('Location: '.$home_url);}if($flag){ ?>//显示表单<?php }
其他需要账号密码的页面就只需要在一开始的地方看看$_COOKIE['username']存不存在,不存在就导航到登陆页面,存在就可以利用这个值来从数据库获取所有有关的信息,由于cookie是保存在客户端上的,所以不同浏览器运行脚本的时候肯定是针对于该浏览器所在的计算机的cookie的信息,举个例子就是A在A电脑上登陆写的账号密码保存在A电脑cookie中,运行其他页面的时候访问cookie得到的是A电脑上保存的A的账号,同理B在B电脑上运行得到的是B中cookie的B的账号,所以不会混乱。


方法3:使用会话session

session是保存在服务器端的,每个浏览器访问服务器的时候,开始会话函数都会为每个浏览器实例建立一个独一无二的存数据的会话,所以用这样的办法同样可以搞混论了A访问到B的账号,因为服务器上有A浏览器专用的会话,运行脚本的时候是使用A专用的会话变量,那肯定是用A的账号。同时session和cookie类似,也是类似于PHP变量。

设置session变量:$_SESSION['username']=$username;

获得session变量:session_start(); $_SESSION['username'];

session_start();函数如果不存在会话就创一个,存在就访问存在那个

删除session变量: $_SESSION=array(); 等于一个空数组,再关闭会话session_destroy();

session_destroy()会销毁一个会话,但是不销毁会话的变量,所以要手动赋予空数组来删除变量,同时在允许使用cookie的电脑中,会话会自动创建一个$_COOKIE[session_name()]的变量,这个变量也要删除掉

删除浏览器,会话就会结束,会话变量也会删除掉,这点需要注意

所以有的时候需要会话与cookie一起使用

0 0