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 相关文章推荐
set_include_path在win和linux下的区别
Jan 10 PHP
网友原创的PHP模板类代码
Sep 07 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
利用PHP实现图片等比例放大和缩小的方法详解
Jun 06 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
php实现在服务器端调整图片大小的方法
Jun 16 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
PHP框架性能测试报告
May 08 PHP
PHP实现图片批量打包下载功能
Mar 01 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
第七节 类的静态成员 [7]
2006/10/09 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
JavaScript File分段上传
2016/03/10 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现的括号匹配判断功能示例
2018/08/25 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
python实现一个猜拳游戏
2020/04/05 Python
python mysql中in参数化说明
2020/06/05 Python
Python容器类型公共方法总结
2020/08/19 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
商务日语毕业生自荐信范文
2013/11/14 职场文书
群众路线领导对照材料
2014/08/23 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
初中思想品德教学反思
2016/02/24 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers