web-dev-qa-db-ja.com

PHP不完全なオブジェクトとのセッション

修正方法がわからないというエラーが表示されるので、助けが得られるかどうか疑問に思います。

これはエラーです

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()関数でこのエラーが発生します。そのため、私が得たのは、テンプレートのクラスをロードしなかったという考え方です。実際に私はトップでやった。 include '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");
}
36
MackDaddy

テンプレートクラスのシリアル化/非シリアル化がありません。

実際の例 についてはこちらをご覧ください。別の質問をしました。

たとえば、おそらくこれが必要です:

_<?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();
?>
_

さて、あなたの例では正しい順序であることがわかりましたが、template.class.phpをインクルードする前に他の多くのインクルードを行っていることにも気付きました。

それらのインクルード(おそらくprep.phpまたはheader.class.php)の1つがstart_session()を呼び出すことも可能でしょうか?
はいの場合、それが問題でした(session_start()がtemplate.class.phpの前に呼び出されています)。

68
Carlos Lima

同様の質問に回答を投稿しました .

PHPは、組み込みの serialize および unserialize メソッドを使用してセッションをシリアル化します。 serialize of PHPには、シリアル化する機能がありますPHPオブジェクト(別名クラスインスタンス)とそれらを文字列に変換します。 unserialize それらの文字列を変換すると、それらの文字列はそれらの値を持つ同じクラスに変換されます。プライベートプロパティを持ち、それをエンコード/デコードしたり、シリアライゼーションで複雑なことをしたい/ deserializationは Serializable クラスを実装し、 serialize および unserialize メソッドを追加しますクラス。

PHPの unserialize がクラスオブジェクトを非シリアル化しようとするが、警告を与えるか Exception 、それを___PHP_Incomplete_Class_のオブジェクトに変換します。

セッションオブジェクトを___PHP_Incomplete_Class_に変換したくない場合は、 _session_start_ を呼び出す前にクラスファイルを要求するか、または自動ロード機能を登録します。

5
Steel Brain

セッションに入れるオブジェクトの大きさはどれくらいですか?オブジェクトがphp.iniファイルでセッションに割り当てたスペースよりも大きいときに、同様のエラーが発生しました。オブジェクトが大きすぎる場合は、本来あるべきではないときに空として戻ってきます。

その後、オブジェクトのPKをSessionに保存し始め、オブジェクト全体を持ち歩く代わりに、必要に応じて検索し始めました。

INIファイルでセッションのサイズを増やし、それが違いをもたらすかどうかを確認することもできます。

2
AndyMcKenna

セッション変数にもオブジェクトを保存しようとしました。はい、私はMackDaddyと同じ問題を経験しました。そして、クラスのインクルードを最初のインクルードに移動することで解決しました。

そう..

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

働いた

だがしかし...

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

うーん...理性は何だろう?そして、2つ以上の異なるオブジェクトがある場合はどうなりますか?どちらが最初に来ますか?

1
resting

私の場合、Carlosが答えで述べたように、ファイルをインクルードしてsession_start()を呼び出す順序は間違っていました。

しかし、順序を修正できませんでした。

この回避策は私のために働いた:

$_SESSION["template"] = unserialize(serialize($_SESSION["template"]))
0
Savenkov Alexey