Foros del Web » Programando para Internet » PHP »

Registrar datos de Sesión en BD

Estas en el tema de Registrar datos de Sesión en BD en el foro de PHP en Foros del Web. Hola a todos... Tengo esta tabla para guardar los datos de sesión y pretendo hacerlo con esta clase php que tengo. El problema es que ...
  #1 (permalink)  
Antiguo 25/02/2010, 17:46
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Registrar datos de Sesión en BD

Hola a todos...

Tengo esta tabla para guardar los datos de sesión y pretendo hacerlo con esta clase php que tengo.

El problema es que no escribe nada en la Tabla de la BD. Lamentablemente el tutorial de la clase ya no está más en esa dirección y no hay forma de encontrarlo.

No veo donde está la falla. Los datos de conexión son correctos y no da errores!

Por favor, si alguien me puede dar una mano o tal vez alguien que usa ésta misma clase me puede orientar!!!

Tabla "sessions"
Código PHP:
CREATE TABLE sessions (
   
ses_id varchar(32NOT NULL default '',
   
ses_time int(11NOT NULL default '0',
   
ses_start int(11NOT NULL default '0',
   
ses_value text NOT NULL,
   
PRIMARY KEY  (ses_id)
TYPE=MyISAM
La Clase "session_handler.php"
Código PHP:
<?php
/* This class code is based on the tutorial of Matt Wade 
from http://www.zend.com/zend/spotlight/code-gallery-wade8.php */

/* Create new object of class */ 
$ses_class = new session(); 

/* Change the save_handler to use the class functions */ 
session_set_save_handler (array(&$ses_class'_open'), 
                          array(&
$ses_class'_close'), 
                          array(&
$ses_class'_read'), 
                          array(&
$ses_class'_write'), 
                          array(&
$ses_class'_destroy'), 
                          array(&
$ses_class'_gc')); 

/* Start the session */ 
session_start(); 

class 
session {
    
/* Define the mysql table you wish to use with 
       this class, this table MUST exist. */ 
    
var $ses_table SESSION_TABLE

    
/* Change to 'Y' if you want to connect to a db in 
       the _open function */ 
    
var $db_con "Y"

    
/* Configure the info to connect to MySQL, only required 
       if $db_con is set to 'Y' */ 
    
var $db_host DB_SERVER
    var 
$db_user DB_USER
    var 
$db_pass DB_PASSWORD
    var 
$db_dbase DB_NAME

    
/* Create a connection to a database */ 
    
function db_connect() { 
        
$mysql_connect = @mysql_pconnect ($this->db_host
                                          
$this->db_user
                                          
$this->db_pass); 
        
$mysql_db = @mysql_select_db ($this->db_dbase); 

        if (!
$mysql_connect || !$mysql_db) { 
            return 
FALSE
        } else { 
            return 
TRUE
        } 
    } 

    
/* Open session, if you have your own db connection 
       code, put it in here! */ 
    
function _open($path$name) { 
        if (
$this->db_con == "Y") { 
            
$this->db_connect(); 
        } 

        return 
TRUE
    } 

    
/* Close session */ 
    
function _close() { 
        
/* This is used for a manual call of the 
           session gc function */ 
        
$this->_gc(0); 
        return 
TRUE
    } 

    
/* Read session data from database */ 
    
function _read($ses_id) { 
        
$session_sql "SELECT * FROM " $this->ses_table 
                     
" WHERE ses_id = '$ses_id'"
        
$session_res = @mysql_query($session_sql); 
        if (!
$session_res) { 
            return 
''
        } 

        
$session_num = @mysql_num_rows ($session_res); 
        if (
$session_num 0) { 
            
$session_row mysql_fetch_assoc ($session_res); 
            
$ses_data $session_row["ses_value"]; 
            return 
$ses_data
        } else { 
            return 
''
        } 
    } 

    
/* Write new data to database */ 
    
function _write($ses_id$data) { 
        
$session_sql "UPDATE " $this->ses_table 
                     
" SET ses_time='" time() 
                     . 
"', ses_value='$data' WHERE ses_id='$ses_id'"
        
$session_res = @mysql_query ($session_sql); 
        if (!
$session_res) { 
            return 
FALSE
        } 
        if (
mysql_affected_rows ()) { 
            return 
TRUE
        } 

        
$session_sql "INSERT INTO " $this->ses_table 
                     
" (ses_id, ses_time, ses_start, ses_value)" 
                     
" VALUES ('$ses_id', '" time() 
                     . 
"', '" time() . "', '$data')"
        
$session_res = @mysql_query ($session_sql); 
        if (!
$session_res) {     
            return 
FALSE
        }         else { 
            return 
TRUE
        } 
    } 

    
/* Destroy session record in database */ 
    
function _destroy($ses_id) { 
        
$session_sql "DELETE FROM " $this->ses_table 
                     
" WHERE ses_id = '$ses_id'"
        
$session_res = @mysql_query ($session_sql); 
        if (!
$session_res) { 
            return 
FALSE
        }         else { 
            return 
TRUE
        } 
    } 

    
/* Garbage collection, deletes old sessions */ 
    
function _gc($life) { 
        
$ses_life strtotime("-5 minutes"); 

        
$session_sql "DELETE FROM " $this->ses_table 
                     
" WHERE ses_time < $ses_life"
        
$session_res = @mysql_query ($session_sql); 


        if (!
$session_res) { 
            return 
FALSE
        }         else { 
            return 
TRUE
        } 
    } 

?>
  #2 (permalink)  
Antiguo 25/02/2010, 17:52
Avatar de jorgedx  
Fecha de Ingreso: junio-2005
Ubicación: Chile, Los Andes
Mensajes: 406
Antigüedad: 18 años, 10 meses
Puntos: 4
Respuesta: Registrar datos de Sesión en BD

Te recomiendo que empieces por quitar los @ que esta delante de las sentencias de consulta a la base de datos ya que este operador no permite visualizar algún posible error...
__________________
Nuevamente a las pistas ...
  #3 (permalink)  
Antiguo 25/02/2010, 19:16
Avatar de camsworksinc  
Fecha de Ingreso: julio-2008
Ubicación: Queretaro
Mensajes: 261
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: Registrar datos de Sesión en BD

En la funcion Write, lo que estas haciendo es ACTUALIZAR un registro, no INSERTARLO, y dado que no existe previamente, NUNCA LO GUARDARA.
Te explico porque:
En esa funcion, tienes primero un query que trata de actualizar un registro, el cual seguramente no existe.
Código PHP:
Ver original
  1. {  
  2.         $session_sql = "UPDATE " . $this->ses_table  
  3.                      . " SET ses_time='" . time()  
  4.                      . "', ses_value='$data' WHERE ses_id='$ses_id'";  
  5.         $session_res = @mysql_query ($session_sql);  
  6.         if (!$session_res) {  
  7.             return FALSE;  
  8.         }  
  9.         if (mysql_affected_rows ()) {  
  10.             return TRUE;  
  11.         }
Y una vez que realizas el query, verificas si se ejecuto correctamente. Como no hubo registro que actualizar, entonces siempre regresa el valor de falso, y por tanto YA NO CONTINUA CON LO DEMAS.
Mas abajo tienes el siguiente codigo:
Código PHP:
Ver original
  1. $session_sql = "INSERT INTO " . $this->ses_table  
  2.                      . " (ses_id, ses_time, ses_start, ses_value)"  
  3.                      . " VALUES ('$ses_id', '" . time()  
  4.                      . "', '" . time() . "', '$data')";  
  5.         $session_res = @mysql_query ($session_sql);  
  6.         if (!$session_res) {      
  7.             return FALSE;  
  8.         }         else {  
  9.             return TRUE;  
  10.         }

Que este SI puede insertar el registro nuevo a la base de datos, pero dado que la parte anterior regresa un valor y no continua con la ejecucion, esta parte NUNCA se ejecuta.
Simplemente quita la primera parte y debe de funcionar, y escribe otra funcion que se llame actualizar() o algo asi, que contenga la primera parte para que tengas tu clase completa.

Suerte1
__________________
¡Malditas computadoras que siempre hacen lo que les DIGO que hagan, no lo que QUIERO que hagan!
  #4 (permalink)  
Antiguo 25/02/2010, 23:29
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Registrar datos de Sesión en BD

Hola gente y gracias por ayudarme...

1.- He probado quitando los "@" como dice jorgedx y nada, no escribe ningún registro.

2.- pruebo como dice camsworksinc quitando el "UPDATE" y poniendo como función _write solamente esto para ver si escribe algo y nada:

Código PHP:
function _write($ses_id$data) { 
        
$session_sql "INSERT INTO " $this->ses_table 
                     
" (ses_id, ses_time, ses_start, ses_value)" 
                     
" VALUES ('$ses_id', '" time() 
                     . 
"', '" time() . "', '$data')"
        
$session_res mysql_query ($session_sql); 
        if (!
$session_res) {     
            return 
FALSE
        }         else { 
            return 
TRUE
        } 
    } 
sigue sin guardar ningún registro!
  #5 (permalink)  
Antiguo 26/02/2010, 00:45
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: Registrar datos de Sesión en BD

tienes que crear la session que ralacionara a --->$ses_id

ya que si no exite no hay que meter en db
en tus consultas colocas ---> " WHERE ses_id = '$ses_id'";

¿pero cual es el valor de $ses_' ?

coloca al principio $ses_id="3333";
y has la prueba

saludos!!
  #6 (permalink)  
Antiguo 26/02/2010, 11:36
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Registrar datos de Sesión en BD

Hola zerpico_01...

Probé dandole valor a "$ses_id" y tampoco, no escribe nada. Le doy vueltas y no se donde está la falla...
  #7 (permalink)  
Antiguo 26/02/2010, 20:36
 
Fecha de Ingreso: octubre-2004
Mensajes: 768
Antigüedad: 19 años, 6 meses
Puntos: 3
Respuesta: Registrar datos de Sesión en BD

Hola nuevamente...

Ya encontré el error y no era error del script sino mío por gran torpeza!

Resulta que en el login del usuario incluyo el "session handler.php" de esta manera:

Código PHP:
if (USE_MYSQL_SESSIONS) {
    include_once(
$_SERVER['DOCUMENT_ROOT']."session_handler.php"); 
} else {
    
session_start();

pero, en la configuración de las variables, tenía esto:

Código PHP:
// ¡Importante! utilizar esta función para almacenar los datos de la sesión en su base de datos Mysql
// desactivar esta función si su servidor no es compatible con este controlador de sesión.
define("USE_MYSQL_SESSIONS"false); // "false" para deshabilitar esta opción 
Por lo tanto, lo que había que hacer es poner el define("USE_MYSQL_SESSIONS", true);

y eso era todo!

Etiquetas: bd, sesión
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:51.