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
SessionMySql.class.php
Die SQL Klassen sind getestet und funktionieren einwandfrei.
EDIT:
Ups, der Betreff ist irgendwie verkommenlol
Best wishes
FBIagent
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
Best wishes
FBIagent
Zuletzt bearbeitet: