Warning: json_encode(): recursion detected in [Directory]
Что это за ошибка, я не могу решить эту проблему. Он генерирует BIG BIG log за ошибку 500. 133 000 000 байт. Это рассылка журнала до максимальной памяти.
<?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]; } ?>
в<?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 на одной странице?
Проблема заключается в том, что вы пытаетесь вызвать 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 для библиотеки , кажется, вам нужно свойство plaintext
. Я не совсем уверен, как это работает (APi, скажем так, разрежен), но я предполагал следующее:
return $title[0]->plaintext;
Но это всего лишь образованная догадка.
Простой пример для воссоздания проблемы
<?php $o = new StdClass; $o->arr = array(); $o->arr[] = $o; json_encode($o);
Как только json_encode () встретит $ o-> arr [0] == $ o, он должен начать снова с $ o, достигнуть $ o-> arr [0], начать снова с $ o и т. Д. До бесконечности. Чтобы предотвратить это, функция «запоминает» каждый обработанный узел. Если он «видит» тот же узел снова, он выдает предупреждение о рекурсии.
Объекты simple_html_dom, которые вы возвращаете из своих функций, вероятно, ссылаются на их родительские объекты или что-то в этом роде, вызывая рекурсию.
Итак, возможно, return (string)$title[0];
и return (string)$rmb[0];
устранит проблему.
Что вы пытаетесь выполнить, используя метод 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]; } ?>
в<?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"));
Иногда 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;