Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2010, 12:27   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Рекурсия и запись в базу

Ведь знал что надо название темы поменять) Ну да не суть, продолжим.
Имеется функция:
Код:
<?php 
function parser($page){

  preg_match_all('/<a.*?href=(.*?)[ |>]/si',$page,$links);

  $q=0; 
  foreach($links[1] as $c){
    parser($links[2][$q]);
    echo $c.$links[2][$q]."\n";
    $q++; 

  }
} 
$begin='тут линк на сайт';
parser($begin);

?>
Перед тем как я её собственно в рекурсивную загнал, она читала все ссылки с одной страницы, но теперь вобще ничего не выдает. В чем ошибка?
И еще, все полученные ссылки нужно загнать в мускульную БД в виде дерева, с ней раньше практически не имел дела, подскажите какую структуру даных лучше применить?
[MI_nor] вне форума Ответить с цитированием
Старый 21.01.2010, 13:04   #2
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

мб так
Код:
<?php
function parser($page,$par_id=""){
    $page=file_get_contents($page);
  preg_match_all('/<a.*?href=(.*?)[ |>]/si',$page,$links);
  
  foreach($links[1] as $c){
   echo trim($c,'"')."<br>\n";
     $id=funct($par_id);
    parser(trim($c,'"'),$id);
    
   
  }
}
$begin='http://mail.ru';
parser($begin);

?>
Функция funct($par_id) делает инсерт в таблицу(id,ссылка,родительский_id=$ par_id) и возвращает id вставленной записи.

Последний раз редактировалось ssdm; 21.01.2010 в 13:17.
ssdm вне форума Ответить с цитированием
Старый 23.01.2010, 21:43   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

В общем пришел к следующему:
Код:
<?php
function add_base($lin,$par_id){
 $query = "INSERT INTO tree(link,parent_id) VALUES('$lin', '$par_id')"; 
 mysql_query($query) or die(mysql_error()); 
 $last=mysql_insert_id();
 return $last;
}
function parser($page,$par_id){
    $page=file_get_contents($page);
  preg_match_all('/<a.*?href=(.*?)[ |>]/si',$page,$links);
  $q=0;
  foreach($links[1] as $c){
    $links[2][$q]=substr($c,1,strlen($links[2][$q])-2);
    if($links[2][$q]{0}==chr(47))
    $links[2][$q]='http://sksale.ru'.$links[2][$q];
    $id=add_base($links[2][$q],$par_id);
    if(strcmp($links[2][$q],'http://sksale.ru/'))
     parser($links[2][$q],$id);
    echo $links[2][$q]." - ".$par_id."<br>\n";
    $q++; 
  }
}
$begin='http://sksale.ru/';
mysql_connect('','','') or die("Could not connect: " . mysql_error());
mysql_select_db('sksale');
parser($begin,'');

?>
такое дело, что для первоначальной страницы он вставляет все нормально, но дальше ни в какую не хочет, а в окне браузера следующая фигня...
Fatal error: Maximum execution time of 30 seconds exceeded in C:\AppServ\www\parser.php on line 9
З.Ы ой, я извиняюсь. рекурсит он нормально, но все id в таблице в итоге равны 0 =( Как это исправить? И где увеличить время, ибо ссылок как и страниц ооооооочень много. Кто что посоветует?

Последний раз редактировалось [MI_nor]; 23.01.2010 в 22:41.
[MI_nor] вне форума Ответить с цитированием
Старый 23.01.2010, 23:01   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Время -ini_set('set_time_limit',0);
Id - нужно разобраться в функции вставки. Либо передавать увеличивающийся id, либо сделать автоинкремент в таблице, если я правильно понял, что нужно.
motorway вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. p@ul Помощь студентам 4 30.12.2009 14:46
Рекурсия Настенька..Блонди Паскаль, Turbo Pascal, PascalABC.NET 1 08.05.2009 12:27
Запись из файла txt или mdb в базу данных DerSky БД в Delphi 6 09.06.2008 12:50
Рекурсия АнНютик Паскаль, Turbo Pascal, PascalABC.NET 1 29.01.2008 22:50