具有不完整对象的PHP会话

具有不完整对象的PHP会话,php,session,object,Php,Session,Object,我遇到了一个错误,我不知道如何修复,所以我想知道是否可以得到一些帮助 这就是错误所在 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

我遇到了一个错误,我不知道如何修复,所以我想知道是否可以得到一些帮助

这就是错误所在

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
致命错误:process_form()[]:脚本试图执行方法或访问不完整对象的属性。请确保在调用unserialize()之前加载了您试图操作的对象的类定义“Template”,或者在第44行的/home/twinmeddev/html/Template\u add.php中提供一个uu autoload()函数来加载类定义
我在process_form()函数中得到这个错误。所以我从中得到的是,它认为我没有为模板加载类。事实上,我在榜首就做到了。包括“inc/item.class.php”;我必须在函数中重新包含它吗

下面是带有错误的特定页面的代码。你可以看到我把一切都包括进去了。我哪里出错了

<?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");
}

缺少模板类的序列化/非序列化

看看我在你的另一个问题上给出的答案

例如,您可能希望:

<?php
  $_SESSION['template'] = serialize($template);
?>
虽然这是正确的:

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

现在,我在您的示例中看到它的顺序是正确的,但我也注意到您在包含template.class.php之前还进行了许多其他包含

其中一个include(可能是prep.php或header.class.php)是否也会调用
start\u session()

如果是,这就是您的问题(
session\u start()
在您的template.class.php之前被调用)。

您在会话中放置的对象有多大?有一次,当我的对象大于php.ini文件中为会话分配的空间时,我遇到了类似的错误。如果对象太大,当它不应该是空的时候,它会返回为空

之后,我开始在会话中存储对象的PK,并在需要时查找它,而不是携带整个对象本身

您还可以增加INI文件中会话的大小,看看这是否会产生影响。

请确保您尝试操作的对象的类定义“模板”在加载之前…我猜
包括'inc/Template.class.php'应该加载类模板的定义吗?

那么,可能包含失败了。请改为尝试。
我也尝试将对象存储在会话变量中。是的,我遇到了和爸爸一样的问题。通过将类的include移到第一个来解决它

所以

工作

但不是

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

嗯…想知道什么是理性?如果我们有两个或更多不同的对象呢?当您在php
$中的
session\u start()
时,将使用相应的对象填充session
数组。这意味着所有接口都必须可用(需要)。如果会话之前已由另一个在界面上不可见的脚本(如框架)启动,则
$\u session
中的对象将不完整,再次启动
session\u start()
是无用的,因为会话已启动。一个可能的解决方案是使用方法
session\u write\u close()
,然后
session\u start()
,它再次开始填充
$\u session
,但是可以看到界面,这样你在
$\u session
中的对象就很好了。

我已经在一个页面上发布了我的答案,再次发布它是因为它也回答了这个问题

PHP使用内置的和方法序列化其会话。of PHP能够序列化PHP对象(也称为类实例)并将其转换为字符串。当您输入这些字符串时,它会将它们转换回具有这些值的相同类。具有某些私有属性并希望对其进行编码/解码或在序列化/反序列化过程中执行复杂操作的类实现该类并向该类添加and和方法

当PHP尝试取消序列化一个类对象,但类名没有声明/要求时,它会将其转换为
\uu PHP\u complete\u class
的对象,而不是给出警告或抛出一个


如果您不想将会话对象转换为
\uphp\u complete\u Class
,您可以在调用之前要求类文件,或者注册自动加载函数来实现这一点。

在我的例子中,我包含文件并调用
会话启动()
的顺序不正确,正如卡洛斯在回答中提到的那样

但我无法确定订单

这个变通方法对我很有效:

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

据我所知,如果将对象添加到会话中,PHP会自动序列化该对象,如果要将其分配给变量,则会取消序列化。至少这是我在这里读到的:除此之外,所有涉及我的对象的东西都工作得很好。以我在另一篇文章中给你的示例为例,删除序列化/非序列化将得到以下结果:非序列化$template:object(u PHP_complete_Class)#1(3){…}不要相信我的话,试试我给你的代码作为示例,然后尝试添加un/序列化到你的代码中,看看它是否起作用:)McKyd:在回馈社会的意义上,你应该考虑回到你的问题,给适当的投票,以及标记“被接受的答案”。如果没有你想要的答案,你可以添加你自己的答案来解决你的问题。一针见血,其中一个类调用了session_start()。谢谢你的帮助,谢谢你和我一起完成这件事。你太棒了<代码>要求
包括
在各个方面都是相同的,但它们处理故障的方式不同。它们都会产生警告,但
require
会导致致命错误。session.auto\u start的php.ini文件设置是什么?太棒了。这解决了我使用自己的购物车类(使用$\u会话作为容器)时遇到的问题
<?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();
require_once("class.someclass.php");
require_once("display.php");
require_once("display.php");
require_once("class.someclass.php");
$_SESSION["template"] = unserialize(serialize($_SESSION["template"]))