2011-08-16 7 views
10
Class User{ 

public $id; 
public $username; 
public $password; 
public $email; 
public $steam; 
public $donator; 
public $active; 

public function __construct($username, $email, $password, $id, $active, $donator, $steam){ 
    $this->id = $id; 
    $this->username = $username; 
    $this->password = $password; 
    $this->email = $email; 
    $this->steam = $steam; 
    $this->donator = $donator; 
    $this->active = $active; 
}} 

es mi clase (simplificado)

la siguiente es mi código:

$_SESSION['loggedIn'] = $user; 

$ usuario es una instancia de clase de usuario

ahora esto es lo que print_r ($ _ SESSION [' loggedIn ']) me muestra:

__PHP_Incomplete_Class Object 
(
    [__PHP_Incomplete_Class_Name] => User 
    [id] => 22 
    [username] => xxxx 
    [password] => xxxx 
    [email] => xxxx 
    [steam] => 1234567 
    [donator] => 0 
    [active] => 1 
) 

en el que xxxx son valores correctos.

pero cuando intento recuperar datos de mi sesión. como ese: "$ _SESSION ['loggedIn'] -> username" me devuelve un valor nulo.

+0

posible duplicado de ["Almacenamiento de un objeto PHP en una variable de sesión"] (http://stackoverflow.com/questions/2042271/storing-a-php-object-in-a-session-variable), [" Sesión PHP con un objeto incompleto "] (http://stackoverflow.com/questions/1055728/php-session-with-an-incomplete-object), [" Problema con el objeto de sesión PHP "] (http: // stackoverflow. com/questions/5348457/problem-with-php-session-object). – outis

+1

Ver también ["PHP: Almacenamiento de 'objetos' dentro de $ _SESSION"] (http://stackoverflow.com/questions/132194/php-storing-objects-inside-the-session), ["¿Puedo guardar un objeto? En una sesión? "] (Http://www.phpriot.com/articles/intro-php-sessions/8). – outis

+0

no haría eso. Podría terminar con datos antiguos si, por ejemplo, el usuario usa otra computadora para cambiar su correo electrónico mientras está conectado a otra computadora. O si elimina al usuario de la base de datos, su aplicación aún pensaría que el usuario existe. En cambio, almacenaba solo el ID de usuario en la sesión y recuperaba el resto de la información de la base de datos cuando recibía solicitudes del usuario. – shesek

Respuesta

12

Debe serializar primero el objeto en una cadena:

$_SESSION['user'] = serialize($user);

y:

$user = unserialize($_SESSION['user']);

Sólo asegúrese de que la clase se define primero antes de revertir la seriación del objeto.

+10

PHP [serializar] (http://svn.php.net/viewvc/php/php-src/trunk/ext/session/session.c?revision=314376&view=markup#l187) y [unserialize] (http://svn.php.net/viewvc/php/php-src/trunk/ext/session.c?revision=314376&view=markup#l205) variables de sesión automáticamente. El motivo por el que funciona esta respuesta es la nota sobre cómo asegurarse de que la clase esté definida antes de la deserialización. – outis

+0

@outis ¿Podría proporcionar una referencia? Los dos enlaces que publicó están muertos, pero estoy buscando una referencia que confirme que, de hecho, la serialización se realiza automáticamente. –

+0

@Bram: los enlaces fueron al código fuente; específicamente, ext/session/session.c. Esa es la única referencia que conozco (hay un poco de comportamiento de PHP que no está documentado). – outis

-1

$_SESSION variables parecen ser solo capaces de almacenar matrices, números y cadenas.

No pueden almacenar un objeto de clase después de cambiar a una página nueva.

+0

bien, entonces ¿qué podría hacer es hacer una matriz en sesión? y llenarlo con ciertos valores recuperados de do-login.php? – sn0ep

+0

@Toby, sí, podrías hacer eso. – Neal

+0

¿Tiene una fuente para esto, o es una respuesta incorrecta (a partir de las otras respuestas). –

2

En la misma página, la variable session actúa como simplemente otra variable, por lo que puede hacer con ella lo que desee. Por eso puedes almacenar el objeto mientras estás en esa página.

Recuperarlo más tarde realmente mostrará si es apto para un session, que no está en su caso.

Si realmente necesita guardar ese objeto, puede tratar de guardarlo como un objeto serializado y deserializarlo después de la recuperación. Eso debería funcionar, aunque no sé si esta es la mejor solución/diseño. Pasar objetos de esta forma podría considerarse un poco ... anti-patrón

7

Puede almacenar objetos en $_SESSION. PHP los serializará por ti. Solo asegúrese de que la clase esté definida antes de llamar al session_start, o que puede ser autoloaded. La razón por la que el valor almacenado en la sesión tiene el tipo "__PHP_Incomplete_Class_Name" es que la clase de usuario no se definió cuando el objeto se deserializó durante la carga de la sesión (como se explica en la página de manual de PHP en object serialization).

Los recursos no se pueden serializar. Si alguna vez almacena un objeto que usa recursos, implemente __sleep and __wakeup para personalizar la serialización. La serialización de PHP debería poder manejar todos los demás tipos, incluso si contienen referencias circulares.

Cuestiones relacionadas