Вызов функции-члена find() для не-объекта

Я продолжаю получать эту ошибку из своего кода, и я понятия не имею, что я делаю неправильно, это происходит иногда, и, кажется, работает, когда хочет.

ошибка

 Call to a member function find() on a non-object in C:\xampp\htdocs\sites\P\Find.php on line 265

По сути, я создал сканер, который ищет на веб-странице элемент на веб-странице, иногда этот элемент может отсутствовать на странице, и я проверяю это с помощью оператора if.

строка 265 относится к

if($page->find('div#olpDivId span.price'))

код

   $page = file_get_html('http://www.amazon.co.uk/dp/0304362212');

   if($page->find('div#olpDivId span.price')){
        foreach($page->find('div#olpDivId span.price') as $p){
            $i[] = floatval($p->plaintext);                 
        }
    }

если книга не существует, поисковый робот переходит на пустую страницу «извините, продукт не существует». Я делаю что-то не так? любая помощь будет оценена


person mk_89    schedule 09.05.2012    source источник
comment
покажите нам, как вы устанавливаете значение $page.   -  person phihag    schedule 09.05.2012
comment
Если вы забыли инициализировать $page как объект, это объяснило бы проблему.   -  person dpk2442    schedule 09.05.2012
comment
Я не думаю, что это проблема с $page   -  person mk_89    schedule 09.05.2012
comment
Да, это проблема с $page. Что, если ваш http-запрос завершится ошибкой, как вы думаете, что тогда будет установлено для $page?   -  person Madbreaks    schedule 09.05.2012


Ответы (1)


file_get_html может возвращать значение false (если не удалось получить содержимое с веб-страницы), поэтому вам следует проверить это, прежде чем использовать какой-либо метод на $page

$page = file_get_html('http://www.amazon.co.uk/dp/0304362212');

if($page !== FALSE){
    foreach($page->find('div#olpDivId span.price') as $p){
        $i[] = floatval($p->plaintext);                 
    }
 }
person dev-null-dweller    schedule 09.05.2012
comment
Я должен был принять это во внимание, если это не сработает, как вы думаете, было бы хорошей идеей отозвать метод? - person mk_89; 09.05.2012
comment
это зависит от того, что послужило причиной сбоя. Если ваш бот был забанен из-за чрезмерного сканирования, повторение не сработает, а может только усугубить ситуацию. Но, с другой стороны, это может быть временная проблема с сервером/сетью, и второй запрос может быть успешным. Вы можете попробовать получить содержимое страницы с помощью curl и проверить заголовки ответа, чтобы получить более точную информацию о неудачном запросе. - person dev-null-dweller; 09.05.2012