带有不完整对象的PHP会话

Mac*_*ddy 36 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 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
Run Code Online (Sandbox Code Playgroud)

我在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");
}
Run Code Online (Sandbox Code Playgroud)

Car*_*ima 68

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

看一看我在你的另一个问题上给出的一个工作实例.

例如,您可能想要这样:

<?php
  $_SESSION['template'] = serialize($template);
?>
Run Code Online (Sandbox Code Playgroud)

<?php
  $template = unserialize($_SESSION['template']);
?>
Run Code Online (Sandbox Code Playgroud)

编辑:

阅读你关于将它移到顶部的评论给出了一个提示.

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

例如:

这是错误的:

<?php
session_start();
include 'inc/template.class.php';
?>
Run Code Online (Sandbox Code Playgroud)

虽然这是正确的:

<?php
include 'inc/template.class.php';
session_start();
?>
Run Code Online (Sandbox Code Playgroud)

现在,我在你的例子中看到它是在CORRECT顺序中,但我也注意到你在包括template.class.php之前做了很多其他包含

是否有可能其中一个包括(也许prep.php或header.class.php)start_session()也会调用?
如果是,那就是你的问题(session_start()在你的template.class.php之前调用).

  • 根据我的理解,如果将对象添加到会话中,PHP会自动序列化对象,如果要将其分配给变量,则将其反序列化.至少这是我在这里读到的:http://www.devshed.com/c/a/PHP/Working-with-MySQL-and-Sessions-to-Serialize-Objects-in-PHP/1/所涉及的一切除了这个,我的对象工作得很好. (4认同)

小智 9

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


Ste*_*ain 5

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

PHP使用内置serializeunserialize方法序列化其会话.serializePHP能够序列化PHP对象(也就是类实例)并将它们转换为字符串.当你使用unserialize这些字符串时,它会将这些字符串转换回那些相同的类.具有一些私有属性并希望对其进行编码/解码或在序列化/反序列化中执行复杂操作的Serializable类实现类,并向类添加serializeunserialize方法.

当PHP unserialize尝试反序列化一个类对象,但没有声明/要求类名时,它不会发出警告或抛出一个Exception,而是将其转换为一个对象__PHP_Incomplete_Class.

如果您不希望将会话对象转换为__PHP_Incomplete_Class,则可以通过在调用之前要求类文件session_start或通过注册自动加载功能来执行此操作.