2009-06-28 4 views
33

エラーが発生しています。修正方法がわからないので、何か助けてもらえないかと思います。不完全なオブジェクトのPHPセッション

これは私がprocess_form()関数の中で、このエラーを取得するエラー

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 

です。だから、私はこれを抜け出すことは、私はテンプレートのクラスをロードしていないと考えていることです。実際に私は一番上に行った。インクルード '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"); 
} 
+0

session.auto_startの設定php.iniファイルとは何ですか? –

答えて

64

テンプレートクラスのserialize/unserializeがありません。

ここをクリックしてworking exampleあなたの別の質問にしました。例えば

、あなたはおそらくしたい、この:

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

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

編集:

がトップに移動についてコメントを読んでは、1つのヒントを提供します。

session_start()を呼び出すと、自動シリアル化/シリアル化解除が行われます。
これは、ファイルを含めてsession_start()と呼ぶ順序が非常に重要であることを意味します。例えば

:これは間違っているだろう

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

これが正しいであろうが:

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

、私はそれが正しい順序であることをあなたの例で見ますしかし、私はあなたもtemplate.class.phpを含める前に他の多くの含まれていることに気付く

それらのうちの1つ(おそらくprep.phpまたはheader.class.php)がstart_session()も呼び出している可能性がありますか?
これが問題でした(session_start()がtemplate.class.phpの前に呼び出されています)。

+4

私が理解しているところでは、PHPはオブジェクトをセッションに追加して変数に代入すると、そのオブジェクトを直列化解除するとオブジェクトを自動的にシリアル化します。少なくともこれは私がここで読んだものです:http://www.devshed.com/c/a/PHP/Working-with-MySQL-and-Sessions-to-Serialize-Objects-in-PHP/1/ 私のオブジェクトに関わるものはすべてこれを除いてうまくいきました。 – MackDaddy

+0

例を取って、もう1つの投稿に書いて、serialize/unserializeを削除すると次のようになります: シリアル化されていない$テンプレート: オブジェクト(__ PHP_Incomplete_Class)#1(3){...} –

+0

それは私が例として与えたコードを試してから、あなたのコードにun/serializeを加えて、それがうまくいくかどうかを調べてみてください:) –

2

セッションに入れているオブジェクトの大きさはどれくらいですか?私のオブジェクトがphp.iniファイルのセッション用に割り当てられたスペースよりも大きかった場合、私は一度同じようなエラーが出ます。オブジェクトが大きすぎる場合は、オブジェクトが存在してはいけないときに空であることに戻ります。

その後、オブジェクト全体を持ち歩くのではなく、セッションの中にオブジェクトのPKを格納して、それを必要とすればそれを探し始めました。

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

2

私は include 'inc/template.class.php';を推測
...あなたが上で動作しようとしているオブジェクトのクラス定義「 テンプレートが」前 にロードされたことを確認してくださいは、クラステンプレートの定義をロードすることになっていますか?
次に、インクルードに失敗した可能性があります。代わりにrequireを試してください。
<?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();

+3

'require'と' include'は、どのように失敗を処理するかを除いてすべての点で同じです。どちらも警告を出しますが、 'require'は致命的なエラーに終わります。 –

1

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

..だから

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

を働いたが...

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

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

9

session_start()のPHP $_SESSIONの配列には、対応するオブジェクトが設定されています。これは、すべてのインターフェイスが利用可能(必須)でなければならないことを意味します。インターフェイスが可視性のない別のスクリプト(フレームワークなど)によってセッションが既に開始されている場合は、$ _SESSIONのオブジェクトが不完全になり、再びセッションが開始されたため、session_start()は役に立たなくなります。考えられる解決策の1つは、方法session_write_close()を使用し、次にsession_start()を使用して、再び$_SESSIONを入力し始めますが、インターフェイスへの可視性があるため、$_SESSIONのオブジェクトが良好になります。

+0

ブリリアント。これは、すでに(セッションを開始していた)Wordpressとの組み合わせで自分のショッピングカートクラス($ _SESSIONをカートのコンテナとして使用する)を使用していた問題を解決しました。ありがとう! – cjs1978

5

similar questionに私の回答を掲示しました。もう一度投稿しました。この回答もあります。

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

PHPのunserializeは、クラスオブジェクトをアンシリアライズしようとしますが、クラス名ではなく、警告を与えるか、Exceptionを投げるの、それは__PHP_Incomplete_Classのオブジェクトに変換し、必要/宣言されていません。

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

0

私の場合、私のファイルを含めて、session_start()と呼ばれる注文は、彼の答えでカルロスが言ったように間違っていました。

しかし、私は注文を修正することができませんでした。

この回避策は、私の仕事:

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