在PHP3中實現SESSION的功能(一、SESSION函數庫:session.inc.php3)(轉譯)

來源:互聯網
上載者:User
session|函數 <?php
if (!isset($__session_inc__)){
$__session_inc__=1;
//require("cookie.inc.php3");
# -------------------------------------------------------------------
# Session Management v1.0 21.6.1998
# (c) Wild Karl Heinz <kh.wild@wicom.at>
#
# This Include handle Session based variable handling
#
# Please feel free and use it. If you make it more functional
# it would be nice to send me a copy.
#
# Don't forget - Mysql_connect !
#
# The database structure
# Table structure for table 'session'
#
#  CREATE TABLE session (
#    id int(11) DEFAULT '0' NOT NULL auto_increment,
#    sid varchar(20) DEFAULT '' NOT NULL,
#    val blob,
#    times timestamp(14),
#    PRIMARY KEY (id),
#    KEY sid (sid),
#    UNIQUE sid_2 (sid)
#  );
#
# You'll miss here a cron job to delete the old sessions from db
# -------------------------------------------------------------------

// 請注意上面被注釋掉的CREATE TABLE語句,
// 你需要在你所使用的資料庫上執行這條語句,
// 表名也可以不是session,那麼就需要設定下面的$sess_table變數了。

// 此處你需要設定庫名,和表名。
// 不過一般建議就使用session作為表名
   $sess_db = 'dbname';
   $sess_table = 'session';
   
# ----------------------------------------------------
# Session_CheckID - 檢查、設定並返回 Session-ID
# 參數......: cookie儲存時間(以分鐘計)
#             也可不設定表示這個 cookie 只在當前session 有效
#             這其實就象ASP中SESSION的時效一樣。
# 傳回值....: 一個唯一的Session-ID (作為cookie儲存)
# ----------------------------------------------------
function Session_CheckID( $min )
{
    global $sess_sid;

    if( !$sess_sid ) {
      $sess_sid = uniqid( SC ); //取得一個唯一的隨機數
/*
      if( $min > 0 ) {
         SetCookie("sess_sid", $sess_sid, time()+($min*60), "/", "", 0 );
         }
      else {
         SetCookie("sess_sid", $sess_sid, "", "/", "", 0 );
         }
上面是原先的代碼,會出錯。所以另外用了一個更好的函數。
函數庫:cookie.inc.php3
*/
        jssetcookie("sess_sid",$sess_sid,$min);
      return( false );
      }
   else {
      return( true );
      }
}

# ----------------------------------------------------------
# str2arr - 將字串轉換成session數組
# 參數.....: string
# 傳回值...: 全域數組(其實就是session)
#本函數用途:將字串轉換成session數組
#如"session[username]=yourid&session[userpass]=12345"
#將會被轉換成下面的數組
#  session[username]="yourid"
#  session[userpass]="12345"
#請注意函數split(),each(),list(),eval()的用法。
# ----------------------------------------------------------
function str2arr( $ts )
{
   global $session;

   $vals = split( "&", $ts );
   while( list($key,$val) = each($vals) ) {
      list( $name, $wert ) = split( "=", $val );
      if( $val ) eval( "\$$name = \"$wert\";" );
      }
}

# ----------------------------------------------------------
# session_read() - 從SESSION表中取資料,轉換成session數組
# 參數........: 無
# 傳回值......: 如果讀出資料,返回 true ,否則返回 false
#注意.........: 用到了str2arr()這個函數
# ----------------------------------------------------------
function session_read()
{
   # Hash array to keep session-variables
   global $session;
   global $sess_sid, $sess_db, $sess_table, $sess_error;

   $sel = "Select val from $sess_table where sid = '$sess_sid'";
   $res = mysql_db_query( $sess_db, $sel );
   if( mysql_numrows( $res ) ) {
      $val = mysql_result( $res, 0, "val" );
      str2arr( $val );
      mysql_free_result( $res );
      return( true );
      }
   else {
      return( false );
      $sess_error = mysql_error();
      }
}

# ------------------------------------------------------
# Split_Array() - 將session數群組轉換成字串
# 參數.......: 數組
# 傳回值.....: 數群組轉換得來的字串
#
# Thanks to Rasmus (這人好象是PHP的發明人)
# 注意:將session數群組轉換成字串
#如session[username]="yourid"
#  session[userpass]="12345"
#將會被轉換成"session[username]=yourid&session[userpass]=12345"
#同時該函數考慮到了數組的某個元素也是資料的情況
#這個函數被設計成一個遞迴函式
# ------------------------------------------------------
function Split_Array( $arr, $a = "", $b = "", $c = "" )
{
   while( list( $key, $val ) = each( $arr ) ) {
      if( is_array( $val ) ) {
         $ts .= Split_Array( $arr[ $key ],
                  ( strlen( $a ) ? $a : $key ),
                  ( strlen( $b ) ? $b : ( strlen( $a ) ? $key : "" ) ),
                  ( strlen( $c ) ? $c : ( strlen( $b ) ? $key : "" ) ) );
         }
      else {
         $ts .= "session";
         $ts .= $a ? "[$a]" : "";
         $ts .= $b ? "[$b]" : "";
         $ts .= $c ? "[$c]" : "";
         $ts .= "[$key]=$val&";
         }
      }
   return( $ts );
}

# ---------------------------------------------------
# session_write - 將session數群組轉換成字串,再存到session表中
# 參數.: 無
# 傳回值...: 如果存入正常返回 true ,否則返回  false
# ---------------------------------------------------
function session_write()
{
   # Hash array to keep session-variables
   global $session;

   global $sess_sid, $sess_db, $sess_table;
   global $sess_error;

   # if you like to delete a session-cookie
   # you must check it before writting the session
   # array

   if( !$sess_sid ) { session_checkid( 0 ); }

   $ts = Split_Array( $session );
   if( $ts > "" ) { $ts = substr( $ts, 0, strlen( $ts ) - 1 ); }
   $res  = mysql_db_query( $sess_db, "Select * from session where sid = '$sess_s'");
   if( mysql_numrows( $res ) == 0 ) {
      $sel  = "Insert into $sess_table ( id, sid, val, times ) ";
      $sel .= "values( 0, '$sess_sid', '$ts', NULL )";
      }
   else {
      $sel  = "Update $sess_table set val = '$ts', ";
      $sel .= "times = NULL where sid = '$sess_sid'";
      }
   if( !mysql_db_query( $sess_db, $sel ) ) {
      $sess_error = mysql_error();
      return( false );
      }
   else { return( true ); }
}

# ---------------------------------------------
# session_del - 清除當前所有的session
#               並刪除session表中和當前session有關的記錄
# 參數.....: 一個隨機的session id
# 傳回值...: 無
# ---------------------------------------------
function session_del()
{
   global $session, $sess_db, $sess_table, $sess_sid;

   $sel = "Delete from $sess_table where sid = '$sess_sid'";
   if( !mysql_db_query( $sess_db, $sel ) ) {
      $sess_error = mysql_error();
      }
   $sess_sid = '';
}
}
?> 

相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。