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 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
Memcache 在PHP中的使用技巧
Feb 08 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 PHP
php数组去除空值函数分享
Feb 02 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
Feb 04 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
PHP中命名空间的使用例子
Mar 22 PHP
Laravel框架查询构造器简单示例
May 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
2017/08/18 PHP
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
会计电算化大学生职业规划书
2014/02/05 职场文书
中班开学寄语
2014/04/04 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
超市开店计划书
2014/09/15 职场文书
医院党建工作总结2015
2015/05/26 职场文书
毕业论文指导老师意见
2015/06/04 职场文书