您好,欢迎访问一九零五行业门户网

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

本文实例讲述了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. 除了第一个参数以外,这个函数的所有参数都是可选的。
代码如下:
setcookie ( vegetable , artichoke , time ()+3600, / , .yourdomain.com , 0);
if ( isset ( $_cookie [ vegetable ])){
    echo
hello again, you have chosen: . $_cookie [ vegetable ]. .
;
}
else {
    echo hello you. this may be your first visit.
;
}
?>
即便我们在脚本第一次运行的时候设置 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.开始一个会话
代码如下:
session_start ();
echo
your session id is . session_id ().
;
?>
5.使用会话变量在每一个 php 文档中访问一个唯一的会话标识符只是会话功能的开始。当一个会话启动后,我们可以在超全局变量 $_session 中存储任意多个变量,然后在任何支持会话的页面上访问它们。
下面程序向超全局变量 $_session 添加了两个变量:
代码如下:
session_start ();
$_session [ product1 ] = sonic screwdriver ;
$_session [ product2 ] = hal 2000 ;
echo the products have been registered. ;
?>
在用户移动到一个新的页面之前,上面程序的神奇之处不会体现出来。下面的程序创建了一个单独的 php 脚本,这个脚本访问存储在超全局变量 $_session 中的变量。
代码如下:
session_start ();
echo your chosen products are: ;
echo
;
echo . $_session [ product1 ]. ;
echo . $_session [ product2 ]. ;
echo ;
?>
下列程序清单创建一个表单,它允许一个用户来选择多个产品。我们可以使用会话变量来创建一个基本的购物车。
arraysession.php:
代码如下:
session_start ();
?>
storing an array with a session
product choice page
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 your products have been registered!
;
}
?>
select some products:
sonic screwdriver
hal 2000
tardis
orac
transporter bracelet
go to content page
session1.php:
代码如下:
/*
  * created on 2011-1-19
  *
  * to change the template for this generated file go to
  * window - preferences - phpeclipse - php - code templates
  */
  session_start ();
?>
accessing session variables
content page
if ( isset ( $_session [ products ])){
    echo your cart: ;
    foreach ( unserialize ( $_session [ products ]) as $p ){
       echo . $p . ;
    }
    echo ;
}
?>
return to product choice page
6.在查询字符串中传递会话 id7.销毁会话和重置变量
8.在一个带有注册用户的环境中使用会话
希望本文所述对大家的php程序设计有所帮助。
其它类似信息

推荐信息