2013-02-21 3 views
0

Я использую ScraperWiki для создания простого скребка экрана, получающего ссылки из интернет-магазина. В магазине есть несколько страниц, поэтому я хочу получить все ссылки с первой страницы, найти «следующую» кнопку в пейджере, перейти к этому URL-адресу, найти все ссылки оттуда, перейти на следующую страницу и так далее, так далее.Переменные PHP в функции скребка

Вот, где я нахожусь. ScraperWiki использует простой HTML DOM и CSS селекторы:

<?php 
require 'scraperwiki/simple_html_dom.php'; 

function nextPage(){ 
    $next = $html->find("li.pager-next a"); 
    $nextUrl = 'http://www.domain.com'; 
    $nextUrl .= $next->href . "\n"; 
    getLinks($nextUrl); 
} 

function getLinks($url){ // gets links from product list page 

    $html_content = scraperwiki::scrape($url); 
    $html = str_get_html($html_content); 

    $x = 0; 

    foreach ($html->find("div.views-row a.imagecache-product_list") as $el) { 
     $url = $el->href . "\n"; 
     $allLinks[$x] = 'http://www.domain.com'; 
     $allLinks[$x] .= $url; 
     $x++; 
    } 

    nextPage(); 
} 

getLinks("http://www.domain.com/foo/bar"); 


print_r($allLinks); 

?> 

getLinks() функция отлично работает, когда НЕ в функции, но я получаю ошибки «необъявленные переменные», когда я положил их в функции. Мой вопрос:

В PHP я могу объявить пустые переменные/массивы для использования во всем скрипте, например, в Javascript? Я прочитал несколько ответов здесь, в Stack, который, по-видимому, подразумевает, что нет необходимости объявлять, что кажется странным.

+0

Переменный объем все еще существует. Используйте либо параметры, либо приглашайте переменные «global» в каждую функцию. – mario

+0

Возможный дубликат [Неопределенная ошибка переменной при вызове функции из другого фрагмента] (http://stackoverflow.com/questions/14301958/undefined-variable-error-when-calling-a-function-from-another-snippet) – mario

+0

@mario Приветствия за это, не смогли найти хорошую ссылку. Здесь проблема заключается в том, что до того, как функция называется, переменные не имеют значения, поэтому я не могу их объявить. Каков наилучший способ передать их в приведенном выше примере? – Jascination

ответ

1

Если вы показали всю ошибку, что, вероятно, будет что-то вроде

Неопределенная переменная: $ getLinks

Вероятно потому, что вы имели в виду был такой: getLinks($nextUrl);

Не это : $getLinks($nextUrl);

Он отлично работает за пределами функции nextPage, потому что вы правильно его вызываете.

+0

Нет, я получаю: 'PHP Примечание: неопределенная переменная: allLinks в /home/scriptrunner/script.php в строке 33', когда я пытаюсь' print_r ($ allLinks); 'в конце скрипта. – Jascination

+0

Это означает, что $ allLinks не определено. Определите его как пустой массив. Если этот цикл 'for' никогда не запускается, то $ allLinks никогда не будет определяться. –

+0

использовать '$ allLinks = array();' сразу после включения, и я думаю, что вы будете установлены. Ваш скребок ничего не возвращает. –

0
class ScraperWiki{ 
    public $variable; 
    protected $variable; 
    private $variable; 

    // here you have the option of choosing how your functions and variables are treated... 


    private function getLinks(){...} 



    public function someOtherFunction(){ 
      $this->getLinks(); //will call the function in this Class 
    } 
} 

Плюс у вас есть синтаксис Ошибка $ getLinks ($ nextUrl); должен быть getLinks ($ nextUrl)

+0

Он строит это процедурно, он не собирался превращать его в класс. –

+0

просто лучшая практика, я думаю ... – Drmjo

+0

Строительство класса - это не всегда лучшая практика. Если вам не нужны функции ООП, вы добавляете накладные расходы без всякой причины. –

0

Нашел решение самостоятельно с некоторой помощью из других ответов - пришлось объявить $ allLinks в начале скрипта вне любых функций. В Javascript, что бы достаточно, чтобы сделать его глобальным, но в PHP это выглядит, как вы должны также объявить как глобальные ВНУТРИ функции, например:

$allLinks = array(); 

function foo(){ 
    global $allLinks 
    ...//stuff 
} 

Это, наконец, получил мой код работает.

Смежные вопросы