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

什麼是這個錯誤,我似乎無法解決問題。它正在產生每個錯誤500面臨的大BIG日誌。大小爲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文件進行處理和相同的問題。

有什麼想法?我在主頁上使用帶有多個函數的jQuery Ajax $.ajax({
我是新來的Ajax,在一個頁面中有多個Ajax是正確的嗎?

+0

可以粘貼在'simple_html_dom.php' – user20232359723568423357842364

+0

它太大了上傳代碼,它將垃圾郵件的問題空間。無論如何,這是在sourceforge簡單的HTML解析器的默認文件 – 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屬性。我不太清楚這是如何工作的(API方面是,我們應該說,稀疏的),但我的猜測是以下幾點:

return $title[0]->plaintext; 

不過,這只是一個猜測。

+0

嗨, - >明文確實刪除錯誤,我想我知道你的意思。謝謝 – CodeGuru

+0

讓我繼續閱讀它來嘗試理解它:x謝謝你這麼寂寞。謝謝。 – CodeGuru

+0

很高興有幫助。 – lonesomeday

1

簡單的例子來重新創建問題

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

json_encode($o); 

一旦json_encode()遇到$鄰>改編[0] == $·其必須與$Ø重新開始,達到$鄰> arr [0],再次從$ o開始,等等。爲了防止這種情況,函數「記住」它已經處理的每個節點。如果它再次「看到」同一個節點,它會拋出遞歸警告。
您從函數返回的simple_html_dom對象可能會引用父對象或類似的東西,導致遞歸。
因此,也許return (string)$title[0];return (string)$rmb[0];將解決這個問題。

1

你想完成什麼,使用POST方法發送HTML源代碼。然後解析它在服務器端有點過分殺死。

<?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

嗨,是的,Ajax和是使用POST。寂寞天有一個很好的解釋,如上所述。固定。感謝您的幫助。儘管如此,歡迎來到STACKOVERFLOW! – 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;