tried the script remove property method incomplete php session object

the - remove html tags php



SesiĆ³n de PHP con un objeto incompleto (7)

Me aparece un error que no sé cómo solucionarlo, así que me pregunto si podría obtener ayuda.

Este es el error

Fatal error: process_form() [<a href=''function.process-form''>function.process-form</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition &quot;Template&quot; of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in /home/twinmeddev/html/template_add.php on line 44

Obtengo este error en la función process_form (). Entonces, lo que obtengo de esto es que, pensando que no cargué la clase para la plantilla. Que de hecho lo hice en la parte superior. El include ''inc / item.class.php''; ¿Debo volver a incluirlo en la función?

Aquí está el código de la página en particular con el error. Puedes ver que tengo todo incluido como debería ser. ¿Dónde me he equivocado?

<?php include ''inc/prep.php''; include ''inc/header.class.php''; include ''inc/item.class.php''; include ''inc/template.class.php''; include ''inc/formhelper.class.php''; include ''inc/formvalidator.class.php''; include_once( ''inc/config/config.php'' ) ; include_once( ''inc/DBE.class.php'' ) ; include_once( ''inc/GenFuncs.php'' ) ; include_once( ''inc/Search.class.php'' ) ; session_start(); //Verify that user is logged in. VerifyLogin($_SERVER[''PHP_SELF''] . "?" . $_SERVER[''QUERY_STRING'']); if(array_key_exists(''_submit'',$_POST)) { if($fv_errors = validate_form()) { show_form($fv_errors); } else { process_form(); } } else { // The form wasn''t submitted or preview was selected, so display show_form(); } function validate_form(){ } function process_form(){ global $mysqli; echo var_dump($_SESSION); $Template = $_SESSION[''template'']; $Template->name = $_POST[''name'']; $Template->descript = $_POST[''descript'']; $Template->user = $_SESSION[''User'']; $Template->customer = $_SESSION[''CustID'']; $Template->status = $_POST[''status'']; $Template->insert(); //header("Location: template.php"); }


¿Qué tan grandes son los objetos que estás poniendo en la sesión? Obtuve un error similar una vez cuando mis objetos eran más grandes que el espacio que habíamos asignado para la sesión en el archivo php.ini. Si el objeto era demasiado grande, volvería a estar vacío cuando no debería haberlo sido.

Después de eso, comencé a almacenar el PK del objeto en la sesión y lo busqué si lo necesitaba en lugar de transportar todo el objeto en sí.

También podría aumentar el tamaño de la sesión en el archivo INI y ver si eso hace la diferencia.


Cuando session_start() en php $_SESSION array se rellena con los objetos correspondientes. Esto significa que todas las interfaces deben estar disponibles (requieren). Si la sesión ya ha sido iniciada previamente por otro script (por ejemplo, framework) que no tiene visibilidad en las interfaces, los objetos en $ _SESSION estarán incompletos, y lo harán de nuevo. session_start() es inútil porque la sesión ya se ha iniciado. Una posible solución es usar el método session_write_close() , luego session_start() que comienza de nuevo poblar $_SESSION , pero con visibilidad en la interfaz, por lo que su objeto en $_SESSION será bueno.


En mi caso, el orden en el que incluí mis archivos y llamé a session_start() fue incorrecto, como Carlos mencionó en su respuesta.

Pero no pude arreglar el orden.

Esta solución alternativa funcionó para mí:

$_SESSION["template"] = unserialize(serialize($_SESSION["template"]))


Falta la serialización / deserialización de su clase de plantilla.

Echa un vistazo aquí para ver un ejemplo de trabajo que di sobre otra cuestión tuya.

Por ejemplo, probablemente quieras esto:

<?php $_SESSION[''template''] = serialize($template); ?>

y

<?php $template = unserialize($_SESSION[''template'']); ?>

Editar:

leer tu comentario sobre moverlo a la cima da una pista.

La serialización / deserialización automática se produce cuando se llama a session_start() .
Eso significa que el orden en el que incluye sus archivos y llama al session_start() es muy importante.

Por ejemplo:

Esto estaría mal:

<?php session_start(); include ''inc/template.class.php''; ?>

Si bien esto sería correcto:

<?php include ''inc/template.class.php''; session_start(); ?>

Ahora, veo en tu ejemplo que está en el orden CORRECTO, pero también noté que haces muchos otros incluye antes de incluir template.class.php

¿Sería posible que uno de esos incluye (quizás prep.php o header.class.php) llama también a start_session() ?
En caso afirmativo, ese era su problema ( session_start() se llama antes de su template.class.php).


He publicado mi respuesta sobre una pregunta similar , volviendo a publicarla porque también responde a esta.

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.


Traté de almacenar objetos en la variable de sesión también. y sí, tuve el mismo problema que MackDaddy. y se resuelve moviendo la inclusión de la clase a la primera.

asi que..

require_once("class.someclass.php"); require_once("display.php");

trabajó

pero no...

require_once("display.php"); require_once("class.someclass.php");

hmm ... me pregunto ¿cuál es el racional? y ¿y si tenemos 2 o más objetos diferentes? ¿Cuál viene primero?


Asegúrese de que la definición de clase " Plantilla " del objeto sobre el que intenta operar se haya cargado antes ...
Supongo que include ''inc/template.class.php''; se supone que carga la definición de la clase Template?
Entonces quizás la inclusión falló. Intenta require lugar.

<?php require ''inc/prep.php''; require ''inc/header.class.php''; require ''inc/item.class.php''; require ''inc/template.class.php''; require ''inc/formhelper.class.php''; require ''inc/formvalidator.class.php''; require_once( ''inc/config/config.php'' ) ; require_once( ''inc/DBE.class.php'' ) ; require_once( ''inc/GenFuncs.php'' ) ; require_once( ''inc/Search.class.php'' ) ;

if ( !class_exists(''Template'') ) { die(''No. Those include/requires did not define the class "Template"''); } session_start();