2009-06-28 18 views
33

मुझे एक त्रुटि मिल रही है, मुझे नहीं पता कि मुझे कैसे ठीक करना है, इसलिए मुझे आश्चर्य है कि मुझे कुछ मदद मिल सकती है या नहीं।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() फ़ंक्शन में यह त्रुटि प्राप्त है। तो मैं इससे क्या प्राप्त करता हूं कि, इसकी सोच मैंने टेम्पलेट के लिए कक्षा को लोड नहीं किया है। वास्तव में मैं शीर्ष पर किया था। '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

अपने php.ini फ़ाइल session.auto_start के लिए सेटिंग क्या है? –

उत्तर

64

इसमें आपके टेम्पलेट वर्ग का क्रमबद्ध/अनिश्चितता गुम है।

working example के लिए यहां एक नज़र डालें मैंने आपके एक अन्य प्रश्न पर दिया।

उदाहरण के लिए, आप शायद यह चाहते हैं:

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

और

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

संपादित करें:

शीर्ष पर ले जाने के बारे अपनी टिप्पणी पढ़ने एक संकेत देता है।

स्वचालित serialization/unserialization तब होता है जब आप 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) start_session() भी कॉल करता है?
यदि हां, तो यह आपकी समस्या थी (session_start() को आपके template.class.php से पहले बुलाया जा रहा है)।

+4

जो मैं समझता हूं उससे PHP स्वचालित रूप से किसी ऑब्जेक्ट को क्रमबद्ध करता है यदि आप इसे किसी सत्र में जोड़ते हैं और फिर इसे किसी भी चर को असाइन करना चाहते हैं तो इसे रद्द कर दें। कम से कम यही मैंने यहां पढ़ा है: http://www.devshed.com/c/a/PHP/Working-with-MySQL-and- सत्र-to- Serialize-Objects-in-PHP/1/ मेरी वस्तु से जुड़ी सब कुछ इस बात को छोड़कर अच्छी तरह से काम कर रही थी। – MackDaddy

+0

उदाहरण लेते हुए मैंने आपको दूसरी पोस्ट पर दिया और धारावाहिक/unserialize को हटाने से आपको यह मिल जाएगा: अनसुलझा $ टेम्पलेट: ऑब्जेक्ट (__ PHP_Incomplete_Class) # 1 (3) {...} –

+0

मेरे लिए शब्द न लें यह, उदाहरण के रूप में मैंने आपको दिया गया कोड आज़माएं, फिर अपने कोड में अन/सीरियलाइज जोड़ने का प्रयास करें और देखें कि यह काम करता है :) –

2

सत्र में आप कितनी बड़ी वस्तुएं डाल रहे हैं? मुझे एक बार एक ही त्रुटि मिली जब मेरी ऑब्जेक्ट्स php.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

'आवश्यकता' और 'शामिल 'हर तरह से समान हैं, सिवाय इसके कि वे विफलता को कैसे संभालें। वे दोनों एक चेतावनी उत्पन्न करते हैं, लेकिन एक घातक त्रुटि में 'आवश्यकता' परिणाम होते हैं। –

1

मैंने सत्र चर में ऑब्जेक्ट्स को स्टोर करने का प्रयास किया। और हाँ मैंने मैकडैडी के समान समस्या का अनुभव किया। और कक्षा को शामिल करने के लिए इसे पहले स्थानांतरित करके हल किया गया।

तो ..

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() बेकार है क्योंकि सत्र पहले ही शुरू हो चुका है। एक संभावित समाधान विधि session_write_close() का उपयोग करना है, फिर session_start() जो फिर से शुरू होता है $_SESSION, लेकिन इंटरफ़ेस में दृश्यता के साथ, इसलिए $_SESSION में आपकी ऑब्जेक्ट अच्छी होगी।

+0

शानदार। इसने वर्डप्रेस (जो पहले ही सत्र शुरू कर चुका था) के संयोजन में अपनी खुद की शॉपिंग कार्ट क्लास (जो कार्ट के लिए कंटेनर के रूप में $ _SESSION का उपयोग करता है) का उपयोग करने में एक समस्या हल कर दी थी। धन्यवाद! – cjs1978

5

मैंने अपना उत्तर similar question पर पोस्ट किया है, इसे दोबारा पोस्ट करना 'इसका कारण यह भी है।

PHP अंतर्निहित serialize और unserialize विधियों का उपयोग करके अपने सत्रों को क्रमबद्ध करता है। PHP के serialize में PHP ऑब्जेक्ट्स (उर्फ क्लास इंस्टेंस) को क्रमबद्ध करने और उन्हें स्ट्रिंग में बदलने की क्षमता है। जब आप unserialize उन स्ट्रिंग्स करते हैं, तो यह उन मानों के साथ उन वर्गों को वापस बदल देता है। जिन वर्गों में कुछ निजी गुण हैं और वे अपने क्रमिकरण/deserialization में कुछ जटिल/एन्कोड/डीकोड करना चाहते हैं, Serializable कक्षा को लागू करें और कक्षा में serialize और unserialize विधियां जोड़ें।

PHP के unserialize की कोशिश करता एक वर्ग वस्तु unserialize करने के लिए, लेकिन वर्ग के नाम घोषित नहीं किया गया है/आवश्यक है, बजाय एक चेतावनी दे या एक Exception फेंकने की, यह इसके __PHP_Incomplete_Class की एक वस्तु को बदल देता है।

यदि आप नहीं चाहते हैं कि आपकी सत्र ऑब्जेक्ट __PHP_Incomplete_Class पर परिवर्तित हो जाएं, तो आप इसे session_start, या स्वत: लोड फ़ंक्शन पंजीकृत करने से पहले कक्षा फ़ाइलों की आवश्यकता के जरिए कर सकते हैं।

0

मेरे मामले में, जिस क्रम में मैंने अपनी फाइलें शामिल की थीं और session_start() नामक गलत था, जैसा कि कार्लोस ने अपने उत्तर में उल्लेख किया था।

लेकिन मैं आदेश को ठीक नहीं कर सका।

इस तरीके को मेरे लिए काम किया:

$_SESSION["template"] = unserialize(serialize($_SESSION["template"])) 
संबंधित मुद्दे