具有不完整对象的 PHP 会话编辑:

2022-08-30 13:02:47

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

这是错误

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()函数中收到此错误。所以我从中得到的是,它认为我没有为模板加载类。事实上,我在顶部做到了。包括“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");
}

答案 1

它缺少模板类的序列化/反序列化。

看看这里,看看我在你的另一个问题上给出的一个工作例子

例如,您可能想要这个:

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

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

编辑:

阅读有关将其移动到顶部的评论会给出一个提示。

自动序列化/反序列化在调用 时发生。
这意味着您包含文件并调用的顺序非常重要。session_start()session_start()

例如:

这是错误的:

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

虽然这是正确的:

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

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

其中一个包含(也许是 prep.php 或 header.class.php)是否也调用了?
如果是,那是你的问题(在你的模板之前被调用.class.php)。start_session()session_start()


答案 2

当你在php数组中填充了相应的对象。这意味着所有接口都必须可用(必需)。如果会话之前已经由另一个在接口上没有可见性的脚本(例如框架)启动,则 中的对象将不完整,并且再次执行此操作是无用的,因为会话已经启动。一种可能的解决方案是使用该方法,然后再次开始填充,但具有对界面的可见性,因此您的对象将很好。session_start()$_SESSION$ _SESSIONsession_start()session_write_close()session_start()$_SESSION$_SESSION


推荐