Tema: Sesiones
Versión de PHP: 4.x
Pregunta: Como personalizo las sesiones para alamcenarlas en una base de datos de MySQL ?
Respuesta:
Estructura de la tabla
Código:
DROP TABLE IF EXISTS `sesiones`.`sesiones`;
CREATE TABLE `sesiones` (
`pk` varchar(32) NOT NULL default '',
`inicio` int(10) unsigned NOT NULL default '0',
`fin` int(10) unsigned NOT NULL default '0',
`valor` longtext NOT NULL,
PRIMARY KEY (`pk`)
) TYPE=MyISAM;
Clase que se encarga de manejar las sesiones:
Código PHP:
//******************** ClaseSesiones.php ********************************
define('SQL_LEER_SESION',"SELECT valor FROM %s WHERE pk = '%s'");
define('SQL_ACTUALIZAR_SESION',"UPDATE %s SET fin = %d, valor = '%s' WHERE pk = '%s'");
define('SQL_AGREGAR_SESION',"INSERT INTO %s VALUES('%s',%d,%d,'%s')");
define('SQL_BORRAR_SESION',"DELETE FROM %s WHERE pk = '%s'");
define('SQL_EXPIRA_SESION',"DELETE FROM %s WHERE inicio < %d");
class MSesiones{
var $_tabla;
var $_BDUsuario;
var $_BDClave;
var $_BDHost;
var $_BDatos;
var $_idConMysql;
var $_tiempo_sesion = 10;
var $_operSQL = array(
SQL_LEER_SESION,
SQL_ACTUALIZAR_SESION,
SQL_AGREGAR_SESION,
SQL_BORRAR_SESION,
SQL_EXPIRA_SESION,
);
var $_keys = array(
'_tabla',
'_BDUsuario',
'_BDClave',
'_BDHost',
'_BDatos',
'_tiempo_sesion'
);
function MSesiones($parametros,$sesion = true){
if(!$sesion){
return;
}
session_set_save_handler (
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc')
);
if(!is_array($parametros)){
trigger_error('Debe de pasar un arreglo',E_USER_ERROR);
}
foreach($parametros as $k => $v){
if(!in_array($k,$this->_keys)){
trigger_error("Falta el parametro $k",E_USER_ERROR);
}
if(empty($v)){
continue;
}
$this->$k = $v;
}
}
function open($salvar_sesion,$nombre_sesion){
$this->_idConMysql = @mysql_connect($this->_BDHost,$this->_BDUsuario,$this->_BDClave);
$bdatos = @mysql_select_db($this->_BDatos);
if(!$this->_idConMysql || !$bdatos){
return false;
}
return true;
}
function close(){
$this->gc(0);
return true;
}
function read($id){
$sql = sprintf($this->_operSQL[0],$this->_tabla,$id);
$rMysql = @mysql_query($sql,$this->_idConMysql);
if(!@mysql_num_rows($rMysql)>0){
return '';
}
$regValor = mysql_fetch_assoc($rMysql);
return $regValor['valor'];
}
function write($id,$valor){
$sql = sprintf($this->_operSQL[1],$this->_tabla,time(),$valor,$id);
$rMysql = @mysql_query($sql);
if(!$rMysql){
return false;
}
if(mysql_affected_rows($this->_idConMysql)){
return true;
}
$sql = sprintf($this->_operSQL[2],$this->_tabla,$id,time(),time(),$valor);
$rMysql = @mysql_query($sql);
if(mysql_affected_rows($this->_idConMysql)){
return true;
}else{
return false;
}
}
function destroy($id){
$sql = sprintf($this->_operSQL[3],$this->_tabla,$id);
$rMysql = @mysql_query($sql);
if(mysql_affected_rows($this->_idConMysql)){
return true;
}else{
return false;
}
}
function gc($vida){
$sql = sprintf($this->operSQL[4],strtotime("-$this->_tiempo_sesion minutes"));
$rMysql = @mysql_query($sql);
if(mysql_affected_rows($this->_idConMysql)){
return true;
}else{
return false;
}
}
}//Fin MSesiones
Ejemplo de uso:
Código PHP:
//Incluimos la definicion de la clase
require('ClaseSesiones.php');
//la clase espera un arreglo con los siguientes parametros
//_tabla = tabla de la base de datos que contendra los datos de las sesiones
//_BDusuario = cuenta de conexion a mysql
//_BDClave = contraseña de la cuenta de mysql
//_BDHost = servidor al que se quiere acceder
//_BDatos = Base de datos a la que accede la cuenta
//_tiempo_sesion = tiempo que existira como registro de la sesion en minutos
// si se deja en blanco pone como default 10 minutos
//
$conf = array( '_tabla'=>'sesiones',
'_BDUsuario'=>'hersan',
'_BDClave'=>'jasson',
'_BDHost'=>'localhost',
'_BDatos'=>'sesiones',
'_tiempo_sesion'=>'');
// creamos objeto sesion
$sesion = new MSesiones($conf);
// iniciamos la sesion
session_start();
if (!isset ($_SESSION['counter'])) {
$_SESSION['counter'] = 1;
}
$_SESSION['counter']++;
echo $_SESSION['counter'];