w3schools utilizando una sessions que actualizar php class session object

utilizando - PHP__PHP_Incomplete_Class Object con mis datos $_SESSION



sessions php w3schools (9)

Tengo una configuración de sitio que, al cargar la página, convierte todas las cadenas enviadas por el usuario en objetos SafeString. Para aquellos que no están familiarizados con SafeString, básicamente obliga al usuario a hacer eco de los datos desinfectados que evitan XSS y todo lo demás.

De todos modos, hay un problema. Mi matriz $ _SESSION se está rellenando con el __PHP_Incomplete_Class Object . Según lo que he leído, esto se debe a que no se inicializó la clase antes de la sesión y luego se almacenaron los objetos de la clase en la sesión.

Aquí está mi código:

require_once __WEBROOT__ . ''/includes/safestring.class.php''; $temp = array ( &$_SERVER, &$_GET, &$_POST, &$_COOKIE, &$_SESSION, &$_ENV, &$_REQUEST, &$_FILES, &$HTTP_SERVER_VARS, &$HTTP_GET_VARS, &$HTTP_POST_VARS, &$HTTP_COOKIE_VARS, &$HTTP_POST_FILES, &$HTTP_ENV_VARS ); function StringsToSafeString(&$array) { foreach ($array as $key => $value) { if (is_string($array[$key])) { $array[$key] = new SafeString($value); } if (is_array($array[$key])) { StringsToSafeString($array[$key]); } } } StringsToSafeString($temp); unset($temp);

No puedo pensar en una forma de reescribir esto que resolvería el problema: /

¿Algunas ideas?


Acabo de tratar con algo como esto. Me tomó horas para finalmente encontrar cómo mi orden fue jodida.

Tengo un archivo que se llama asincrónicamente.

myFile.php

ese archivo contenía lo siguiente ...

$result = include ("myOtherFile.php"); return $result;

Myotherfile.php tiene algo como esto

require_once "lib/myClassLibs.php"; require_once "webconfig.php";

el webconfig.php tenía la llamada session_start () en él.

Lib / myClassLibs tiene toda la información de clase init. Si marca antes de la llamada webconfig, puede ver que la clase está disponible.

Si comprueba antes de la llamada webconfig, también verá que la sesión ya ha comenzado. Si comprueba antes lib / myClassLibs.php, verá que la sesión ya se inició.

Comprobando en myFile.php antes de incluir MyOtherFile.php, encuentra que la sesión no ha comenzado.

Esto representa un código heredado que ha funcionado durante los últimos 8 años sin que yo haya tenido problemas con él. Saqué el include de "MyOtherFile.php". Ahora mis sesiones están sincronizando correctamente.


Cuando accede a $_SESSION , no solo está cambiando la copia del script actual de la lectura de datos de la sesión, está escribiendo objetos SafeString en la sesión activa.

Pero poner objetos personalizados en la sesión es dudoso y es algo que generalmente trataría de evitar. Para poder hacerlo, debe haber definido la clase en cuestión antes de llamar a session_start ; si no lo hace, el manejador de sesión de PHP no sabrá cómo deserializar las instancias de esa clase, y terminará con el __PHP_Incomplete_Class Object .

Así que evita pasar por alto la sesión. Si debe seguir este enfoque, haga una copia de los datos de $_SESSION en una matriz $mysession local. Sin embargo, debo decir que creo que la idea de SafeString es peligrosa e inviable; No creo que este enfoque sea siempre hermético. Si una cadena de texto sin procesar es ''segura'' no tiene nada que ver con su origen, es una propiedad de cómo la codifica para el contexto de destino.

Si obtiene otra cadena de texto de una fuente diferente, como la base de datos, o un archivo, o calculada dentro de la propia secuencia de comandos, necesita exactamente el mismo tratamiento que una cadena que proviene del usuario: debe ser htmlspecialchars . Vas a tener que escribir ese escape de todos modos; la red segura no te gana nada. Si necesita enviar la cadena a un formato de destino diferente, necesitaría un escape diferente.

