2013-06-21 10 views
10
Warning: json_encode(): recursion detected in [Directory] 

यह त्रुटि क्या है, मैं इस समस्या को हल नहीं कर सकता। यह प्रति 500 ​​500 प्रति त्रुटि का एक बड़ा बड़ा लॉग उत्पन्न कर रहा है। आकार में 133,000,000 बाइट्स। यह मेमोरी अधिकतम तक लॉग को स्पैमिंग कर रहा है।json_encode रिकर्सन त्रुटि दे रहा है

<?php 
include('simple_html_dom.php'); 

if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ 
retrievemore($_REQUEST['htmlsource']); 
} 

function retrievemore($htmlcode){ 
$retrievetitle = retrievechTitle($htmlcode); 
$retrievermb = retrievechRMB($htmlcode); 
echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); 
} 
function retrievechTitle($htmlcode){ 
$html = str_get_html($htmlcode); 
$title = $html->find('div[class=tb-detail-hd]h3'); 
return $title[0]; 
} 
function retrievechRMB($htmlcode){ 
$html = str_get_html($htmlcode); 
$rmb = $html->find('[class=tb-rmb-num]'); 
return $rmb[0]; 
} 

?> 

मैं एक HTML फ़ाइल से डेटा निकालने का प्रयास कर रहा हूं, अन्य निष्कर्षण उपरोक्त को छोड़कर ठीक काम करता है, बहुत सारी समस्याएं देता है। मैंने प्रसंस्करण और एक ही मुद्दे के लिए कोड के इस सेट को विशेष रूप से एक PHP फ़ाइल में भी विभाजित किया।

