赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > PHP处理Cookie和Session
PHP处理Cookie和Session
一、Cookie存储数据:

由于HTTP本身是一个无状态的连接协议,因此当用户访问一个网站时,也就无法保存和记录每个用户的状态。为了支持客户端与服务器端的这种交互,就需要通过某种技术为用户和网站之间的交互保存状态。为此PHP提供了Cookie和Session两种解决方案,主要功能都是把客户端与服务器关联起来。

1.Cookie概述:

Cookie最根本的作用是帮助站点开发人员保存有关访问者的信息,或者说Cookie是一种保持Web应用程序连续性(会话管理)的方法。因为浏览器和服务器除了在短暂的信息交换阶段以外总是断开的,而用户向服务器发送的每一个请求都是单独处理的,与其他所有请求无关。然而在大多数情况下,都有必要让服务器在用户请求某个页面时对用户进行识别。
当用户浏览某网站时,网站存储在用户机器上的一个小文本文件记录了用户ID、密码、浏览过的网页、停留的时间等信息。当再次访问该网站时,网站通过读取Cookie,获取用户的相关信息,就可以做出相应的动作,如在页面显示欢迎标语,或者让用户不用输入ID、密码就直接登录等。
Cookie的一些常见应用有:网站能够精确地知道有多少人浏览过;网站保存用户的设置,按照用户的喜欢定制网页外观;电子商务网站能够实现像“购物篮”、“快速结账”这样的功能。
Cookie随网页HTTP的Header信息进行传递,浏览器的每一次网页请求都可以伴随Cookie传递。例如,浏览器的打开或网页刷新等操作。服务器将Cookie添加到网页HTTP的header信息中,随网页数据传递到浏览器中,浏览器会根据电脑中的Cookie设置选择是否保存这些数据。如果浏览器不允许Cookie保存,浏览器关闭之后,这些数据就会消失。
Cookie有两种类型:
·临时Cookie:此Cookie只是浏览器上保存一段规定的时间,一旦超过这个规定时间,该Cookie就会被系统清除。
·持续Cookie:此Cookie保存在用户的Cookie文件中,等到下一次用户访问时依然可以调用。
为Cookie设置有效时间可以通过Cookie属性。下表列出了Cookie的属性:


属性名称

说明

name

指定Cookie的名称,必须

value

指定该name对应的值,保存的形式为name=value

expires

指定Cookie的过期日期和时间,保存的形式为expires=日期,必须

path

指定Cookie在哪些路径下有效,默认为“/”,即domain属性指定域名下所有页面有效

domain

指定Cookie作用于的域名

secure

一个布尔值,如果为true表示只在SSL加密连接时才发送Cookie到客户端

由于Cookie是保存在客户端的文件中,因此不适合保存敏感数据。另外,在编写程序时应避免过度依赖Cookie,如果不能获取Cookie值应该有其他实现方案。

2.向Cookie保存数据:

PHP提供了setcookie()函数,可以向Cookie中保存数据。语法格式为:
bool setcookie (string $name[, string $value[, int $expire[, string $path[, string $domain[, int $secure]]]]])
该函数的所有参数中,除了$name参数外都是可选的,如果只有一个$name参数,则表示删除客户端浏览器中名字为$name的Cookie。也可以通过设置为空字符串来跳过一个参数,但$expire和$secure的值必须为整数,不能用空字符串。$expire参数是一个由time()或者mktime()函数返回的UNIX格式时间。$secure表示Cookie只在建立HTTP连接时才发送。
示例:创建一个userkin的Cookie,保存值winxp,在创建一小时(3600秒)内可用
setcookie("userskin", "winxp", time()+3600);
除了使用time()函数外,还可以使用mktime()函数指定过期的时间,该函数的具体格式为:
int mktime([int $hour[, int $minute[, int $second[, int $month[, int $day[, int $year[, int $is_dst]]]]]]])
使用上述格式根据给出的参数返回UNIX时间戳。其中,参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。示例:
setcookie("lastlogintime", "2016-10-10", mktime(0,0,1,10,11,2016));
示例:创建Cookie
setcookie("title", "主题夏令营:英语 篮球 减肥 拓展");
setcookie("category", '夏令营|中小学", time()+7200);
setcookie("more", "http://www.dwenzhao.cn/hobby", time()+7200, "/social", ".dwenzhao.cn", 1);
也可以通过在Cookie名称中使用数组符号来保存数据,这样便可以在数组中添加多个元素到Cookie中,然后一次性获取并处理。示例:
setcookie("video[0]", "2013考研英语基础班视频");
setcookie("video[1]", "2013考研政治基础班视频");
setcookie("video[2]", "国际夏令营精彩视频");
Cookie创建完成后不会立即生效,而是等到请求下一个页面时才生效。这是因为设置好的Cookie会由服务器端传递给客户端,在请求下一个页面时,客户端才能将Cookie取出并传回服务器端。示例:
<?php
  if (isset($_COOKIE['visited'] )) { //判断提交表单的随机数是否相同
     setcookie("visited", "1", mktime()+86400, "/") or die("你的浏览器不支持或者禁用了Cookie");
     echo  "欢迎第一次访问本站";
  }else{
 echo "感谢再次光临本站";
  }
?>
运行上述代码时,如果是第一次访问该页面,因为Cookie没有保存,所以将输出“欢迎第一次访问本站”;当第二次刷新时,Cookie会发生到服务器端,PHP接收到客户端的Cookie得知不是第一次访问,此时输出“感谢再次光临本站”。

3.从Cookie读取数据:

如果用户已经创建了一个Cookie,它的值会自动随PHP发送到客户端浏览器,并且转换为$_COOKIE数组的键值,可以通过键名来获取相应的数据。示例:
<h2>今日头条</h2>
<ul>
   <li>标题:<?php echo $_COOKIE["title"]; ?></li>
   <li>所属分类:<?php echo $_COOKIE["category"]; ?></li>
</ul>  <hr />
<h2>精彩视频</h2>
<?php
 echo "<ul>";
 foreach($_COOKIE["videos"] as $video) { //遍历数组
    echo "<li>$video</li>";
 }
 echo "</ul>";
 ?>
在浏览器中运行PHP文件,可查看显示Cookie数据的运行结果。
Cookie值是由浏览器作为HTTP头的一部分发送的,因此在向浏览器发送任何输出之前,必须设置Cookie值,即使发送一个单独的空格也将无法设置Cookie值。为了避免出现问题,一定要设置Cookie值的PHP脚本放在文件的顶部,并且保证前面没有空白字符。此外,还应该在向浏览器发送输出的echo语句或另一个PHP语句执行之前设置Cookie值。

4.删除Cookie数据:

虽然Cookie有一个过期时间,在创建它之后的某个时刻,它将被自动删除。不过,用户也可以立即删除一个Cookie。要想实现这一点,将Cookie的过期时间设置为过去的一个时间即可。示例:
setcookie("title", "", time()-3600);
这个Cookie的值被指定为一个空字符串。由于这个Cookie不再可用,因此其值也就不重要了。另外,还有一个比较简单的方法:
setcookie("title");

二、Session存储数据:

Session又称为会话,是指一个客户端与服务器交互进行通信的时间间隔,通常指从进入系统到退出系统之间所经过的时间。具体到Web中的Session,就是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间。
因此,利用Session可以管理用户的状态,并将一些数据与它进行关联。

1.概述:

Session解决了HTTP协议无法区分和保存客户端状态的难题,它可以为客户端用户分配一个编号。Session是通过Session ID(简写SID)来分配的。Session ID是服务器端随机生成的Session文件的文件名,因此能够保证其唯一性进而确保Session的安全。
也就是说,当一台Web服务器运行时,可能有若干个用户在浏览这台服务器上的网站。当每个用户首次登录该网站时,服务器会自动的为这个用户分配一个Session ID,来标识这个用户的身份。不同的用户会话信息会由不同的Session对象来保存,因此不必担心两个Session对象会发生冲突。
另外,在一般情况下,Session对象是有生命周期的,即如果在规定的时间内没有对Session对象进行刷新,系统将会终止这些对象。

2.向Session保存数据:

在PHP中,每一个Session都通过调用session_start()函数开始。这个函数检查一个Session是否存在,如果不存在则创建一个新Session。
第一次调用session_start()时,将产生一个Session ID,该ID将所有的会话数据绑定到某个特定用户。当然也可以通过调用session_id()函数手动设置Session ID。语法格式为:
string session_id([string $id])
在调用时如果没有参数将返回当前Session ID;如果提供了参数$id,则当前Session ID将被该值替换。示例:
<h1>读取和设置</h1>
<p>
   <?php session_start(); ?>
   使用session_id("myCustomSessionID")之前<br />
   <?php echo "PHP自动产生的SID:<b>".session_id(); ?></b><br /><br />
   使用session_id("myCustomSessionID")之后<br />
   <?php
      session_id("myCustomSessionID");
      echo "手动指定的SID:<b>".session_id();;
   ?></b>
 </p>
在上述代码中第一次调用session_id()函数时没有指定参数,此时将返回PHP自动产生的Session ID;在第二次调用时指定当前Session ID为“myCustomSessionID”。
创建会话变量的形式为:
$_SESSION[key]=value;
其中,key是字符串类型的变量,value是需要保存到该Session变量中的值。示例:
<?php
    $_SESSION['pdname']="新款手机"; //创建名为pdname的会话变量
?>
上述代码向Session中添加一个名为pdname的会话变量。而要获得Session变量pdname中的值,也只需要使用$_SESSION['username']语句。示例:
<?php
echo "产品名称".$_SESSION['pdname']; //输出“产品名称:新款手机”
?>
示例:创建一个页面计数器
<h2>
<?php
  session_start(); //创建一个Session变量开始一个会话
  if (!isset($_SESSION['counter'] )) {
     $_SESSION['counter'] =1; //计数器设置为1
  }else{
     $_SESSION['counter'] ++; //计数器递增
  }
  echo  "你一共访问本页<b>". $_SESSION['counter'] ."</b>次。";
?>

3.从Session读取数据:

在PHP中可以使用session_start()函数来开始Session。session_start()函数的定义为:
bool session_start(void)
session_start()函数是创建一个新会话,还是继续当前会话,取决于是否拥有SID。开始会话时,只需要使用如下形式调用session_start()函数:
session_start();
在默认状态下,会话不会自动启动,但是可以修改php.ini文件中的session.auto_start参数的值,让会话自动启动。方法是在PHP安装目录中打开php.ini文件,在该文件中找到session.auto_start参数,其默认值为0,修改其值为1,保存后重新启动Apache即可生效。调用phpinfo()函数可以查看PHP的配置效果。
示例:登录模块
创建登录页面login.php,其中包括表单:
<form action="check.php" method="post">
  <table>
<tr>
      <td><label for="login-username">账号:</label></td>
      <td><input type="text" name="username" value="" autocomplete="off" 
          id="login-username" class="input-box"></td>
</tr>
<tr>
      <td><label for="login-password">密码:</label></td>
      <td><input type="password" name="password" value="" autocomplete="off" 
          id="login-password" class="input-box"></td>
</tr>
<tr>
      <td> </td>
      <td><input type="submit" value="立即登录" id="login-submit">
         <input type="button" value="注册" id="login-register"></td>
</tr>
  </table>
</form>
创建接收login.php以post方式提交表单的文件check.php:
<?php
  if (!isset($_POST['username'] ||!isset($_POST['password'] )) {
     echo  "账号和密码都不能为空。<br />";
     echo  "<a href=\"login.php\">单击这里重新登录。</a>";
  }else{
     $name=$_POST['username'] ; //获取username参数的值
     $pass=$_POST['password'] ; //获取password参数的值
     //session_start();
     $_SESSION['username'] =$name; //创建Session变量保存账号
     $_SESSION['userpass'] =$pass; //创建Session变量保存密码
?>
你输入的用户名是:<?php echo $_SESSION['username']; ?><br />
你输入的密码是:<?php echo $_SESSION['userpass']; ?><br />
<?php echo "a href=\"main.php\">单击这里转向首页。</a>";
}?>
上述代码中,check.php文件中接收的用户登录信息保存到Session变量中,然后在页面中输出Session变量中的信息,并提供一个超链接,链接到main.php页面。
main.php页面为登录之后的主页面,显示保存在Session中的信息,代码为:
<?php
  if (!isset($_SESSION['username'] )) {
     echo  "<h3>没有权限访问此页面。</h3>";
     echo  "<a href=\"login.php\">单击这里重新登录。</a>";
  }else{
?>
<h3>欢迎会员:<?php echo $_SESSION['username']; ?></h3>
登录成功,你的密码是:<?php echo $_SESSION['userpass']; ?>。为了账号安全,请定期更换密码。
<?php }?>
在main.php页面中同样输出Session变量中的信息。如果能输出正确信息,则可以证明Session会话变量具有存储值的效果。

4.删除Session数据:

如果关闭浏览器,则当前会话自动中断,打开一个新的浏览器时,将打开一个新的会话。不过,在实际应用中,有时候也需要使用程序中断会话,或者删除会话变量,例如登录之后单击“安全退出”按钮,此时浏览器并没有关闭,所以应手动将保存在Session变量中的用户登录信息删除。
删除会话变量需要使用unset()函数。语法格式为:
unset ($_SESSION[key]);
示例:添加退出登录功能
在登录后的主页面main.php中添加退出链接,代码为:
<h2>欢迎会员:<?php echo &_SESSION['username']; ?>|<a href="exit.php">退出</a></h2>
代码中的exit.php的主要代码为:
当前会员信息:
<ul>
<li>会员名称:<?php echo $_SESSION['username']; ?></li>
<li>会员密码:<?php echo $_SESSION['userpass']; ?></li>
</ul>
正在退出。<br />
unset($_SESSION['username']); //删除保存会员的变量
unset($_SESSION['userpass']); //删除保存密码的变量
?>
退出之后,会员信息如下:
<br />会员名称:<?php echo $_SESSION['username']; ?>
<br />会员密码:<?php echo $_SESSION['userpass']; ?>
unset()函数可以删除一个Session中的数据。如果要一次删除当前Session中的所有数据可以调用session_destroy()函数,如果要删除所有Session中的数据可以调用session_unset()函数。

5.Session数据的编码和解码:

PHP默认情况下是按顺序格式保存Session数据的,并且各个Session变量之间都会以分号隔开。每个数据都由3个部分组成:变量名称、值长度和值。语法格式为:
变量名称|s:值长度:值;
例如:uid|s:6:”somboy”;
除了这种标准格式存储数据外,在PHP中还可以使用session_encode()函数和session_decode()函数手动完成会话数据的编码和解码。
①session_encode()函数:
该函数可以使用手动方式将所有Session变量编码为一个字符串。语法格式为:
string session_encode()
该函数返回值是编码后的字符串。
②session_decode()函数:
session_encode()函数返回的字符串可以通过session_decode()函数解码。语法格式为:
bool session_decode(string $data)
该函数将$data参数中的数据解码并返回最初的格式,如果执行成功则返回true,否则返回false。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659