Visto il gran numero di post che riguardano le sessioni e la gestione delle sessioni, vi propongo una soluzione abbastanza universale per i sistemi attuali.
Le classi sono funzionanti e gestiscono lo stretto necessario cosi sono facili da integrare o riutilizzare se a qualcuno servono. Le sessioni verranno salvate su un database mysql utilizzando PDO
Per saperne di più:
http://www.php.net/manual/en/book.session.php
http://www.w3schools.com/Php/php_sessions.asp
http://www.sitepoint.com/php-sessions/
http://www.html.it/articoli/sessioni...me-si-usano-1/
La tabella necessaria per sfruttare questo sistema è:
Codice PHP:
CREATE TABLE IF NOT EXISTS `sessions` (
`id` varchar(128) collate utf8_unicode_ci NOT NULL,
`value` longblob,
`expiry` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Per l'inserimento a database (come spesso succede) mi avvalgo di un adapter per la classe PDO, il mio si chiama myPDO, sfrutta PDO per aggregazione ed è molto semplice ma funzionale:
myPDO.php
Codice PHP:
final class myPDO {
private $pdo;
private $stmt;
public function __construct( PDO $pdo ) {
$this->pdo = $pdo;
}
/**/
public function executeQuery( $sql, array $params = array() ) {
if ( !empty( $params ) ) {
foreach ( $params AS $col=>$value ) {
unset( $params[$col] );
$params[':'.$col] = $value;
}
}
try {
$this->stmt = $this->pdo->prepare( $sql );
$this->stmt->execute( $params );
$this->stmt->setFetchMode( PDO::FETCH_ASSOC );
return $this->stmt;
} catch( PDOException $e ) {
throw new Exception( $e->getMessage() );
}
}
public function getError() {
return $this->stmt->errorInfo();
}
}
l'unico metodo è un "executeQuery" che mi risparmia i ":" sui parametri e la preparazione delle query
so che molti usano il proprio adapter, quindi fate attenzione nella classe successiva cosi potete sostituire i miei metodi con i vostri, se necessario
adapter per saperne di più:
http://www.sitepoint.com/integrating-the-data-mappers/
Passiamo ora alla gestione delle sessioni, vi invito a leggere la documentazione proposta sopra per approfondire la questione.
A noi basta sapere che PHP mette a disposizione una funzione carina che ci permette di registrare una classe, o funzione "diversa" da quella nativa per la gestione delle sessioni.
La funzione è session_set_save_handler()
approfondisci: http://www.php.net/manual/en/functio...ve-handler.php
useremo questa funzione per registrare la nostra classe al posto di quella nativa.
session.php
Codice PHP:
final class session {
private $pdo;
private $table = 'sessions';
public function __construct( myPDO $pdo ) {
$this->pdo = $pdo;
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
session_start();
}
public function open($path, $name) {
$sid = session_id();
$insertQuery = <<<QUERY
INSERT INTO
$this->table
(id, value, expiry)
VALUES
(:id, '', '')
ON DUPLICATE KEY
UPDATE
expiry = NOW()
QUERY;
$this->pdo->executeQuery( $insertQuery, array( 'id'=>$sid ) );
return TRUE;
}
public function close() {
}
public function read( $id ) {
$query = "SELECT value FROM $this->table WHERE id = :id";
return $this->pdo->executeQuery( $query, array( 'id'=>$id ) )->fetchColumn();
}
public function write( $id, $data ) {
$insertQuery = <<<QUERY
INSERT INTO
$this->table
SET
id = :id,
value = :value
ON DUPLICATE KEY
UPDATE
value = :value
QUERY;
$this->pdo->executeQuery( $insertQuery, array( 'id'=>$id, 'value'=>$data ) );
}
public function destroy( $id ) {
$query = "DELETE FROM $this->table WHERE id = :id";
$this->pdo->executeQuery( $query, array( 'id'=>$id ) );
return TRUE;
}
public function gc( $maxlifetime ) {
$query = "DELETE FROM $this->table WHERE expiry < DATE_SUB(NOW(), INTERVAL $maxlifetime SECOND)";
$this->pdo->executeQuery( $query );
return TRUE;
}
}
nel prossimo post vi spiego i vari metodi e poi un esempio di come usare le classi assieme..
intanto buona lettura