2009-03-02 8 views
5

के रूप में क्यों संग्रहीत नहीं कर सकता हूं मेरे पास एक PHP स्क्रिप्ट है जिसे दोजो अजाक्स xhrGet कॉल से 2 तरीकों से बुलाया जाता है। पहली बार इसे "init" तर्क के साथ बुलाया जाता है जो स्क्रिप्ट को स्टेटलिस्ट वर्ग का उदाहरण बनाने और राज्य के नामों की एक फ़ाइल में पढ़ने का कारण बनता है।मैं एक PHP क्लास उदाहरण को SESSION चर

session_start(); 
@include('StateList.php'); 
require_once('phplog.php'); 

//start executing here 
$comd=$_GET['nexturl']; 
if($comd=="init") { 
$st = new StateList("../data/statestxt.txt"); 
$_SESSION['statefile'] = $st; 
} 

दूसरे और आगे बार, एक और xhrGet कॉल एक "getstate" तर्क से गुजरता है और निम्नलिखित कोड सत्र सरणी से StateList वर्ग ofr उदाहरण पाने के लिए कोशिश करता है।

if($comd =="getstate") { 
$st= $_SESSION['statefile']; 
phplog("size=".$st->getSize()); 

}

हालांकि, getSize() विधि मार डाला कभी नहीं है, न ही मैं पुनर्गठित StateList वर्ग उदाहरण पर किसी भी अन्य विधि कॉल कर सकते हैं।

ध्यान दें कि यह एक PHP स्क्रिप्ट है जिसमें शीर्ष पर कक्षा परिभाषा शामिल है और इस प्रकार कक्षा विधियों को ज्ञात और अव्यवस्थित होना चाहिए।

मुझे यहां क्या याद आ रही है?

+0

कोशिश का उपयोग कर से बचने के लिए @; बस अपना कोड सही तरीके से लिखें ताकि दबाने में कोई त्रुटि न हो। –

उत्तर

1

आपको स्टोर करने से पहले आपको $$ st ऑब्जेक्ट/चर की आवश्यकता हो सकती है। यह सुनिश्चित करेगा कि सब कुछ सत्र में सहेजा गया है। यह निश्चित रूप से object oriented कोड के लिए जाने का तरीका है। जब आप डेटा का फिर से उपयोग करना चाहते हैं, तो आपको unserialize यह होना चाहिए।

+6

सत्र चर स्वचालित रूप से serialized और unserialized हैं। – outis

14

आपको session_start() पर कॉल करने से पहले कक्षा परिभाषा को शामिल करने की आवश्यकता है, अन्यथा ऑब्जेक्ट को सही ढंग से deserialized नहीं किया जाएगा और __PHP_Incomplete_Class का उदाहरण होगा। अन्यथा आपको क्या ठीक काम करना चाहिए।

+1

अगर मैं परिभाषा को स्थानांतरित आप का सुझाव के रूप में, सत्र सरणी से दिए गए मान रिक्त है। –

+0

क्या आपके पास display_errors हैं और त्रुटि__पोर्टिंग E_ALL? क्या आप सुनिश्चित कर सकते हैं कि पहली बिट वास्तव में चल रही है ($ comd == "init")? –

0

यदि आप सत्र में किसी ऑब्जेक्ट को स्टोर करने जा रहे हैं तो यह link text होना चाहिए। PHP में क्रमबद्ध वस्तुओं के साथ बहुत सी समस्याएं हैं, उन्हें सत्र में अकेले स्टोर करने दें। मैं इसे पूरी तरह से करने और आपकी समस्या के लिए एक अलग समाधान खोजने के खिलाफ अनुशंसा करता हूं। यदि आप इसे करने जा रहे हैं, तो आपको 'जादू विधियों' link text पर ध्यान देना चाहिए, जिसे आपको कक्षा में बुलाया जाना चाहिए ताकि इसे सत्र से बुलाया जा सके।

0

