Witam
Chciałbym, abyście ocenili mój skrypt obsługi sesji.
Na tą chwilę przesyłanie identyfikatora sesji odbywa się przez ciasteczka, w następnym wersjach postaram się dodać przesyłanie poprzez url.
Link do strony testowej
Jest to na razie wersja testowa i niepełna, z czasem uzupełnię ją o nową funkcjonalność.
Jeżeli ktoś chciałby wykorzystać mój kod (chociaż wątpię ;-), to nie widzę żadnych przeszkód, pod warunkiem, że informacja o autorze nie zostanie usunięta.
Zabraniam jednak kopiowania i rozpowszechniania skryptu poza forum php.pl
edit: Dodaje kod tutaj, gdyż hosting pliku wydał mi się nieodpowiedni rozwiązaniem.
CODE
<?php
/*
/*
# 19/07/2008
# v1.0 
# session.php
# Autor: Heweliusz (Adrian Zuchowski)
# Możesz wykorzystać mój skrypt na swojej stronie, jednak nie wolno ci
# usuwać info o autorze i/lub przypisywać sobie autorstwa kodu
*/
error_reporting(E_ALL);
define('SESSION_TABLE', 'asession');
class session
{
var $session_id;
var $session_ip;
var $session_start_time = '';
var $session_expire_time = '';
var $session_user_nickname = 'GUEST';

// Funkcja ma za zadanie rozpocząć lub kontynułować poprzednią sesję
function begin_session()
{
global $db;

// Ustalamy własciwiosci sesji
$this->session_id = md5(mt_rand(1, 10000000));
$this->session_ip = $_SERVER['REMOTE_ADDR'];
$this->session_start_time = time();

// Sprawdzamy, czy istnieje już jakas sesja
if (isset($_COOKIE['session_id']) && !empty($_COOKIE['session_id']))
{
$this->session_id = strip_tags(trim($_COOKIE['session_id']));
$sql = 'SELECT session_ip, session_start_time, session_expire_time
FROM '.SESSION_TABLE.' 
WHERE session_id = "'.$this->session_id.'"';
$result = $db->sql_query($sql);

// Trzeba też sprawdzić, czy zapytanie nie zwróciło pustego wyniku
if ($result == false || mysql_num_rows($result) <= 0)
{
// Jestemy zmuszeni usunąć ciastko, gdyż baza nie zawiera
// informacji o sesji z identyfikatorem w nim zawartym
$this->kill_session($remove_from_db = false);
return false;
}
// Przetwarzamy wynik, aby skorzystać z informacji z bazy danych
$result = $db->sql_fetch_array($result);

// Sprawdzamy, czy adres ip zapisany w bazie zgadza się z adresem ip klienta
if ($result['session_ip'] != $_SERVER['REMOTE_ADDR'])
{
// Skoro ip się nie zgadza, niszczymy ciastko i kończymy działanie
$this->kill_session($remove_from_db = false);
return false;
}
// Przedłużamy ważność sesji
$this->session_expire_time = time() + (600);

$sql = 'UPDATE ' .SESSION_TABLE. '
SET session_expire_time="'.$this->session_expire_time.'"
WHERE session_id="'.$this->session_id.'"';

// Jesli wystąpił błąd podczas aktualizacji tabeli, kończymy działanie
if (!$db->sql_query($sql))
{
$db->db_error_msg('', mysql_error());
return false;
}

// Wszystko wydaje się być w pożądku, wobec czego możemy odswiezyc nasze ciacho smile.gif
setcookie('session_id', $this->session_id, $this->session_expire_time);
}
else
{
// Ustawiamy czas wygasniecia
$this->session_expire_time = time() + (600);
// Zapisujemy aktywną sesję do bazy danych
$sql = "INSERT INTO `".SESSION_TABLE."` (`id`, `session_id`, `session_ip`, `session_start_time`, `session_expire_time`, `session_user_nickname`)
VALUES ('', '".$this->session_id."', '".$this->session_ip."', '".$this->session_start_time."', '".$this->session_expire_time."', '".$this->session_user_nickname."')";
if (!$db->sql_query($sql))
{
 return false;
}
// Wysyłamy ciasteczko, rozpoczynając nową sesję
if (@setcookie('session_id', $this->session_id, $this->session_expire_time))
{
return true;
}
else
{
return false;
}

return true;
}
}

// Funkcja rejestruje użytkownika i przypisuje mu jego indentyfikator sesji
function register_user($user_nickname)
{
global $db;

// Sprawdzmy stan logowania
if ($this->session_user_nickname != 'GUEST')
{
return false;
}
$sql = 'UPDATE ' .SESSION_TABLE. "
SET session_user_nickname='".$user_nickname."'
WHERE session_id='".$this->session_id."'";
 
// Jesli wystąpił błąd podczas aktualizacji tabeli, kończymy działanie
if (!$db->sql_query($sql))
{
$db->db_error_msg('', mysql_error());
return false;
}
$this->session_user_nickname = $user_nickname;
}

// Funkcja zabija (?!) sesję
// Domyslnie sesja usuwana jest rówież z bazy danych
function kill_session($remove_from_db = true)
{
global $db;

if ($remove_from_db == true)
{
$sql = 'DELETE FROM '.SESSION_TABLE. '
WHERE session_id="'.$this->session_id.'"';
if (!$db->sql_query($sql))
{
$db->db_error_msg('', mysql_error());
return false;
}
}
// Usuwamy ciasteczko i wszelki slad po sesji ginie...
if (@setcookie('session_id', '', (time()-1)))
{
return true;
}
else
{
return false;
}
}
}
?>