Chinaunix首页 | 论坛 | 博客
  • 博客访问: 446271
  • 博文数量: 96
  • 博客积分: 6045
  • 博客等级: 大校
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-03 11:29
文章分类

全部博文(96)

文章存档

2014年(1)

2012年(22)

2011年(23)

2010年(31)

2008年(1)

2007年(18)

分类:

2007-08-09 12:09:30

摘 要:介绍了web站点开发中的session技术,并通过一个用户认证的实例说明了session在php中的使用方法。
关键词:web;session;php
我们知道,HTTP(HyperText Transfer Protocal)是一种无状态协议,以此为核心的web是一种无状态的连接程序,无法记住与一个网站连接用户的身份和浏览状态,所以对web页的请求被看成是唯一和独立的连接,它与之前的连接无任何关系。因此就要求一种能够记住状态的方法,能够跟踪用户的连接并且保存连接特定数据的东西。“cookie”就是为此而设计的,人们通常使用来实现这一功能。
cookie允许Web站点在客户端通过一个文件(cookie文件)来保存客户特定信息,任何时候,web请求都可以从该文件中取出信息。但基于cookie的解决方案存在一个问题,那就是它要求cookie能够被客户所接受,如果用户关闭了cookie,用户信息将无法保存。另一种解决办法就是使用“session”,当一个客户访问一个Web站点时,用它来保存特定的一小块数据。这个会话(session)数据在整个访问期间被保存下来。一个session可以被看成一个信息篮,它保存着主机的变量对。这些变量对在整个访间期间都存在,并且可以在任何时刻被处理。这个方法对协议的无状态的特点提供了一流的解决办法,并且在今天很多大型的网站上,可以跟踪和保存信息,用于个人和商业交易。
1 什么是session
session是微软首先提出的,在asp中最先集成。由于session的采用,大大方便了web开发员的工作。一时间asp风靡全球。现在php4也加入session的支持,再度显示出开放代码的强大力量。和cookie类似,设计session的目的也是为了在一个访问期间在不同的页面间传输数据以解决http协议无状态的问题,但Session更加简单、更加安全。
php3.0版本不支持session。虽然php具有执行速度快,使用灵活,功能强大等优点,但因为session的问题,使很多站点的开发放弃了php。在php3中可以使用PHPLIB来实现session方案,但比较麻烦。php4的出现让php在session问题上有了转机。虽然它的session实现还不是很理想(主要是效率问题),但毕竟是它自己实现的,而且可以实际使用。
每一个被创建的session都有一个唯一的标识串,叫session ID,这个串被发送到客户端,同时在服务端也生成了同样唯一标识串的入口,或者放在文本文件或者在一个数据库中。然后就可以注册session变量,这些普通的变量可以保存文本或数值信息,可以通过session被读出或者写入。
就其功能和意义上说,session其实就是用户一次会话的过程,从一个页面注册一个变量开始(如login),直到logout、关闭浏览器或者超时,为一个session的生命期。在此期间,可以包括数次http请求和应答。Web应用程序可以一直使用在这个ID下注册的变量直至session结束。
2 php4中的session函数
php4为我们提供了使用session的几个库函数,常用的有:
boolean session_start(void) 初始化一个新的session。
boolean session_destroy(void) 结束当前的session会话。
string session_name(string[name]) 取得或重新配置当前的session名称。
string session_module_name(string[module])
 取得或重新配置当前的session模块。
string session_save_path(string [path]) 取得或重新配置当前存放session的路径。
string session_id(string [id]) 取得或者重新配置当前存放session的代号。
boolean session_register(string name) 注册一个全局变量到当前的session之中。
boolean session_unregister(string name) 在当前的session中删除一个全局变量。
boolean session_is_registered(string name) 检查当前的session中指定变量是否已注册。
当然,由于源代码的公开,很多优秀的程序员为session编写了许多扩展的函数,这些函数的代码都是公开和免费使用的,任何人在使用时都可以对这些函数进行任意修改而不会影响自己的php程序。
需要说明的是,在windows平台下,php4.01pl2以前的版本会出现设置session.save_path后出错的情况,这是php的一个bug,在php4.01pl2及以后已经修正了。如果使用以前的版本,可以将session.save_path设为“./”,或“/session_path_name”,并在放置php脚本的当前盘根目录下建一个名为session_path_name的目录。
3 使用session的一个例子
下面通过一个简单的用户认证的例子说明如何在php中使用session。
在一些web页中经常需要对用户进行认证,确定用户是否拥有使用某一页面或数据的权限。以下代码是一个用户登录和验证的示例程序,旨在说明session的使用方法。实际应用时,要复杂的多。
程序如下:
1)用户登录
session_start(); //初始化一个session
$db=mysql_connect('localhost','root'); //连接数据库
mysql_select_db(‘database_name’,’db’);  //选择数据库
$query_str="SELECT userid FROM reguser WHERE userid='$userid' AND passwd='$passwd' ";
//$userid和$passwd 是登录form传递过来的用户名和密码
$user_query=mysql_query($query_str,$db);
    $user_info_arr=mysql_fetch_array($user_query);
if($user_info_arr['user']==""){
  $msg="非注册用户或密码错误,登录失败!";
$reguser="";  //登录失败,将用户信息变量设置为空
}
else {
$msg="欢迎使用!";
$reguser= $user_info_arr[0];  //登录成功,设置用户信息变量
}
…… //这里可显示登录信息
session_register("reguser");  //注册session变量,注意变量前没有“$”符号
?>
2)在其它页面中检查用户是否已经登录
session_start();
if(isset($reguser)&&$reguser!="")  //用户已登录
{
echo "欢迎光临";
}
else echo "请先注册"; //用户未登录
?>
3)退出后注销session
session_destroy();
?>
 
阅读(1862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~