Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Guardar objectos en sesiones

Estas en el tema de Guardar objectos en sesiones en el foro de PHP en Foros del Web. Hola a todos! Estuve leyendo sobre si es una buena practica guardar objetos en sesiones, pero no termina de quedarme del todo claro.. Les pongo ...
  #1 (permalink)  
Antiguo 11/06/2013, 07:17
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Guardar objectos en sesiones

Hola a todos!

Estuve leyendo sobre si es una buena practica guardar objetos en sesiones, pero no termina de quedarme del todo claro.. Les pongo lo ultimo encontrado en StackOverflow..

No se si dependera de cada caso si es viable (o optimo?) hacer esto. que creen?

Si tomo como ejemplo el carrito creado aqui, se guarda el objeto en la sesion luego de realizar todas las acciones, pero no se trabaja directamente en ella.. (yo estoy intentando trabajar directamente con los objetos en la sesion como veran debajo).

Mi situacion es la siguiente:
- al loguearse un usuario, se crea un objeto usuario con algunas propiedades.
- si es particular y establecimiento, creo objetos dentro de esas propiedades en usuario.
- si crea avisos, estos se guardaran en la propiedad "avisos"(array) en Usuario. Y con ellos realizare acciones.


En cada clase a usar (usuario, particular, establecimiento, etc) tengo un constructor que llama a la clase conexion y conecta.
La clase conexion, es similar al ultimo link (al del carrito) y tiene un destructor que la cierra.

Código:
// En class.login.php si es exitoso
require_once('class.usuario.php');
require_once('class.particular.php');
require_once('class.establecimiento.php'); // el usuario puede ser solo "usuario" o "usuario particular" o " usuario particular establecimiento"

$_SESSION['usuario'] = new Usuario($this->_userid);

$temp_particular = new Particular($this->_userid);
if($temp_particular->esParticular == true): $_SESSION['usuario']['particular'] = $temp_particular; endif;
unset($temp_particular);

$temp_establecimiento = new Establecimiento($this->_userid);
if($temp_establecimiento->esEstablecimiento == true): $_SESSION['usuario']['establecimiento'] = $temp_establecimiento; endif;
unset($temp_establecimiento);
Luego, en la pagina de datos de usuario por ej, lo que hago es:

Código:
require_once($path.'class.usuario.php');
require_once($path.'class.particular.php');
require_once($path.'class.establecimiento.php');

session_start();

Nombre del particular: <?php echo $_SESSION['usuario']->particular->nombre;?>
Nombre del establecimiento: <?php echo $_SESSION['usuario']->establecimiento->nombre;?>
Si bien esto funciona y devuelve los datos, al final de la pagina aparece este error:

Código:
Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in C:\xampp\htdocs\!clasificados\inc\class\class.conexion.php on line 46
Aparece repetido 3 veces (por la llamada a conexion dentro de usuarios, particular y establecimientos).
Pero no entiendo porque..

espero puedan ayudarme,
saludos!!
  #2 (permalink)  
Antiguo 11/06/2013, 08:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Guardar objectos en sesiones

No veo que uses serialize() en ningun lado

http://php.net/manual/es/function.serialize.php
__________________
Salu2!
  #3 (permalink)  
Antiguo 11/06/2013, 08:55
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Guardar objectos en sesiones

Hola italico, gracias por responder..

por lo que leido PHP5 automicamente hace serialize/unserialize y no es necesario realizarlo.. Las variables hacen un output correctamente sin ello..
  #4 (permalink)  
Antiguo 11/06/2013, 09:00
Avatar de Reedyseth  
Fecha de Ingreso: enero-2009
Ubicación: Chihuahua, México
Mensajes: 419
Antigüedad: 15 años, 9 meses
Puntos: 36
Respuesta: Guardar objectos en sesiones

Cita:
Warning: mysqli::close() [mysqli.close]:
Se me hace que en un while/for/foreach/dowhile que tienes estas cerrando el cursor antes de que termines de hacer tu consulta.

Lo estas cerrando en algún lugar??
__________________
Reedyseth
Te ayudo? No olvides dar un +
blog:http://behstant.com/blog
En el blog:Tutoriales de Desarrollo Web PHP, Javascript, BD y más.
  #5 (permalink)  
Antiguo 11/06/2013, 09:15
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Guardar objectos en sesiones