क्या आपके पास session.auto_start सक्षम है? मैनुअल के सत्र पेज कहा गया है कि यदि आप करते हैं, आप वर्ग परिभाषा अलग ढंग से लोड करने के लिए है:

तो आप तो अपने सत्रों में है वस्तुओं डाल करने के लिए अपने auto_prepend_file वर्ग परिभाषा का उपयोग लोड करने के लिए एक ही रास्ता session.auto_start पर बारी जिसमें आप कक्षा परिभाषा को लोड करते हैं, आपको अपने ऑब्जेक्ट को क्रमबद्ध करना होगा और बाद में इसे रद्द करना होगा।

http://php.net/manual/en/intro.session.php

कि पेज का कहना है के रूप में, क्रमबद्धता/वस्तु के unserialization सामान्य रूप से PHP द्वारा स्वचालित रूप से किया जाएगा, लेकिन session.auto_start होने इस बदल जाएगा सक्षम होना चाहिए।

+0

नहीं, यह सक्षम नहीं है। –

1

यह उन चीजों में से एक है जो अलगाव में डीबग करना मुश्किल है। PHP सत्रों में तत्काल वस्तुओं को संग्रहीत करना हमेशा थोड़ा मुश्किल होता है, और 100% काम करने की गारंटी नहीं देता है। यहां कुछ सामान्य डीबगिंग युक्तियां दी गई हैं जो इसे समझने में आपकी सहायता कर सकती हैं।

सबसे पहले, अपने अपाचे त्रुटि लॉग की जांच करें। क्या आपको "ऑब्जेक्ट त्रुटि पर बुलाया जाने वाला तरीका" मिल रहा है?यदि ऐसा है, तो इसका मतलब है कि आपको सत्र से वापस ऑब्जेक्ट नहीं मिल रहा है। यदि नहीं, तो क्या कोई त्रुटि है जो इंगित करती है कि आपकी विधि कॉल किसी अन्य कारण से विफल हो रही है?

दूसरा, यह देखने के लिए कि क्या तुम सच में अपने सत्र से बाहर हो रही है की जाँच करें।

if($comd =="getstate") { 
    $st= $_SESSION['statefile']; 
    //get the class of st 
    phplog("instance=".get_class($st)); 

    //get a reflection dump of st 
    $ref = new ReflectionClass($st); 
    $string = $ref->__toString();  
    phplog("reflection=".$string); 
} 

तीसरा, धारावाहिक स्ट्रिंग मान उस सत्र में ही संग्रहीत किया जा रहा है देखो। क्या आप वास्तव में एक धारावाहिक वस्तु भंडारण कर रहे हैं? अपने देव वातावरण में,, की तरह/tmp कुछ करने के लिए php.ini में session.save_path आरं मान सेट (या एक ही बात करने के लिए ini_set विधि का उपयोग करें):

session.save_path = "/tmp" 

और उसके बाद की जांच में बनाई गई फ़ाइलों/टीएमपी (या जो भी फ़ोल्डर)। गुण को बचाया

statefile:O:.......... 

वर्ग है कि वस्तु instantiated का नाम भी वहाँ में शामिल किया जाएगा, साथ ही मूल्यों: आप एक स्ट्रिंग शुरू होता है उस के साथ देखना चाहिए।

0

इस प्रयास करें:

include('StateList.php'); 
    require_once('phplog.php'); 
    // start your session after including your class file 
    session_start(); 

    //start executing here 
    $comd=$_GET['nexturl']; 
    if($comd=="init") { 
    $st = new StateList("../data/statestxt.txt"); 
    $_SESSION['statefile'] = $st; 
    } 

    if($comd =="getstate") { 
    // the ampersand creates a reference, preserving any further changes to your session data 
    $st = &$_SESSION['statefile']; 
    phplog("size=".$st->getSize()); 
    } 
+0

दिलचस्प कोड। मुझे लगता है कि मैं इसे आज़मा सकता हूं। – transilvlad