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 "Template" 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之前调用).
小智 9
当你session_start()
在php $_SESSION
数组中填充相应的对象.这意味着所有接口必须可用(需要).如果会话已经由另一个在接口上没有可见性的脚本(例如框架)启动,那么对象$ _SESSION
将是不完整的,并且再次执行它session_start()
是无用的,因为会话已经启动.一种可能的解决方案是使用该方法session_write_close()
,然后session_start()
再次开始填充$_SESSION
,但具有对界面的可见性,因此您的对象$_SESSION
将是好的.
我已经在一个类似的问题上发布了我的答案,再次发布它,因为它也回答了这个问题.
PHP使用内置serialize
和unserialize
方法序列化其会话.serialize
PHP能够序列化PHP对象(也就是类实例)并将它们转换为字符串.当你使用unserialize
这些字符串时,它会将这些字符串转换回那些相同的类.具有一些私有属性并希望对其进行编码/解码或在序列化/反序列化中执行复杂操作的Serializable
类实现类,并向类添加serialize
和unserialize
方法.
当PHP unserialize
尝试反序列化一个类对象,但没有声明/要求类名时,它不会发出警告或抛出一个Exception
,而是将其转换为一个对象__PHP_Incomplete_Class
.
如果您不希望将会话对象转换为__PHP_Incomplete_Class
,则可以通过在调用之前要求类文件session_start
或通过注册自动加载功能来执行此操作.