Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/06/2005, 10:27
HerSAn
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 18 años, 10 meses
Puntos: 2
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'];