Axis--Session.php
Go to the documentation of this file.00001 <?PHP
00002
00003 #
00004 # Axis--Session.php
00005 # An Object for Maintaining the Values of Variables Across Pages
00006 #
00007 # Copyright 1999-2003 Axis Data
00008 # This code is free software that can be used or redistributed under the
00009 # terms of Version 2 of the GNU General Public License, as published by the
00010 # Free Software Foundation (http://www.fsf.org).
00011 #
00012 # Author: Edward Almasy (almasy@axisdata.com)
00013 #
00014 # Part of the AxisPHP library v1.2.5
00015 # For more information see http://www.axisdata.com/AxisPHP/
00016 #
00017
00018 # initialize PHP session support
00019 session_name("AxisPHP");
00020 session_start();
00021
00022 class Session {
00023
00024 # ---- PUBLIC INTERFACE --------------------------------------------------
00025
00026 function Session(&$DB)
00027 {
00028 global $APSession_Shutdown_Sessions;
00029
00030 # save database object
00031 $this->DB =& $DB;
00032
00033 # construct session variable name
00034 $SessionVar = "APSessionId".md5($DB->DBHostName().$DB->DBName());
00035
00036 # if session ID available
00037 if (isset($_SESSION[$SessionVar]))
00038 {
00039 # look for session ID in database
00040 $this->SessionId = $_SESSION[$SessionVar];
00041 $DB->Query("SELECT * FROM APSessions WHERE SessionId = "
00042 .intval($this->SessionId));
00043
00044 # if matching session ID record not found in database
00045 if ($DB->NumRowsSelected() < 1)
00046 {
00047 # clear session ID
00048 unset($this->SessionId);
00049 }
00050 }
00051
00052 # if session ID found
00053 if (isset($this->SessionId))
00054 {
00055 # load session variables from database
00056 $DB->Query("SELECT * FROM APSessionData WHERE SessionId = "
00057 .intval($this->SessionId));
00058 while ($Record = $DB->FetchRow())
00059 {
00060 $VarName = $Record["DataName"];
00061 $VarValue = unserialize($Record["DataValue"]);
00062 if (substr($VarName, -2) == "-T")
00063 {
00064 $VarName = substr($VarName, 0, -2);
00065 $this->SaveVarFlags[$VarName] = FALSE;
00066 }
00067 else
00068 {
00069 $this->SaveVarFlags[$VarName] = TRUE;
00070 $this->TempVarFlags[$VarName] = FALSE;
00071 }
00072 $this->SessionVariables[$VarName] = $VarValue;
00073 $GLOBALS[$VarName] = $VarValue;
00074 }
00075 }
00076 else
00077 {
00078 # generate unique session ID
00079 do
00080 {
00081 $this->SessionId = mt_rand();
00082 } while ($DB->Query("SELECT COUNT(*) AS FoundCount FROM APSessionData"
00083 ." WHERE SessionId = ".$this->SessionId, "FoundCount"));
00084
00085 # save session ID
00086 $_SESSION[$SessionVar] = $this->SessionId;
00087 }
00088
00089 # make sure session state will be saved when page ends
00090 $APSession_Shutdown_Sessions[] =& $this;
00091 }
00092
00093 function RegisterVariable($VariableName, $Value = NULL)
00094 {
00095 # add variable to list of variables to be saved
00096 if ($Value != NULL)
00097 {
00098 $this->SessionVariables[$VariableName] = $Value;
00099 }
00100 else
00101 {
00102 $this->SessionVariables[$VariableName] = $GLOBALS[$VariableName];
00103 }
00104 $this->SaveVarFlags[$VariableName] = TRUE;
00105 $this->TempVarFlags[$VariableName] = FALSE;
00106 }
00107
00108 function PassVariable($VariableName, $Value = NULL)
00109 {
00110 # add variable to list of variables to be saved
00111 if ($Value != NULL)
00112 {
00113 $this->SessionVariables[$VariableName] = $Value;
00114 }
00115 else
00116 {
00117 if (isset($GLOBALS[$VariableName]))
00118 {
00119 $this->SessionVariables[$VariableName] = $GLOBALS[$VariableName];
00120 }
00121 else
00122 {
00123 $this->SessionVariables[$VariableName] = NULL;
00124 }
00125 }
00126 $this->SaveVarFlags[$VariableName] = TRUE;
00127 $this->TempVarFlags[$VariableName] = TRUE;
00128 }
00129
00130 function UnregisterVariable($VariableName)
00131 {
00132 # remove variable from list of variables to be saved (if present)
00133 if (isset($this->SessionVariables[$VariableName]))
00134 {
00135 unset($this->SessionVariables[$VariableName]);
00136 unset($this->TempVarFlags[$VariableName]);
00137 }
00138 }
00139
00140 function IsRegistered($VariableName)
00141 {
00142 return (isset($this->SessionVariables[$VariableName]) ? TRUE : FALSE);
00143 }
00144
00145 function IsPassed($VariableName)
00146 {
00147 return ((isset($this->SessionVariables[$VariableName]) && $this->TempVarFlags[$VariableName])
00148 ? TRUE : FALSE);
00149 }
00150
00151 # retrieve variable with specified name
00152 function Get($VariableName)
00153 {
00154 if (isset($this->SessionVariables[$VariableName]))
00155 {
00156 return $this->SessionVariables[$VariableName];
00157 }
00158 else
00159 {
00160 return NULL;
00161 }
00162 }
00163
00164 # retrieve variable with specified name from all active sessions
00165 function GetFromAllSessions($VariableName)
00166 {
00167 # clear out any expired sessions
00168 $this->DeleteExpiredSessions();
00169
00170 # start with empty array
00171 $ReturnValue = array();
00172
00173 # for each instance of variable in session database
00174 $DB =& $this->DB;
00175 $DB->Query("SELECT SessionId,DataValue FROM APSessionData WHERE DataName = '".$VariableName."'");
00176 while ($Record = $DB->FetchRow())
00177 {
00178 # unpack variable value and add to array to be returned
00179 $ReturnValue[$Record["SessionId"]] = unserialize($Record["DataValue"]);
00180 }
00181
00182 # return array of variable values to caller
00183 return $ReturnValue;
00184 }
00185
00186
00187 # ---- PRIVATE INTERFACE -------------------------------------------------
00188
00189 # handle to SQL database we use to store session information
00190 var $DB;
00191
00192 # session ID
00193 var $SessionId;
00194
00195 # array containing variables to be maintained between pages
00196 var $SessionVariables;
00197
00198 # flags indicating whether to save variable for next session
00199 var $SaveVarFlags;
00200
00201 # flags indicating whether to mark variable as temporary for next session
00202 var $TempVarFlags;
00203
00204 # how long before sessions will expire (in minutes)
00205 var $SessionExpirationTime = 180;
00206
00207 function SaveState()
00208 {
00209 # if session record not found in database
00210 $this->DB->Query("SELECT * FROM APSessions WHERE SessionId = "
00211 .intval($this->SessionId));
00212 if ($this->DB->NumRowsSelected() < 1)
00213 {
00214 # create new session record
00215 $this->DB->Query(sprintf("INSERT INTO APSessions "
00216 ."(SessionId, LastActiveDate) VALUES "
00217 ."(%d, NOW())",
00218 $this->SessionId));
00219 }
00220 else
00221 {
00222 # update last active timestamp for session
00223 $this->DB->query("UPDATE APSessions "
00224 ."SET LastActiveDate=NOW() "
00225 ."WHERE SessionId = ".intval($this->SessionId));
00226 }
00227
00228 # clear all old stored session variables from database
00229 $this->DB->Query(sprintf("DELETE FROM APSessionData WHERE SessionId = '%d'",
00230 $this->SessionId));
00231
00232 # save session variables to database (if any)
00233 if (isset($this->SessionVariables))
00234 {
00235 foreach ($this->SessionVariables as $VariableName => $VariableValue)
00236 {
00237 if ($this->SaveVarFlags[$VariableName])
00238 {
00239 if ($this->TempVarFlags[$VariableName]) { $VariableName .= "-T"; }
00240 $this->DB->Query(sprintf("INSERT INTO APSessionData "
00241 ."(SessionId, DataName, DataValue) VALUES "
00242 ."(%d, '%s', '%s')",
00243 $this->SessionId,
00244 $VariableName,
00245 addslashes(serialize($VariableValue))));
00246 }
00247 }
00248 }
00249
00250 # clear any expired sessions from database
00251 $this->DeleteExpiredSessions();
00252 }
00253
00254 function DeleteExpiredSessions()
00255 {
00256 # retrieve expired session records
00257 $DB =& $this->DB;
00258 $DB->Query(sprintf("SELECT * FROM APSessions WHERE DATE_SUB(NOW(), INTERVAL %d MINUTE) > LastActiveDate",
00259 $this->SessionExpirationTime));
00260
00261 # if expired sessions were found
00262 if ($DB->NumRowsSelected() > 0)
00263 {
00264 # for each record
00265 while ($Record = $DB->FetchRow())
00266 {
00267 # save record ID
00268 $Id[$Record["SessionId"]] = 1;
00269 }
00270
00271 # for each saved session record ID
00272 while (list($SessionId) = each($Id))
00273 {
00274 # delete any stored session data
00275 $DB->Query(sprintf("DELETE FROM APSessionData WHERE SessionId=%d",
00276 $SessionId));
00277 }
00278
00279 # delete expired session records
00280 $DB->Query(sprintf("DELETE FROM APSessions WHERE DATE_SUB(NOW(), INTERVAL %d MINUTE) > LastActiveDate",
00281 $this->SessionExpirationTime));
00282 }
00283 }
00284 };
00285
00286 function APSession_Shutdown()
00287 {
00288 global $APSession_Shutdown_Sessions;
00289
00290 # if we have Sessions to shut down
00291 if (isset($APSession_Shutdown_Sessions))
00292 {
00293 # call shutdown functions
00294 while (list($Key) = each($APSession_Shutdown_Sessions))
00295 {
00296 $SessionObject =& $APSession_Shutdown_Sessions[$Key];
00297 $SessionObject->SaveState();
00298 }
00299 }
00300 }
00301
00302 register_shutdown_function("APSession_Shutdown");
00303
00304
00305 ?>