Właściwie błędów jako takich nie ma, tylko w przypadku powtórnego użycia obiektu obrazek się nie generuje (wyświetla się sam tekst z tagu "alt"). Daję zatem klasę Session (dzielę wpis na 2 cześci bo w jednym się nie zmieści):
Kod
require_once ('class/MySQL.class.php');
require_once ('class/Browser.class.php');
require_once ('class/CountSQL.class.php');
class Session
{
private $objSql;
private $objBrowser;
private $session_name = 'sid';
private $session_id;
private $native_session_id;
private $db_prefix;
private $ip;
private $browser_name;
private $session_lifespan = 3600;
private $session_timeout = 600;
private $session_value;
private $timestamp;
private $zero = 0;
private $null_session_varible = '';
public function __construct()
{
$this->objSql = MySQL::connect();
$this->objBrowser = new Browser();
$this->db_prefix = MySQL::$db_prefix;
$this->browser_name = $this->objBrowser->GetBrowserName();
$this->ip = $_SERVER["REMOTE_ADDR"];
$this->timestamp = time();
session_set_save_handler(
array(&$this, 'session_open'),
array(&$this, 'session_close'),
array(&$this, 'session_read'),
array(&$this, 'session_write'),
array(&$this, 'session_destroy'),
array(&$this, 'session_gc')
);
if(isset($_COOKIE[$this->session_name]))
{
$this->session_id = $_COOKIE[$this->session_name];
$stmt = $this->objSql->stmt_init();
$stmt->prepare("SELECT * FROM ".$this->db_prefix."sessions WHERE sessions_identifer =? AND sessions_useragent =? AND sessions_ip =? AND (sessions_start + ?) > UNIX_TIMESTAMP() AND ( sessions_last_time + ?) > UNIX_TIMESTAMP()");
$stmt->bind_param("sssii", $this->session_id, $this->browser_name, $this->ip, $this->session_lifespan, $this->session_timeout);
$stmt->execute();
CountSQL::AddSQL();
$stmt->store_result();
$rows = $stmt->num_rows;
if($rows==0)
{
if($this->ValidateSessionId())
{
$bool = setcookie($this->session_name, $this->session_id, time() -3600);
unset($_COOKIE[$this->session_name]);
}
$this->DeleteOldSessions();
}
else
{
$this->Impress();
}
}
session_set_cookie_params($session_lifespan=0);
session_start();
}
public function session_open($session_savepath, $session_name)
{
return(true);
}
public function session_close()
{
$this->session_gc();
$this->objSql->close();
return(true);
}
public function session_read($session_id)
{
if(isset($_COOKIE[$this->session_name]))
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("INSERT INTO ".$this->db_prefix."sessions VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("issiissi", $this->zero, $this->session_id, $this->null_session_varible, $this->timestamp, $this->timestamp, $this->ip, $this->browser_name, $this->zero);
$stmt->execute();
CountSQL::AddSQL();
$sql = "SELECT sessions_varible FROM ".$this->db_prefix."sessions WHERE sessions_identifer = '$this->session_id'";
$query = $this->objSql->query($sql);
CountSQL::AddSQL();
while($value = $query->fetch_assoc())
{
$return = $value['sessions_varible'];
}
return $return;
}
}
public function session_write($session_id, $session_value)
{
if(isset($_COOKIE[$this->session_name]))
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("UPDATE ".$this->db_prefix."sessions SET sessions_varible =? WHERE sessions_identifer =?");
$stmt->bind_param("ss", $session_value, $session_id);
$stmt->execute();
CountSQL::AddSQL();
return(true);
}
}
[cdn :-)]
Kod
public function session_destroy($session_id)
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE sessions_identifer =?");
$stmt->bind_param("s", $session_id);
$stmt->execute();
CountSQL::AddSQL();
return(true);
}
public function session_gc()
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE (sessions_last_time + ?) < UNIX_TIMESTAMP()");
$stmt->bind_param("s", $this->session_timeout);
$stmt->execute();
CountSQL::AddSQL();
return(true);
}
private function ValidateSessionId()
{
if(!ereg("[a-z0-9]{32}", $this->session_id))
return(true);
}
private function Impress()
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("UPDATE ".$this->db_prefix."sessions SET sessions_last_time = UNIX_TIMESTAMP() WHERE sessions_identifer =? AND sessions_ip =? AND sessions_useragent =?");
$stmt->bind_param("sss", $this->session_id, $this->ip, $this->browser_name);
$stmt->execute();
CountSQL::AddSQL();
}
private function DeleteOldSessions()
{
$stmt = $this->objSql->stmt_init();
$stmt->prepare("DELETE FROM ".$this->db_prefix."sessions WHERE sessions_identifer =? OR (sessions_start + ?) < UNIX_TIMESTAMP()");
$stmt->bind_param("si", $this->session_id, $this->session_lifespan);
$stmt->execute();
CountSQL::AddSQL();
}
}
?>