当前位置:中国站长下载文章中心网页编程PHP编程 → PHP开发中session应用详解(2)

PHP开发中session应用详解(2)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 10:13:26
     定制程序可以用mysql数据库或DBM文件保存session数据,视具体的情况而定。如果使用mysql作支持,那还需要进行以下的步骤:
  
    首先在mysql中创建一个sessions数据库,并且创建一个sessions表:
  
  mysql> CREATE DATABASE sessions;
  mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
    -> IDENTIFIED BY 'phpsession';
  mysql> CREATE TABLE sessions (
    -> sesskey char(32) not null,
    -> expiry int(11) unsigned not null,
    -> value text not null,
    -> PRIMARY KEY (sesskey)
    -> );
  
    下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置:
  
  <?
  $SESS_DBHOST = "localhost"; /* 数据库主机名 */
  $SESS_DBNAME = "sessions"; /* 数据库名 */
  $SESS_DBUSER = "phpsession"; /* 数据库用户名 */
  $SESS_DBPASS = "phpsession"; /* 数据库密码 */
  $SESS_DBH = "";
  $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
  
  ……//定制函数
  
  session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
  ?>
  
    定制使用dbm文件时的接口 :
  
  <?
  $SESS_DBM = "";
  $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
  
  ……//定制函数
  
  session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
  ?>
  
    session定制的测试代码:
  
  <?php
  ……
  if ($handler == "dbm") include("session_dbm.php");//使用何种接口
  elseif ($handler == "mysql") include("session_mysql.php");
  else ……
  
  session_start();
  session_register("count");
  ……
  ?>
  
    在身份验证中,怎样应用Session?
  
    Session可以用于用户认证 :
  
    验证用户是否合法:
  
  <?
   session_start();
   ……//验证过程
   session_register("reguser");
  ?>
  
    在另一页面中检查用户是否登录
  
  <?
   session_start();
   if(isset($reguser)&&$reguser!=""){//如果已经登录
    echo "亲爱的用户,欢迎你";
   }else{//如果没有登录
    echo "请先注册!";
   }
  ?>
  
    用户退出登录:
  
  <?
   session_destroy();
   ……
  ?>
  
    如何实现多session并发运行?
  
    问题提出:我在为所在单位编写一个进销存系统中发现需要让多个用户可以同时进入一个php应用程序。原来设计的静态的唯一的session ID导致数据混乱。这样,动态生成一个唯一的session ID成为当务之急。
  
    解决办法很简单:我用了php文件名+时间戳为唯一的session ID,这样在我的程序中的每个session就各就各位,不再混乱了。
  
    下面把我的源代码公布,方便也有同样的问题的朋友多一个解决方法。
  
  //Start a PHP session to preserve variables.
    if ( empty($mysessionname) ) {
       $micro = microtime();
       $micro = str_replace(" ","",$micro); // strip out the blanks
       $micro = str_replace(".","",$micro); // strip out the periods
       $mysessionname = "po_maint" . $micro;
    }
    session_name($mysessionname);
    session_start();
  
    程序注释:
  
    用mysessionname为页面间唯一的sessionname传递变量,如果你也用到这个名字必须把上述程序做个小小的改动。Mysessionname不能为session的内部变量名,因为他在session开始之前就已经存在了。Mysessionname也不能用cookie方式存放,因为多个session肯定会覆盖掉原先的cookie文件。你可以用隐含表单的域来保存它。这样就不会有问题。
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。