Sessions in Links

FBIagent

Erfahrenes Mitglied
Guten tag,

ich habe mir ein Interface für Sessions geschrieben und dazu eine Klasse die diese
implementiert und eine MySql Datenbank benutzt um die sessions zu speichern.

Nun habe ich aber das Problem, das die Sessions aus irgendeinem Grund nicht richtig
geladen werden. Könnte sich das bitte jemand anschauen?

ISession.interface.php
PHP:
<?php
    interface ISession {
        public static function Open();
        public static function Close();
        public static function Read( $SessionId );
        public static function Write( $SessionId, $SessionData );
        public static function Destroy( $SessionId );
        public static function GC( $MaxLifetime );
        public static function UseMe();
    }
?>

SessionMySql.class.php
PHP:
<?php
	require_once( 'ISession.interface.php' );
	require_once( 'MySqlConnection.class.php' );
	require_once( 'SqlResult.class.php' );
	require_once( 'SqlStatement.class.php' );

	class SessionMySql
	implements ISession {
		private static $_LogFile;
		private static $_Connection;

		private static function Log( $Message, $Indent = 0 ) {
			for ( $i = 0;$i < $Indent;++ $i ) {
				$Message = "\t" . $Message;
			}

			@file_put_contents( self::$_LogFile, $Message . "\n", LOCK_EX | FILE_APPEND );
		}

		public static function Open() {
			self::Log( 'SessionMySql::Open()' );
			self::$_Connection = new MySqlConnection( '127.0.0.1', 'usr', 'pwd', 'db' );
			$Result = self::$_Connection->IsOk();

			if ( $Result === false ) {
				self::Log( self::$_Connection->GetLastErrorStr(), 1 );
				return false;
			}

			return true;
		}

		public static function Close() {
			self::Log( 'SessionMySql::Close()' );
			self::$_Connection->Close();
			return true;
		}

		public static function Read( $SessionId ) {
			self::Log( 'SessionMySql::Read( ' . $SessionId . ' )' );
			$Statement = new SqlStatement( "SELECT `data` FROM `sessions` WHERE `session` = ? LIMIT 1" );
			$Statement->AddStr( $SessionId );
			$Result = self::$_Connection->ExecuteQuery( $Statement );

			if ( $Result !== false ) {
				if ( $Result->Next() ) {
					return $Result->GetValue( 'data' );
				}
			} else {
				self::Log( self::$_Connection->GetLastErrorStr(), 1 );
			}

			return '';
		}

		public static function Write( $SessionId, $SessionData ) {
			self::Log( 'SessionMySql::Write( ' . $SessionId . ', ' . $SessionData . ' )' );
			$Statement = new SqlStatement( 'REPLACE INTO `sessions` ( `session`, `data`, `update_time` ) VALUES( ?, ?, ? )' );
			$Statement->AddStr( $SessionId );
			$Statement->AddStr( $SessionData );
			$Statement->AddNumber( time() );
			$Result = self::$_Connection->ExecuteUpdate( $Statement );

			if ( $Result === false ) {
				self::Log( self::$_Connection->GetLastErrorStr(), 1 );
				return false;
			}

			return true;
		}

		public static function Destroy( $SessionId ) {
			self::Log( 'SessionMySql::Destroy( ' . $SessionId . ' )' );
			$Statement = new SqlStatement( "DELETE FROM `sessions` WHERE `session` = ? LIMIT 1" );
			$Statement->AddStr( $SessionId );
			$Result = self::$_Connection->ExecuteUpdate( $Statement );

			if ( $Result === false ) {
				self::Log( self::$_Connection->GetLastErrorStr(), 1 );
				return false;
			}

			return true;
		}

		public static function GC( $MaxLifetime ) {
			self::Log( 'SessionMySql::GC( ' . $MaxLifetime . ' )' );
			$Statement = new SqlStatement( 'DELETE FROM `sessions` WHERE `update_time` + ? < ? LIMIT 1' );
			$Statement->AddNumber( $MaxLifetime );
			$Statement->AddNumber( time() );
			$Result = self::$_Connection->ExecuteUpdate( $Statement );

			if ( $Result === false ) {
				self::Log( self::$_Connection->GetLastErrorStr(), 1 );
				return false;
			}

			return true;
		}

		public static function UseMe( $LogFile ) {
			self::$_LogFile = $LogFile;
			self::Log( 'SessionMySql::UseMe( ' . $LogFile . ' )' );
			ini_set('session.save_handler', 'user');
			session_set_save_handler(	array( 'SessionMySql', 'Open' ),
										array( 'SessionMySql', 'Close' ),
										array( 'SessionMySql', 'Read' ),
										array( 'SessionMySql', 'Write' ),
										array( 'SessionMySql', 'Destroy' ),
										array( 'SessionMySql', 'GC' )
			);
			session_start();
		}
	}

	SessionMySql::UseMe( 'SessionMySql.class.log' );

	if ( !isset( $_SESSION[ 'NumVisits' ] ) ) {
		$_SESSION[ 'NumVisits' ] = 0;
	}

	++ $_SESSION[ 'NumVisits' ];

	echo 'Your session id: '. session_id() .'<br>You visited this site ' . $_SESSION[ 'NumVisits' ] . ' times with this session id.';
	session_commit();

?>

Die SQL Klassen sind getestet und funktionieren einwandfrei.

EDIT:
Ups, der Betreff ist irgendwie verkommenlol :D

Best wishes
FBIagent
 
Zuletzt bearbeitet:
Ups hatte sql.safe_mode an und hatte mir die message danach nicht ausgeben lassen.

Best wishes
FBIagent
 
Zurück