вопрос по php

12
AB
На сайте с 29.03.2010
Offline
27
#11

Вот что получилось:

Notice: Undefined variable

И вместо нужного контента выдает страницы (echo $url)

http://megasite.ru/index1.phphttp://megasite.ru/index2.phphttp://megasite.ru/index3.phphttp://megasite.ru/index4.php

sashka_
На сайте с 27.01.2010
Offline
103
#12

ну так правильно , а что надо ? если получать эти страницы то прикручивай функцию file или анологичные

Знаю PHP, JS, jQuery. Помощь для вашего сайта. (/ru/forum/840509).
L
На сайте с 07.12.2007
Offline
351
#13
Above&Beyond:
Спасибо, однако в таком случае "Notice: Undefined variable:"

Ё, просто проинициируйте переменную в заголовке цикла:

for($i = 1, $url=''; $i <= $num; $i++)

И что Вам надо - получить список URL-ов страниц, или содержимое страниц по этим URL? Если содержимое - иcпользуйте функцию file_get_contents (если хостер её не отключил):

for($i = 0; $i < 100; $i++){ 

if $i == 0
$url = "http://megasite.ru/index.php";
else
$url = "http://megasite.ru/index".$i.".php";
$buff = file_get_contents($url);
echo $buff;
}
Только время выполнения PHP-скрипта 30 сек (по default), он может не успеть выгрести все 100 страниц. Надо сложить url в базу данных и в ней помечать полученные страницы, чтобы при рестарте скрипта продолжать, а не начинать с начала.
AB
На сайте с 29.03.2010
Offline
27
#14

Спасибол за советы, file_get_contents забанен, поэтому я сделал через cURL. Тело скрипта приведено ниже.

Задумка следующая: существует таблица, не важно с погодой или с описаниями товаров, либо с чем-то бругим.

Мой скрипт отдавал в браузер содержимое таблицы на опеределенной странице. Однако продолжение этой таблицы находится на других страницах. Так вот то что я сдела, отдает только содержание определенной странцы. То, что Вы мне посоветовали - отдает содержимое последней страницы. А нужно, как Вы уже догадались, чтобы отдавало результаты сразу всех таблиц со всех страниц. Вот на этом участке у меня и возникла проблема. Буду очень благодарен содействию.

<?php


$num = 10;

for($i = 1, $url=''; $i <= $num; $i++) { //Всем спасибо на этом этапе
if ($i == 0)
$url = "http://megasite.ru/index.php";
else
$url = "http://megasite.ru/index".$i.".php";
}

$unique_start = "<td>";
$unique_end = "</td>";
echo '<html><head><title>Скрипт</title></head><body>';
echo '<b>Дата:</b> '.date('d.m.Y').'<br />';
echo '<hr/>';
function weather($url, $unique_start, $unique_end) {

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_REFERER, 'http://google.ru');
curl_setopt($ch, CURLOPT_URL, $url);
if(curl_exec($ch) === false)
{
echo 'Критическая ошибка: ' . curl_error($ch);
}
else
{
echo 'Задание выполнено без каких-либо ошибок';
}
echo '<br/>';
echo '<p/>';
$data = curl_exec($ch);
curl_close($ch);

preg_match_all('/'.preg_quote($unique_start,'/').'(.*)'.preg_quote($unique_end, '/').'/Us', $data, $match);
return implode("<br>", $match[1]);
if (preg_match_all('/'.preg_quote($unique_start,'/').'(.*)'.preg_quote($unique_end, '/').'/Us', $data, $match))
print_r($match);
else
echo 'Ничего не найдено'; return $data;
}
echo weather($url, $unique_start, $unique_end); ?>
L
На сайте с 07.12.2007
Offline
351
#15
Above&Beyond:
То, что Вы мне посоветовали - отдает содержимое последней страницы. А нужно, как Вы уже догадались, чтобы отдавало результаты сразу всех таблиц со всех страниц.

Конечно, последней - цикл перебирает все url от 1 до 100 и после окончания в переменной url остаётся последний index##.php.

Кстати, в Вашем варианте код после return implode("<br>", $match[1]); и до конца функии - не исполнится, ибо сделан return.

Надо было в этом же цикле вызывать function weather() и накапливать ответ от неё, примерно так:

Above&Beyond:

<?php

$num = 10;
function get_page($url) { // Получение страницы по url
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_REFERER, 'http://google.ru');
curl_setopt($ch, CURLOPT_URL, $url);
if(curl_exec($ch) === false) {
echo "** Критическая ошибка получения $url: " . curl_error($ch)."<br>";
return "";
}
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

function weather($data) {
$unique_start = "<td>";
$unique_end = "</td>";

if ($data=='') return ''; // Нечего парсить
preg_match_all('/'.preg_quote($unique_start,'/').'(.*)'.preg_quote($unique_end, '/').'/Us', $data, $match);
return implode("<br>", $match[1]);
}

echo '<html><head><title>Скрипт</title></head><body>';
echo '<b>Дата:</b> '.date('d.m.Y').'<br />';
echo '<hr/>';

for($i = 1, $url='', $res=''; $i <= $num; $i++) { //Всем спасибо на этом этапе
if ($i == 0) $url = "http://megasite.ru/index.php";
else $url = "http://megasite.ru/index".$i.".php";
$page = get_page($url);
if ($page !='') $res .= weather($page); // Если страница получена - парсим её
else echo "*** Страница $url не получена<br>";
}
echo $res;
echo "</body></hrtml>";
?>

Единственно:
- функция получения контента страницы (get_page), для удобства вынесена из функции weather - Вы сможете использовать её в других местах программы.
- echo внутри функции - некрасиво, ошибки бы надо обрабатывать по-другому.
- перебирать циклом от 1 до 100 - тоже не айс, если многостраничная таблица, надо выбирать ссылки на каждой странице и парсить их, пока не кончатся.

Ну и регулярку в функции weather я не проверяла на "рабочесть".
AB
На сайте с 29.03.2010
Offline
27
#16

Огромное спасибо, все отлично работает!

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий