php使用Cookie实现和用户会话的方法


Posted in PHP onJanuary 21, 2015

本文实例讲述了php使用Cookie实现和用户会话的方法。分享给大家供大家参考。具体分析如下:

PHP 包含了很多的函数,可以用来管理和记录用户信息,包括简单的 cookie 和全方位的用户会话。会话使用 PHP 语言内建的技术,使得保存状态就像是引用超全局变量那样简单。

1.Cookie 简介

我们可以和 PHP 脚本一起使用 cookie 来存储一些关于用户的较小的信息。 Cookie 是由用户浏览器存储的少量数据,它和一个来自服务器或脚本的请求一致。通过一个用户的浏览器,一个单个的主机可以请求保存 20 个 cookie 。每个 cookie 包含一个名字、值和过期日期,以及主机和路径信息。一个单个的 cookie 的大小限制是 4KB 。

在设置了 cookie 之后,只有发出请求的主机能够读取数据,这就保证了用户隐私得到尊重。另外,用户可以配置自己的浏览器通过他接受或是拒绝所有 cookie 的请求。因此, cookie 应该适度地使用,并且在没有设计实现警告用户的一个环境中,不应该作为一个基本元素而依赖。

如果 Web 浏览器配置为存储 cookie ,它将保持基于 cookie 的信息直到过期日期。如果用户使用浏览器浏览符合 cookie 的路径和域的任何页面,它将会把 cookie 重新发送给服务器。随后,一个 PHP 脚本能够访问 cookie , cookie 在环境变量 HTTP_COOKIE 中或者作为 $COOKIE 超全局变量的一部分,我们可以用 3 种方式来访问它们:

echo $_SERVER["HTTP_COOKIE"]; 

echo getenv("HTTP_COOKIE");

echo $_COOKIE["vegetable"];

2.使用 PHP 设置一个 cookie

我们可以用两种方法在一个 PHP 脚本中设置一个 cookie 。首先,用 header() 函数来设置 SetCookie 标头。 Header() 函数需要一个字符串,该字符串随后将包含到服务器响应的标头部分。由于标头会为你自动发送, header() 必须在发送给浏览器的热河输出之前调用。

head("Set Cookie:vegetable=artichoke; expires=Tue,07-Mar-06 14:39:58 GMT;path=/;domain=yourmain.com");

尽管没什么困难,这种设置 cookie 的方法还是需要我们编写一个函数来构建标头字符串。像这个例子那样格式化日期并对名 / 值对进行 URL 编码并不是特别艰难的任务,但它还是一项重复性的工作,因为 PHP 提供了一个函数来做到这些,这就是 setcookie() 。

Setcookie() 函数所做的事情就像它的名字所显示的那样,它输出一个 Set-Cookie 标头。因此,它应该在任何其他内容发送给浏览器之前调用。这个函数接受 cookie 名字、 cookie 值、 UNIX 时间戳格式的过期日期、路径、域,以及一个整数,如果 cookie 仅通过一个安全的连接发送的话,这个整数的值设置为 1. 除了第一个参数以外,这个函数的所有参数都是可选的。

<?php

setcookie ( "vegetable" , "artichoke" , time ()+3600, "/" , ".yourdomain.com" , 0);

 

if ( isset ( $_COOKIE [ "vegetable" ])){

    echo "<p>Hello again, you have chosen: " . $_COOKIE [ "vegetable" ]. ".</p>" ;

}

else {

    echo "<p>Hello you. This may be your first visit.</p>" ;

}

?>

即便我们在脚本第一次运行的时候设置 cookie , $_COOKIE["vegetable"] 变量也不会在这时候创建。由于只有当浏览器将一个 cookie 发送到服务器的时候,才会读取它,因此,直到用户重新访问这个域内的一个页面的时候,我们才能够读取它。
正式地讲,要删除一个 cookie ,只需要调用带有 cookie 名字参数的 setcookies():
setcookie("vegetable");
然而,这种方法并不总是奏效,并且不能依赖这种方法。相反,要删除一个 cookie ,使用一个确定已经过期的时间来设置 cookie ,这种方法是最安全的:
Setcookie("vegetable", "", time()-60, "/", "yourdomain.com", 0);
还要确保传递给 setcookie() 与最初设置 cookie 时候所使用的是相同的路径、域和安全参数。

3.会话函数概览

当一个访客访问一个支持会话的页面,要么分配一个新的标识符,要么这个用户和之前的访问已经建立的一个标识符重新关联。任何已经和会话相关联的变量,都通过 $_SESSION 超全局变量可供你的代码使用。
会话状态通常存储在一个临时文件中,尽管你可以使用一个名为 session_set_save_handler() 的函数实现数据库存储。

4.开始一个会话

<?php

session_start ();

echo "<p>Your session ID is " . session_id (). "</p>" ;

?>

5.使用会话变量

在每一个 PHP 文档中访问一个唯一的会话标识符只是会话功能的开始。当一个会话启动后,我们可以在超全局变量 $_SESSION 中存储任意多个变量,然后在任何支持会话的页面上访问它们。

下面程序向超全局变量 $_SESSION 添加了两个变量:

<?php

session_start ();

$_SESSION [ "product1" ] = "Sonic Screwdriver" ;

$_SESSION [ "product2" ] = "HAL 2000" ;

echo "The products have been registered." ;

?>

在用户移动到一个新的页面之前,上面程序的神奇之处不会体现出来。下面的程序创建了一个单独的 PHP 脚本,这个脚本访问存储在超全局变量 $_SESSION 中的变量。
<?php

session_start ();

echo "Your chosen products are:" ;

echo "<ul>" ;

echo "<li>" . $_SESSION [ "product1" ]. "</li>" ;

echo "<li>" . $_SESSION [ "product2" ]. "</li>" ;

echo "</ul>" ;

?>

下列程序清单创建一个表单,它允许一个用户来选择多个产品。我们可以使用会话变量来创建一个基本的购物车。
arraysession.php:
<?php

session_start ();

?>

<html>

<head>

<title> Storing an array with a session </title>

</head>

<body>

<h1> Product Choice Page </h1>

<?php

if ( isset ( $_POST [ "form_products" ])){

    if (! empty ( $_SESSION [ "products" ])){

       $products = array_unique (

       array_merge ( unserialize ( $_SESSION [ "products" ]),

       $_POST [ "form_produces" ]));

    }

    else

    {

       $_SESSION [ "products" ] = serialize ( $_POST [ "form_products" ]);

    }

    echo "<p>Your products have been registered!</p>" ;

}

?>

<form method = "POST" action = " <?php echo $_SERVER [ "PHP_SELF" ]; ?> " >

<p><strong> Select some products: </strong><br>

<select name = "form_product[]" multiple = "multiple" size = "3" >

<option value = "Sonic Screwdriver" > Sonic Screwdriver </option>

<option value = "Hal 2000" > Hal 2000 </option>

<option value = "Tardis" > Tardis </option>

<option value = "ORAC" > ORAC </option>

<option value = "Transporter bracelet" > Transporter bracelet </option>

</select>

<p><input type = "submit" value = "choose" /></p>

</form>

<p><a href = "session1.php" > go to content page </a></p>

</body>

</html>

 
session1.php:
<?php

/*

  * Created on 2011-1-19

  *

  * To change the template for this generated file go to

  * Window - Preferences - PHPeclipse - PHP - Code Templates

  */

  session_start ();

?>

<html>

<head>

<title> Accessing session variables </title>

</head>

<body>

<h1> Content Page </h1>

<?php

if ( isset ( $_SESSION [ "products" ])){

    echo "<strong>Your cart:</strong><ol>" ;

    foreach ( unserialize ( $_SESSION [ "products" ]) as $p ){

       echo "<li>" . $p . "</li>" ;

    }

    echo "</ol>" ;

}

?>

<p><a href = "arraysession.php" > return to product choice page </a></p>

</body>

</html>

6.在查询字符串中传递会话 ID

7.销毁会话和重置变量

8.在一个带有注册用户的环境中使用会话

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
1.PHP简介
Oct 09 PHP
php下实现伪 url 的超简单方法[转]
Sep 24 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
功能强大的PHP发邮件类
Aug 29 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
PHP中引用类型和值类型功能与用法示例
Feb 26 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 #PHP
Codeigniter的一些优秀特性总结
Jan 21 #PHP
PHP 生成N个不重复的随机数
Jan 21 #PHP
PHP 实现判断用户是否手机访问
Jan 21 #PHP
PHP中imagick函数的中文解释
Jan 21 #PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 #PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 #PHP
You might like
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
php简单的上传类分享
2016/05/15 PHP
js 居中漂浮广告
2010/03/21 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
webpack4实现不同的导出类型
2019/04/09 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
详解python的四种内置数据结构
2019/03/19 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
联强国际笔试题面试题
2013/07/10 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
写自荐信的七个技巧
2013/10/15 职场文书
正科级干部考察材料
2014/05/29 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
教师工作表现自我评价
2015/03/05 职场文书
今日说法观后感
2015/06/08 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
python 模块重载的五种方法
2021/04/24 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
Python序列化模块JSON与Pickle
2022/06/05 Python