Custom database-sessiehandler
Auteur: ArieMedia - 27 juni 2011 - 17:28 - Gekeurd door: Joel - Hits: 3456 - Aantal punten: (0 stemmen)
---
- VOORWOORD
---
Je zal misschien denken, waarom ?! $_SESSION['blaat'] werkt toch ook?
Dat klopt, maar deze klasse zorgt ervoor dat je sessies in de database worden opgeslagen. Het grote voordeel hiervan is dat je niet met problemen van shared hosting zit. Er bestaat ook een variant om sessies alsnog in de database op te slaan PHP.net: session_set_save_handler. Maar omdat globals vanuit den boze zijn in OO wereld, dus deze klasse
---
- INSTALLATIE
---
1] Download, en zet het script ergens op je site
2] Voeg ondestaande SQL uit in je Phpmyadmin (of andere databasetool)
3] Include het script waar je hem nodig hebt (bijv index.php), zorg ervoor dat je al een databaseconnectie hebt lopen
4] Bekijk de voorbeeldcode
SQL
--
-- Tabelstructuur voor tabel `sessies`
--
CREATE TABLE IF NOT EXISTS `sessies` (
`naam` varchar(255) NOT NULL,
`gestart_op` datetime NOT NULL,
`laatste_actie` datetime NOT NULL,
`expires` int(11) NOT NULL,
UNIQUE KEY `naam` (`naam`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Tabelstructuur voor tabel `sessies_data`
--
CREATE TABLE IF NOT EXISTS `sessies_data` (
`sessid` varchar(255) NOT NULL,
`sessnaam` varchar(255) NOT NULL,
`sessdata` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- -- Tabelstructuur voor tabel `sessies` -- CREATE TABLE IF NOT EXISTS `sessies` ( `naam` varchar(255) NOT NULL, `gestart_op` datetime NOT NULL, `laatste_actie` datetime NOT NULL, `expires` int(11) NOT NULL, UNIQUE KEY `naam` (`naam`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Tabelstructuur voor tabel `sessies_data` -- CREATE TABLE IF NOT EXISTS `sessies_data` ( `sessid` varchar(255) NOT NULL, `sessnaam` varchar(255) NOT NULL, `sessdata` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
---
- VOORBEELDCODE
---
index.php
<?php
require_once 'sessie.class.php';
mysql_connect('localhost', 'sesstest', 'sessie');
mysql_select_db('sesstest');
try {
$sessie = new DBsession();
$sessie->setSession('naam', 'Arjan');
echo 'Hallo, volgensmij heet jij '.$sessie->getSession('naam');
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
<?php require_once 'sessie.class.php'; try { $sessie = new DBsession(); $sessie->setSession('naam', 'Arjan'); echo 'Hallo, volgensmij heet jij '.$sessie->getSession('naam'); } catch(Exception $e) { } ?>
---
- BUGS
---
Graag een mailtje of een bericht hier op Sitemasters, een bug hier betekend een veiligheidslek bij iedereen die dit script gebruikt.
---
- NAWOORD
---
Voor degene die met adoDB werken, daar heb ik ook een versie voor klaarliggen.
Graag onderbouwde kritiek, anders heeft niemand er wat aan.
|
Code: |
<?php
/**
* DBsession
* custom method to make sessions
* this class uses sessions wich are set in a database
*
* @author: Arjan Veldkamp <arjan@arjanv.nl>
* @date: 27/06/2011
*/
class DBsession {
/**
* How long a session should exist
**/
public $lifetime = 3600;
private $_sessie;
private $_sessiedb = 'sessies';
private $_sessiondatadb = 'sessies_data';
protected $secret;
protected $sessiondata = array();
public function __construct() {
$_SESSION = array();
$this->secret = sha1(md5('mySecreyKey'));
$this->prepareSession();
}
/**
* Check if we need to update or create a new session
*/
public function prepareSession() {
if(!isset($_COOKIE[$this->secret])) {
$this->_startSession();
} else {
$this->_extendSession();
}
$this->_getSessionData();
}
/**
* Start a new session, the user has not been here before, or the old session has been expired
*
* We will put a cookie on the user's machine with a key, this key gives access to the data assigned to this cookie
*/
protected function _startSession() {
$exptime = time() + $this->lifetime;
$sessname = $this->_createSessionName();
setcookie($this->secret, $sessname, $exptime);
$sql = 'INSERT INTO '.$this->_sessiedb.'
(naam, gestart_op, laatste_actie, expires)
VALUES("'.$sessname.'", NOW(), NOW(), '.$exptime.')';
if(!mysql_query($sql)) {
setcookie($this->secret, $sessname, time() - 3600);
throw new Exception('Er trad een fout op tijdens het maken van een sessiekey', 2);
}
$this->_sessie = $sessname;
}
/**
* This user has been here before within the given lifetime of the session
*
* We are gonna extend the cookie with the given lifetime
*/
protected function _extendSession() {
$exptime = time() + $this->lifetime;
$this->_sessie = $_COOKIE[$this->secret];
setcookie($this->secret, $this->_sessie, $exptime);
$sql = 'SELECT naam
FROM '.$this->_sessiedb.'
WHERE naam = "'.$this->_sessie.'"
AND expires > '.time();
$rs = mysql_query($sql);
if(mysql_num_rows($rs) == 1) {
$sql = 'UPDATE '.$this->_sessiedb.'
SET expires = '.$exptime.',
laatste_actie = NOW()
WHERE naam = "'.$this->_sessie.'"';
if(!mysql_query($sql)) {
throw new Exception('Er trad een fout op tijdens het verlengen van de sessiekey', 2);
}
} else {
$this->_startSession();
}
}
/**
* Get all session-data wich fits with the sessionkey
* The sessionkey connects the browser with the sessiondata
*/
protected function _getSessionData() {
$sql = 'SELECT sessnaam, sessdata
FROM '.$this->_sessiondatadb.'
WHERE sessid = "'.$this->_sessie.'"';
$rs = mysql_query($sql);
if(mysql_num_rows($rs) > 0) {
while($row = mysql_fetch_assoc($rs)) {
$this->sessiondata[$row['sessnaam']] = $row['sessdata'];
}
}
}
/**
* Get the session
*/
public function getSession($key) {
if(array_key_exists($key, $this->sessiondata)) {
return $this->sessiondata[$key];
}
return false;
}
/**
* Set a new session variable
* @param string - session-name
* @param mixed - the session's value
*
* When the session-name allready exists, update it with the new value
*/
public function setSession($naam, $val='') {
if(!array_key_exists($naam, $this->sessiondata)) {
$sql = 'INSERT INTO '.$this->_sessiondatadb.'
(sessid, sessnaam, sessdata)
VALUES( "'.$this->_sessie.'", "'.$naam.'", "'.$val.'")';
if(!mysql_query($sql)) {
throw new Exception('Er is een fout opgetreden tijdens het maken van een sessie');
}
} else {
$sql = 'UPDATE '.$this->_sessiondatadb.'
SET sessdata = "'.$val.'"
WHERE sessid = "'.$this->_sessie.'" AND sessnaam = "'.$naam.'"';
if(!mysql_query($sql)) {
throw new Exception('Er is een fout opgetreden tijdens het updaten van een sessie');
}
}
$this->sessiondata[$naam] = $val;
return true;
}
/**
* Delete a session
* @param string - session wich you would like to destroy
* @return void
*/
public function deleteSession($naam) {
if(array_key_exists($naam, $this->sessiondata)) {
unset($this->sessiondata[$naam]);
$sql = 'DELETE FROM '.$this->_sessiondatadb.'
WHERE sessid = "'.$this->_sessie.'" AND sessnaam = "'.$naam.'"';
mysql_query($sql);
}
}
/**
* Create a unique id
*/
protected function _createSessionName() {
return md5(uniqid());
}
}
?>
<?php /** * DBsession * custom method to make sessions * this class uses sessions wich are set in a database * * @author: Arjan Veldkamp <arjan@arjanv.nl> * @date: 27/06/2011 */ class DBsession { /** * How long a session should exist **/ public $lifetime = 3600; private $_sessie; private $_sessiedb = 'sessies'; private $_sessiondatadb = 'sessies_data'; protected $secret; protected $sessiondata = array(); public function __construct() { $this->secret = sha1(md5('mySecreyKey')); $this->prepareSession(); } /** * Check if we need to update or create a new session */ public function prepareSession() { if(!isset($_COOKIE[$this->secret])) { $this->_startSession(); } else { $this->_extendSession(); } $this->_getSessionData(); } /** * Start a new session, the user has not been here before, or the old session has been expired * * We will put a cookie on the user's machine with a key, this key gives access to the data assigned to this cookie */ protected function _startSession() { $exptime = time() + $this->lifetime; $sessname = $this->_createSessionName(); setcookie($this->secret, $sessname, $exptime); $sql = 'INSERT INTO '.$this->_sessiedb.' (naam, gestart_op, laatste_actie, expires) VALUES("'.$sessname.'", NOW(), NOW(), '.$exptime.')'; throw new Exception('Er trad een fout op tijdens het maken van een sessiekey', 2); } $this->_sessie = $sessname; } /** * This user has been here before within the given lifetime of the session * * We are gonna extend the cookie with the given lifetime */ protected function _extendSession() { $exptime = time() + $this->lifetime; $this->_sessie = $_COOKIE[$this->secret]; setcookie($this->secret, $this->_sessie , $exptime); $sql = 'SELECT naam FROM '.$this->_sessiedb.' WHERE naam = "'.$this->_sessie.'" $sql = 'UPDATE '.$this->_sessiedb.' SET expires = '.$exptime.', laatste_actie = NOW() WHERE naam = "'.$this->_sessie.'"'; throw new Exception('Er trad een fout op tijdens het verlengen van de sessiekey', 2); } } else { $this->_startSession(); } } /** * Get all session-data wich fits with the sessionkey * The sessionkey connects the browser with the sessiondata */ protected function _getSessionData() { $sql = 'SELECT sessnaam, sessdata FROM '.$this->_sessiondatadb.' WHERE sessid = "'.$this->_sessie.'"'; $this->sessiondata[$row['sessnaam']] = $row['sessdata']; } } } /** * Get the session */ public function getSession($key) { return $this->sessiondata[$key]; } return false; } /** * Set a new session variable * @param string - session-name * @param mixed - the session's value * * When the session-name allready exists, update it with the new value */ public function setSession($naam, $val='') { $sql = 'INSERT INTO '.$this->_sessiondatadb.' (sessid, sessnaam, sessdata) VALUES( "'.$this->_sessie.'", "'.$naam.'", "'.$val.'")'; throw new Exception('Er is een fout opgetreden tijdens het maken van een sessie'); } } else { $sql = 'UPDATE '.$this->_sessiondatadb.' SET sessdata = "'.$val.'" WHERE sessid = "'.$this->_sessie.'" AND sessnaam = "'.$naam.'"'; throw new Exception('Er is een fout opgetreden tijdens het updaten van een sessie'); } } $this->sessiondata[$naam] = $val; return true; } /** * Delete a session * @param string - session wich you would like to destroy * @return void */ public function deleteSession($naam) { unset($this->sessiondata[$naam]); $sql = 'DELETE FROM '.$this->_sessiondatadb.' WHERE sessid = "'.$this->_sessie.'" AND sessnaam = "'.$naam.'"'; } } /** * Create a unique id */ protected function _createSessionName() { } } ?>
Download code (.txt)
|
|
Stemmen |
Niet ingelogd. |
|