Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите зациклить 
V
    Опции темы
trigger
Дата 16.1.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Господа! ощущая слабость прошу помощи в решении задачи.

Задача 
Выбрать по одной строке из таблицы при условии что статус страницы=1 игнорируя остальные
произвести действия с этой строкой (в процессе пометив ее статусом 2)
выбрать следующую строку с теми-же параметрами -> повторить действие.
итак до тех пор пока строки со значением не закончатся. Тоесть завершить работу цыкла 
после того как все строки отработаются
  Заранее благодарю

Код

my $mark = 1;
    while ($mark){
    my $get_id = "SELECT * FROM pull WHERE status='1' ORDER BY ID LIMIT 1";
    my $sth = $dbh->prepare($get_id);
    $sth -> execute ();
        while (my $row = $sth->fetchrow_hashref()){
        my $status = $row->{status};
        my $id = $row->{ID};
        my $url = $row->{url};
        get_next_content ($id,$url);
    }
}


Это сообщение отредактировал(а) trigger - 16.1.2007, 18:38
PM MAIL WWW ICQ   Вверх
JAPH
Дата 16.1.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 3
Всего: 23



ИМХО странная задача. Где столкнулся (просто интересно)?
Что такое get_next_content? Обрабатывает строку? Кто такая $mark? Она в цикле меняется?
Если нужно обрабатывать все строки, то почему бы не запросить все сразу:
Код

my $sth = $dbh -> prepare("SELECT * FROM pull WHERE status=1 ORDER BY ID");
$sth -> execute();

а потом обрабатывать по одной:
Код

while (my $row = $sth -> fetchrow_hashref()) {
    my ($status, $id, $url) = @$row{'status', 'ID', 'url'};
    get_next_content($id, $url)
}

В конце можно изменить статус всех обработанных:
Код

$dbh -> do("UPDATE pull SET status=2 WHERE status=1");


Чем не устраивает?


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
trigger
Дата 16.1.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



эээээээээ спасибо - некоторые моменты учту  - спасибо. Но наверное невнятно выразился.
итак - это скрипт - который индексирует все ресурсы корпорации.

Ресурсов немало и каждый из них имеет не менее 15 000 документов (страниц). 
поэтому все ссылки выбирать из базы - это както некамильфо.
поэтому выбрал следующий алгоритм:
  • берем первую страницу
  • достаем из нее ссылки и заносим в таблицу pull - это колонка имеет атрибут UNIQUE - для отсекания повторяющихся ссылок


после чего следующий код 
Код

my $mark = 1;
    while ($mark){
    my $get_id = "SELECT * FROM pull WHERE status='1' ORDER BY ID LIMIT 1";
    my $sth = $dbh->prepare($get_id);
    $sth -> execute ();
        while (my $row = $sth->fetchrow_hashref()){
        my $status = $row->{status};
        my $id = $row->{ID};
        my $url = $row->{url};
        get_next_content ($id,$url);
    }
}


в идеале вытягивает первую ссылку из таблицы pull где status=1
get_next_content ($id,$url); забирает по ссылке контент и заносит покачто в базу и 
обновляет status на status =2 
после того как это все произошло - идет следующая выборка 

вот и когда отработало все (и нет в таблице строк со статусом = 1)- нужно выйти из цыкла - но я в нем застрял $mark - задает значение истины в цыкл


PM MAIL WWW ICQ   Вверх
JAPH
Дата 16.1.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 3
Всего: 23



Можно попробовать всё-таки while заменить на if - если необработанные строки в БД остались, то мы выбираем одну, цикл не нужен; если не остались, то можно в ветке else изменить $mark, чтобы выйти из цикла
Код

my $mark = 1;    
while ($mark){    
    my $get_id = "SELECT * FROM pull WHERE status='1' ORDER BY ID LIMIT 1";    
    my $sth = $dbh->prepare($get_id);    
    $sth -> execute ();    
    if (my $row = $sth->fetchrow_hashref()){    
        my $status = $row->{status};    
        my $id = $row->{ID};    
        my $url = $row->{url};    
        get_next_content ($id,$url);    
    } else { $mark = 0 }
}



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
trigger
Дата 16.1.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



smile спасибо огромное 
странно но ума не хватило самому smile

Это сообщение отредактировал(а) trigger - 17.1.2007, 01:50
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.