<p> 综述</p><p> PHP会话即SESSION是指用户从进入网站到关闭网站这段时间内活动的一种机制,它提供了所有网页都共同使用的公共变量存贮机制。那么SESSION到底有什么用处呢?网上购物时大家都用过购物车,你可以随时把你选购的商品加入到购物车中,最后再去收银台结帐。在整个过程中购物车一直扮演着临时存贮被选商品的角色,用它追踪用户在网站上的活动情况,这就是SESSION的作用。</p><p> SESSION的发明填补了HTTP协议的局限,HTTP协议被认为是无状态协议,当它在服务端完成响应之后,服务器就失去了与该浏览器的联系。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。</p><p> 在PHP3版本未直接提供session功能,我们只能用其它办法来实现,比如用PHPLIB。如果说PHP4与PHP3相比,它最大的进步就是提供了SESSION。</p><p> Session基础知识</p><p> 要使用session需要PHP4.1以上的版本,而且需要把php.ini中的register_globle=Off设成register_globle=On。另外,session.cookie_path = / 这行不易更改。</p><p> PHP中的session默认情况下是使用客户端的Cookie。当客户端的Cookie被禁用时,会自动通过Query_String来传递。</p><p> Php处理会话的函数一共有11个,我们详细介绍一下将要用到几个函数。</p><p> 1、 session_start</p><p> 函数功能:开始一个会话或者返回已经存在的会话。</p><p> 函数原型:boolean session_start(void);</p><p> 返回值:布尔值</p><p> 功能说明:这个函数没有参数,且返回值均为true。最好将这个函数置于最先,而且在它之前不能有任何输出,否则会报警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3</p>
<p> </p>
<p> 2、 session_register</p><p> 函数功能:登记一个新的变量为会话变量</p><p> 函数原型:boolean session_register(string name);</p><p> 返回值:布尔值。</p><p> 功能说明:这个函数是在全局变量中增加一个变量到当前的SESSION中,参数name就是想要加入的变量名,成功则返回逻辑值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式来取值或赋值。</p><p> 3、 session_is_registered</p><p> 函数功能:检查变量是否被登记为会话变量。</p><p> 函数原型:boobean session_is_registered(string name);</p><p> 返回值:布尔值</p><p> 功能说明:这个函数可检查当前的session之中是否已有指定的变量注册,参数name就是要检查的变量名。成功则返回逻辑值true。</p><p> 4、 session_unregister</p><p> 函数功能:删除已注册的变量。</p><p> 函数原型:boolean session_session_unregister(string name);</p><p> 返回值:布尔值</p><p> 功能说明:这个函数在当前的session之中删除全局变量中的变量。参数name就是欲删除的变量名,成功则返回true.</p><p> 5、 Session_destroy</p><p> 函数功能:结束当前的会话,并清空会话中的所有资源。</p><p> 函数原型:boolean session destroy(void);</p><p> 返回值:布尔值。</p><p> 功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true</p><p> 上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:</p><p> 6、 session_encode</p><p> 函数功能:sesssion信息编码</p><p> 函数原型:string session_encode(void);</p><p> 返回值:字符串</p><p> 功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是变量名 s:12代表变量a的值"it is a test的长度是12 变量间用分号”;”分隔。</p>
<p> </p>
<p> 7、 session_decode</p><p> 函数功能:sesssion信息解码</p><p> 函数原型:boolean session_decode (string data)</p><p> 返回值:布尔值</p><p> 功能说明:这个函数可将session信息解码,成功则返回逻辑值true</p><p> 8、 session_name</p><p> 函数功能:存取当前会话名称</p><p> 函数原型:boolean session_name(string [name]);</p><p> 返回值:字符串</p><p> 功能说明:这个函数可取得或重新设置当前session的名称。若无参数name则表示获取当前session名称,加上参数则表示将session名称设为参数name</p><p> 9、 session_id</p><p> 函数功能:存取当前会话标识号</p><p> 函数原型:boolean session_id(string [id]);</p><p> 返回值:字符串</p><p> 功能说明:这个函数可取得或重新设置当前存放session的标识号。若无参数id则表示只获取当前session的标识号,加上参数则表示将session的标识号设成新指定的id</p><p> 10、 session_unset</p><p> 函数功能:删除所有已注册的变量。</p><p> 函数原型:void session_unset (void)</p><p> 返回值:布尔值</p><p> 功能说明:这个函数和Session_destroy不同,它不结束会话。就如同用函数session_unregister逐一注销掉所有的会话变量。</p><p> 编程思路</p><p> 在社区、论坛中,我们常能看到当前在线的会员,使访问者有宾至如归之感。但这种程序是怎么做出来的呢?</p><p> 流程如下:</p><p> 建表user,保存注册用户信息。</p><p> 字段 类型 备注</p><p> userid Int(10) 用户序列号 auto_increment 关键字</p><p> username Varchar(50) 用户匿称</p><p> userpwd Varchar(50) 密码</p><p> email Varchar(50) 电子信箱</p><p> oicq Varchar(50) OICQ号</p><p> signature mediumtext 签名</p><p> imgurl Varchar(50) 头像</p>
<p> </p>
<p> joindate Varchar(50) 加入时间</p><p> 建类文件user.php 定义函数</p><p> exist($username)确认新注册用户是不是已经存在</p><p> nsert($username,$userpwd,$email,$oicq,$imgurl,$signature)插入注册用户</p><p> update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature) 更新用户数据</p><p> get_from_condition($con) 返回满足查询条件的记录集</p><p> 建表session。当用户登录时即向此表插入新记录,离开或超时后删除记录,保证表中保存的是当前在线的用户。</p><p> 字段 类型 备注</p><p> sessionid Int(10) 序列号 auto_increment 关键字</p><p> userid Int(10) 用户序列号取自user表</p><p> ipaddress Varchar(50) Ip地址</p><p> lastactivity Int(10) 最后活动时间,用它来判断用户是否还在线</p><p> 建类文件session.php 定义函数</p><p> insert($userid,$ipaddress,$lastactivity) 把登录成功的用户插入到表中</p><p> update($userid,$ipaddress,$lastactivity)更新在线用户最后活动时间</p><p> del($con)删除满足条件的用户,用它来清除离线用户</p><p> get_from_condition($con) 返回满足查询条件的记录集</p><p> 公用文件global.php</p><p> <code>include "class/config.inc.php"; //把配置文件包含进来<br />  $db = new db;<br />  $db-> db_connect( ); //连接数据库<br />  $user = new user;  //初始化<br />  $session = new session;<br />//启动会话<br />  session_start();<br />//删除session表中已经过期的用户(即非在线网友)因为此文件总是被调用从而保证显示的都是当前在线的用户<br />$curtime=time();<br />$con="lastactivity<$curtime";<br />$session->del($con);<br />//正在线的网友需不断更新session表中的lastactivity时间,并重新设置用户的COOKIES<br />if ($HTTP_SESSION_VARS["online"]=="on"){ //此处也可用$_SESSION[“online”]<br />$userid=$HTTP_SESSION_VARS["userid"]; //取当前在线用户的userid<br />$ipaddress=substr($REMOTE_ADDR,0,50);<br />$lastactivity=time()+3600;  //更新最后活动时间,如时一个小时之内未调动页面就认为用户已离线,从而会被删除。<br />$session->update($userid,$ipaddress,$lastactivity);<br />}else{<br />//如果未登录那直接转入登录页面<br />$firstpage="logon.php";<br />header ("Location: $firstpage");<br />exit;<br />}</code></p>
<p> </p>
<p> 登录文件logon.php</p><p> <code><? include "global.php"; //把global.php文件包含进来<br />  if ($hiddenField=="0"){ //测检表单有未被提交<br />  <br />  $con="username='$username' and userpwd='$userpwd'";<br />  $result=$user->get_from_condition($con);<br />  if ($user->counter==1){<br />
if (!session_is_registered("online")){//检测是否被登记过<br />
session_register("online"); //登记一个新的变量为会话变量<br />  }<br />  if (!session_is_registered("ccauser")){<br />  session_register("ccauser");<br />  }<br />  if (!session_is_registered("userid")){  <br />  session_register("userid");<br />  }<br />  $ccauser=$username;  //给会话变量赋值<br />  $online="on";  //这个变量在global.php用到以更新最后活动时间lastactivity<br />  $userid=$user->userid;<br />  $ipaddress=substr($REMOTE_ADDR,0,50);<br />  $lastactivity=time()+3600;<br />  $con=" userid=$userid";<br />  $session->get_from_condition($con);<br />  //判断会话是否存在,有可能你在不同的机器上登两次。<br />  if ($session->counter==1){<br />
$session->update($userid,$ipaddress,$lastactivity); //如存在,更新<br />}else{<br />$session->insert($userid,$ipaddress,$lastactivity); //如不存在,插入<br />}<br />  <br />
//在客户机设置COOKIES<br />  SetCookie("ccauser",$username,time()+3600);<br />  Header("Location:test.php");//然后导向测试页<br />}<br />}<br />?><br /><?<br />if($HTTP_SESSION_VARS["online"]=="") { //判断是否已登录<br />?><br />//下面是登录的表单<br /><form name="form1" method="post" action=""><br />
名称: <input type="text" name="username"><br />
密码: <input type="text" name="userpwd"><br /> <input type="hidden" name="hiddenField" value="0"><br /> <input type="submit" name="Submit" value="提交"><br /> <input type="reset" name="Submit2" value="重置"><br /></form><br /><?<br />}else{<br />echo "网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了"; //如果已登录则显示提示<br />$str="<br><br><a href='exit.php'>退出社区</a>";<br />echo $str;<br />}<br />?></code></p></p><p> 测试文件test.php</p><p> <code><?<br />include "global.php"; //把global.php文件包含进来<br />$strWelcome="欢迎<font color=red>".$_SESSION['ccauser']."</font><br>";<br />echo $strWelcome; //显示欢迎信息<br />$str=” 当前在线用户:<br>===================<br>”;<br />$con=" 1=1";<br />//提出session表中所有记录即是当前在线用户,未把游客算在内<br />$result=$session->get_from_condition($con);<br />while($row=mysql_fetch_array($result)){<br />$con1="userid=$row[userid]";<br />$user->get_from_condition($con1);<br />$str.=$user->username." ";<br />}<br />echo $str;<br />?></code></p><p> <br><a href='exit.php'>退出社区</a></p><p> 退出文件exit.php</p><p> <code><?<br />  include "global.php"; //把global.php文件包含进来<br />  if ($_SESSION["online"]=="on"){<br />  $con="userid=$userid";<br />  $session->del($con); //在session表中删除用户信息。<br />  session_destroy(); //结束当前的会话,并清空会话中的所有资源<br />  echo "已经退出社区......";<br />}<br />?></code></p></p>