कोई विचार? मैं $.ajax({
के साथ होम पेज पर एकाधिक कार्यों के साथ jQuery अजाक्स का उपयोग करता हूं, मैं अजाक्स के लिए नया हूं, ठीक है एक पेज में कई अजाक्स सही है?

+0

आप 'simple_html_dom.php' – user20232359723568423357842364

+0

यह अपलोड करने के लिए बहुत बड़ा है में कोड पेस्ट कर सकते हैं, यह सवाल अंतरिक्ष स्पैम होगा। वैसे भी यह Sourceforge – CodeGuru

उत्तर

9

समस्या स्पष्ट रूप से निहित है आपके कुछ इसके लिए अनुकूल नहीं पर json_encode फोन करने के प्रयास में:

echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); 

हम क्या, पूछ सकते हैं, $retrievetitle है? यह किस तरह का मूल्य है? खैर, हम इसे फ़ंक्शन परिभाषा में पाते हैं:

$html = str_get_html($htmlcode); 
$title = $html->find('div[class=tb-detail-hd]h3'); 
return $title[0]; 

तो स्पष्ट रूप से यह किसी प्रकार का ऑब्जेक्ट है। मैं simple_html_dom लाइब्रेरी से परिचित नहीं हूं, लेकिन संभवतः यह एक ऑब्जेक्ट है जो उस लाइब्रेरी से संबंधित है और एक HTML तत्व का प्रतिनिधित्व करता है। शायद यह एक देशी DOMElement वस्तु है; मुझे नहीं पता।

हालांकि, यह स्पष्ट है कि यह किसी प्रकार की पुनरावर्ती संरचना है। यह कहना है, कुछ अर्थों में यह स्वयं ही शामिल है। यह PHP में पूरी तरह से संभव है, लेकिन JSON स्ट्रिंग में प्रतिनिधित्व करना असंभव है। उदाहरण के लिए, PHP में के लिए:

class Foo { 
    public $self; 

    public function __construct() { 
     $this->self = $this; 
    } 
} 
$foo = new Foo; 

$foo->self$foo रूप में एक ही वस्तु है। वास्तव में, आप $foo->self->self->self कर सकते हैं और यह ठीक काम करेगा। यह एक बहुत ही सरल पुनरावर्ती संरचना है। आपका शायद थोड़ा अधिक जटिल है, लेकिन सिद्धांत में भिन्न नहीं है। यह JSON में प्रदर्शित नहीं किया जा सकता है। json_encode जब यह रिकर्सन का सामना करता है तो त्रुटि होगी।

मुझे लगता है कि आप शायद शीर्षक तत्व की बजाय शीर्षक की टेक्स्ट सामग्री को स्टोर करना चाहते थे। संक्षेप में API documentation for the library पढ़ना, ऐसा लगता है कि आप plaintext संपत्ति चाहते हैं। मैं काफी यकीन है कि यह कैसे काम करता नहीं हूँ (एपीआई है, तो हम कहते हैं, करेगा विरल), लेकिन मेरा अनुमान है निम्न होगा:

return $title[0]->plaintext; 

लेकिन वह केवल एक शिक्षित अनुमान है।

+0

पर सरल HTML पार्सर की डिफ़ॉल्ट फ़ाइल है, -> सादा पाठ त्रुटि को हटा देता है, मुझे लगता है कि मुझे पता है कि आपका क्या मतलब है। धन्यवाद – CodeGuru

+0

मुझे इसे समझने के लिए इसे पढ़ना जारी रखें: x आपको बहुत अधिक धन्यवाद। धन्यवाद। – CodeGuru

+0

मदद करने में खुशी से ज्यादा। – lonesomeday

1

सरल उदाहरण समस्या

<?php 
$o = new StdClass; 
$o->arr = array(); 
$o->arr[] = $o; 

json_encode($o); 
एक बार json_encode

() का सामना करना पड़ता $ O-> आगमन [0] == $ ओ यह $ ओ के साथ फिर से शुरू करने के लिए होगा फिर से बनाने के लिए, $ O- तक पहुँचने > एआर [0], $ inf के साथ फिर से शुरू करें और विज्ञापन infinitum पर। इसे रोकने के लिए, फ़ंक्शन प्रत्येक नोड को "याद करता है" जो पहले ही संसाधित हो गया है। यदि यह एक ही नोड को "देखता है" तो यह रिकर्सन चेतावनी फेंकता है।
सरल_html_dom ऑब्जेक्ट्स जो आप अपने कार्यों से वापस लौटते हैं, शायद उनके माता-पिता की ऑब्जेक्ट्स या उस तरह की कुछ चीज़ों का संदर्भ है, जिससे रिकर्सन होता है।
तो, शायदreturn (string)$title[0]; और return (string)$rmb[0]; समस्या को ठीक करेगा।

1

HTML स्रोत भेजने के लिए POST विधि का उपयोग करके आप क्या करने की कोशिश कर रहे हैं। फिर सर्वर की तरफ इसे पार्स करना थोड़ा अधिक मारना है।

<?php 
include('simple_html_dom.php'); 

if(isset($_REQUEST['type']) && $_REQUEST['type'] = "getmoredetails"){ 
    >> echo $_REQUEST['htmlsource']; 
    >> return; 
    retrievemore($_REQUEST['htmlsource']); 
} 

function retrievemore($htmlcode){ 
    $retrievetitle = retrievechTitle($htmlcode); 
    $retrievermb = retrievechRMB($htmlcode); 
    >> gettype($retrievetitle) . ' – ' . gettype($retrievermb); 
    >> return; 
    echo json_encode(array("error"=>0,"rmb"=>$retrievermb,"title"=>$retrievetitle)); 
} 

function retrievechTitle($htmlcode){ 
    $html = str_get_html($htmlcode); 
    $title = $html->find('div[class=tb-detail-hd]h3'); 
    return $title[0]; 
} 
function retrievechRMB($htmlcode){ 
    $html = str_get_html($htmlcode); 
    $rmb = $html->find('[class=tb-rmb-num]'); 
    return $rmb[0]; 
} 

?> 

आपका AJAX कॉल कैसा दिखता है? क्या आपने टाइप पैरामीटर को "POST" पर सेट किया था?

$.ajax({ 
    type: "POST", 
    url: "/echo/json/", 
    data: { name: "John", location: "Boston" } 
}).done(function(json) 
    console.log(json); 
}); 

भी आपको केवल json_encode() फ़ंक्शन को कॉल करने का प्रयास करना चाहिए। देखें कि क्या आपको कोई त्रुटि मिलती है या नहीं।

echo json_encode(array("error"=>0,"rmb"=>"rmb","title"=>"title")); 
+0

पोस्ट का उपयोग कर हाय, हां, अजाक्स, और हां। लोन्सोमेडे के ऊपर के रूप में एक महान स्पष्टीकरण था। ठीक कर। मदद के लिए शुक्रिया। फिर भी, स्टैक ओवरफ्लो में आपका स्वागत है! – CodeGuru

1

कभी-कभी simple_html_dom.php अपेक्षा के अनुसार स्ट्रिंग करने के लिए नहीं डाला जाएगा। मैं कलाकारों स्ट्रिंग वाक्य रचना से समस्या हल हो गया है:

$HTML_DOM = new simple_html_dom(); 
$HTML_DOM->load($HTML_Template,true,false); // Preserve line breaks 
$Content_Box_Data = $HTML_DOM->find('div.Content_Box_Data',0); // find() 
$Content_Box_Data->innertext = "Some Content"; 
$HTML_Template = (string)$HTML_DOM;  
संबंधित मुद्दे