No puede encapsular todos los problemas de procesamiento de cadenas en un solo cuadro práctico y nunca pensar en ellos nuevamente; así no es cómo funcionan las cuerdas.


La respuesta de Lukman es correcta. Pero ya lo mencionas en tu pregunta, por lo que aparentemente no puedes crear una instancia de la clase antes de que comience la sesión, por alguna razón.

Es posible que desee comprobar si las sesiones se inician automáticamente en la configuración de php: http://www.php.net/manual/en/session.configuration.php#ini.session.auto-start

Si lo son y no puede ayudarlo, es posible que desee comprobar si puede tener sus clases cargadas automáticamente antes de eso: http://php.net/manual/en/language.oop5.autoload.php

Si todo lo demás falla, aún puede serializar los objetos antes de almacenarlos en una sesión, y deserializarlos cada vez que los recupere: http://php.net/manual/en/function.serialize.php

No veo en su código donde almacena sus variables, pero sería algo así como

$mystuff = unserialize($_SESSION["mystuff"]); $mystuff->dostuff(); $_SESSION["mystuff"] = serialize($mystuff);

Asegúrese de cargar la definición de la clase antes de deserializar sus variables

$ 2c, * -pike


Mi error aquí fue que configuré la configuración de session.auto_start en on . La sesión se inicializaría antes de que se invoque cualquier línea de código (incluido el autocargador).


Resolví este problema al incluir la función __autoload en la parte superior de mi archivo php. Entonces se ve así:

<?php require_once("path/to/include.inc"); //Needed for serialization/deserialization function __autoload($class_name) { include "path/to/". $class_name . ''.php''; }

En PHP 5, esta función no es necesaria, pero estaba bloqueado hasta que usé esta función. ¡Espero que esto ayude a alguien más!


Sé que han pasado años desde que se hizo esta pregunta, pero estoy publicando mi respuesta porque ninguna de las respuestas anteriores realmente explica al OP lo que está realmente mal.

PHP serializa sus sesiones utilizando los métodos integrados serialize y unserialize . serialize de PHP tiene la capacidad de serializar objetos de PHP (también conocidos como instancias de clases) y convertirlos a cadenas. Cuando se unserialize esas cadenas, las convierte de nuevo esas mismas clases con esos valores. Las clases que tienen algunas propiedades privadas y desean codificar / decodificar eso o hacer algo complejo en su serialización / deserialización implementan la clase Serializable y agregan los métodos de serialize y unserialize a la clase.

Cuando la unserialize de PHP intenta deserializar un objeto de la clase, pero el nombre de la clase no se declara / requiere, en lugar de dar una advertencia o lanzar una Exception , la convierte a un objeto de __PHP_Incomplete_Class .

Si no desea que los objetos de su sesión se conviertan a __PHP_Incomplete_Class , puede hacerlo solicitando los archivos de clase antes de invocar session_start o registrando una función de autocarga.


Solo tiene que incluir el safestring.class.php antes de llamar a session_start() cuando desee leer los objetos $_SESSION variable $_SESSION :

<?php require_once __WEBROOT__ . ''/includes/safestring.class.php''; session_start(); print_r($_SESSION);

y sí, si está utilizando un framework PHP que (muy probablemente) llama a session_start() internamente, asegúrese de require_once el archivo de clase de antemano (use hooks o los mecanismos que proporcione el framework).


Tal vez solo estés llamando,

session_start(); session_start();

dos veces en tu código Llámalo una vez. Verifica las clases de PHP requeridas para las repeticiones. Esta fue la solución para mí.


json_encode el problema usando la función json_encode y json_decode .

Aquí es donde quería asignar el valor a la sesión.

$user_json = json_encode($user); $_SESSION[''user''] = $user_json;

Aquí es donde muestro al usuario después de decodificar el json

session_start(); $user_json= $_SESSION[''user'']; $user = json_decode($user_json);

Esto resuelve mi problema, pero no estoy seguro sobre el rendimiento o la seguridad. No los he comprobado.