hola reedyseth,
el tema es que no tengo ningun bucle dentro del script.. en el unico lugar que cierro la conexion es en su clase

Código:
class Conexion {
	
	private $_mysqli;
	private $_resultSQL;
	public $insert_id;
	
	public function __construct(){
		$this->_connect();
	}
	
	/******************************************
	* Conectar con bd
	*******************************************/
	private function _connect(){
		require_once('././conf/config.php');
		
		$this->_mysqli = new MySQLi(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DB);
		if($this->_mysqli->connect_errno){
			throw new Exception('Imposible conectar con la base de datos');
		}
		if(!$this->_mysqli->set_charset('utf8')){
			throw new Exception('Fallo la carga del conjunto de caracteres utf8');
		}
		
		return $this->_mysqli;
	}
	/******************************************
	* Para exportar la conexion
	*******************************************/
	public function ejecutarSQL($my_query){
		$this->_resultSQL = $this->_mysqli->query($my_query);
		
		if(!$this->_resultSQL){
			throw new Exception('Se produjo un error al intentar enviar la consulta.');
		}
		
		if($this->_mysqli->insert_id){ $this->insert_id = $this->_mysqli->insert_id; }
		
		return $this->_resultSQL;
	}
	
	public function __destruct(){
		if($this->_mysqli){
			$this->_mysqli->close();
		}
	}
	
}
y luego en el constructor de las clases usuario, particular y establecimiento hago

Código:
// incluyo la clase conexion, la defino y..
function public __construct(){
$this->_conexion = new Conexion();
}
  #6 (permalink)  
Antiguo 11/06/2013, 09:27
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Guardar objectos en sesiones

Sera que se te activa el destructor que llama al close() en alguna de esas 3 veces ? digamos la segunda vez ?

Cita:
public function __destruct(){
if($this->_mysqli){
$this->_mysqli->close();
}
}
__________________
Salu2!
  #7 (permalink)  
Antiguo 11/06/2013, 09:53
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Guardar objectos en sesiones

Pero no deberia aparecer entonces solo 1 o 2 veces el error?

el resultado es:

Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in C:\xampp\htdocs\!clasificados\inc\class\class.cone xion.php on line 47

Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in C:\xampp\htdocs\!clasificados\inc\class\class.cone xion.php on line 47

Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in C:\xampp\htdocs\!clasificados\inc\class\class.cone xion.php on line 47
  #8 (permalink)  
Antiguo 11/06/2013, 10:04
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Guardar objectos en sesiones

y cual es la linea 46 ?
__________________
Salu2!
  #9 (permalink)  
Antiguo 11/06/2013, 10:12
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Guardar objectos en sesiones

la linea 46 (luego 47) es la de close()..

lo que pasa que intente agregar if($this->_mysqli){ a ver si cambiaba..

he modificado los constructores en las clases (no la de conexion) para que se ejecute automaticamente ninguna funcion, solo instanciar la conexion y el problema persiste..

si quito $this->_conexion = new Conexion(); en cada una de ellas el error no aparece mas (y obviamente no tienen conectividad)
  #10 (permalink)  
Antiguo 11/06/2013, 10:23
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Guardar objectos en sesiones

Creo que el problema es justamente que intentas cerrar la conexion cuando esta cerrada, prueba hacer un ping()

http://php.net/manual/en/mysqli.ping.php

o... agregate la propiedad:

Cita:
private $_connection;
la seteas al conectar y luego...

Cita:
if ($this->connection instanceof \mysqli)
{
$this->_connection->close();
}
__________________
Salu2!
  #11 (permalink)  
Antiguo 11/06/2013, 10:30
 
Fecha de Ingreso: marzo-2012
Mensajes: 102
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Guardar objectos en sesiones

no veo como si el mismo destructor es quien la cierra (puede estar cerrandose desde otro lugar sin que yo lo haya especificado?).

la tengo especificada al comienzo como private $_conexion;

de todas formas parece que encontre solucionarlo (digo parece por si sale algo nuevo). Encontre un metodo para, en vez de chequear si es true o false la conexion, verifique si es un recurso is_resource

entonces quedaria

Código:
public function __destruct(){
	if($this->_mysqli){
		$this->_mysqli->close();
	}
}
Código:
public function __destruct(){
	if(is_resource($this->_mysqli)){
		$this->_mysqli->close();
	}
}

Etiquetas: html, mysql, sesiones, usuarios
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 22:19.