php使用Cookie实现和用户会话的方法
本文实例讲述了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"]; echogetenv("HTTP_COOKIE"); echo$_COOKIE["vegetable"];
2.使用PHP设置一个cookie
我们可以用两种方法在一个PHP脚本中设置一个cookie。首先,用header()函数来设置SetCookie标头。Header()函数需要一个字符串,该字符串随后将包含到服务器响应的标头部分。由于标头会为你自动发送,header()必须在发送给浏览器的热河输出之前调用。
head("SetCookie:vegetable=artichoke;expires=Tue,07-Mar-0614:39:58GMT;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>Helloagain,youhavechosen:".$_COOKIE["vegetable"].".</p>"; } else{ echo"<p>Helloyou.Thismaybeyourfirstvisit.</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>YoursessionIDis".session_id()."</p>"; ?>
5.使用会话变量
在每一个PHP文档中访问一个唯一的会话标识符只是会话功能的开始。当一个会话启动后,我们可以在超全局变量$_SESSION中存储任意多个变量,然后在任何支持会话的页面上访问它们。
下面程序向超全局变量$_SESSION添加了两个变量:
<?php session_start(); $_SESSION["product1"]="SonicScrewdriver"; $_SESSION["product2"]="HAL2000"; echo"Theproductshavebeenregistered."; ?>
在用户移动到一个新的页面之前,上面程序的神奇之处不会体现出来。下面的程序创建了一个单独的PHP脚本,这个脚本访问存储在超全局变量$_SESSION中的变量。
<?php session_start(); echo"Yourchosenproductsare:"; echo"<ul>"; echo"<li>".$_SESSION["product1"]."</li>"; echo"<li>".$_SESSION["product2"]."</li>"; echo"</ul>"; ?>
下列程序清单创建一个表单,它允许一个用户来选择多个产品。我们可以使用会话变量来创建一个基本的购物车。
arraysession.php:
<?php session_start(); ?> <html> <head> <title>Storinganarraywithasession</title> </head> <body> <h1>ProductChoicePage</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>Yourproductshavebeenregistered!</p>"; } ?> <formmethod="POST"action="<?phpecho$_SERVER["PHP_SELF"];?>"> <p><strong>Selectsomeproducts:</strong><br> <selectname="form_product[]"multiple="multiple"size="3"> <optionvalue="SonicScrewdriver">SonicScrewdriver</option> <optionvalue="Hal2000">Hal2000</option> <optionvalue="Tardis">Tardis</option> <optionvalue="ORAC">ORAC</option> <optionvalue="Transporterbracelet">Transporterbracelet</option> </select> <p><inputtype="submit"value="choose"/></p> </form> <p><ahref="session1.php">gotocontentpage</a></p> </body> </html>
session1.php:
<?php /* *Createdon2011-1-19 * *Tochangethetemplateforthisgeneratedfilegoto *Window-Preferences-PHPeclipse-PHP-CodeTemplates */ session_start(); ?> <html> <head> <title>Accessingsessionvariables</title> </head> <body> <h1>ContentPage</h1> <?php if(isset($_SESSION["products"])){ echo"<strong>Yourcart:</strong><ol>"; foreach(unserialize($_SESSION["products"])as$p){ echo"<li>".$p."</li>"; } echo"</ol>"; } ?> <p><ahref="arraysession.php">returntoproductchoicepage</a></p> </body> </html>
6.在查询字符串中传递会话ID
7.销毁会话和重置变量
8.在一个带有注册用户的环境中使用会话
希望本文所述对大家的php程序设计有所帮助。