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 相关文章推荐
分享下PHP register_globals 值为on与off的理解
Sep 26 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
Yii学习总结之安装配置
Feb 22 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
php中使用GD库做验证码
Mar 31 PHP
php+jQuery+Ajax简单实现页面异步刷新
Aug 08 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
写出高质量的PHP程序
2012/02/04 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
原生js实现日历效果
2020/03/02 Javascript
使用PDB简单调试Python程序简明指南
2015/04/25 Python
Django中的Signal代码详解
2018/02/05 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
Django进阶之CSRF的解决
2018/08/01 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
简单了解如何封装自己的Python包
2020/07/08 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
搞笑创意广告语
2014/03/17 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
小学教研工作总结2015
2015/05/13 职场文书
海底两万里读书笔记
2015/06/26 职场文书