Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: sleep() если не выполнено условие
 
 автор: Gandzas   (22.01.2008 в 23:37)   письмо автору
 
 

задача:
проверить наличие определенных строк в БД и:
если нет - заснуть на время, потом снова проверить
если есть - продолжить выполнять действия


<?php
set_time_limit
(0); 
ignore_user_abort(true);
... 
// коннект к базе

// проверяем наличие источника 1 в базе

$res1=mysql_query("SELECT .... FROM ... WHERE");
$resnum1=mysql_num_rows($res1);
while (
$resnum1==0) { sleep(5); }

// проверяем наличие источника 2 в базе

$res2=mysql_query("SELECT .... FROM ... WHERE");
$resnum2=mysql_num_rows($res2);
while (
$resnum2==0) { sleep(5); }

// если присутствует и источник1, и источник2 продолжаем действия
....
?>


Скрипт засыпает, как положено. Но, когда требуемые строки в БД появляются, то он все-равно спит и не продолжает действия. В чем ошибка?

   
 
 автор: bronenos   (22.01.2008 в 23:50)   письмо автору
 
   для: Gandzas   (22.01.2008 в 23:37)
 

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

while (true)
{
  mysql_query(...);
  if (mysql_num_rows(...)) break;
  sleep(5);
}

   
 
 автор: Gandzas   (23.01.2008 в 00:06)   письмо автору
 
   для: bronenos   (22.01.2008 в 23:50)
 


set_time_limit(0);  
ignore_user_abort(true); 
... // коннект к базе 

// проверяем наличие источника 1 в базе

while (true) 

$res1=mysql_query("SELECT .... FROM ... WHERE"); 
$resnum1=mysql_num_rows($res1); 
if ($resnum1==0) break; sleep(5); 
}
// проверяем наличие источника 2 в базе 

while (true) 

$res2=mysql_query("SELECT .... FROM ... WHERE"); 
$resnum2=mysql_num_rows($res2); 
if ($resnum2==0) break; sleep(5); 
}
// если присутствует и источник1, и источник2 продолжаем действия 
.... 
?>


Так?

   
 
 автор: Gandzas   (23.01.2008 в 00:30)   письмо автору
 
   для: Gandzas   (23.01.2008 в 00:06)
 

не работает(

   
 
 автор: bronenos   (23.01.2008 в 00:33)   письмо автору
 
   для: Gandzas   (23.01.2008 в 00:06)
 

Давайте сравним...

while (true) 

  mysql_query(...); 
  if (mysql_num_rows(...)) break; 
  sleep(5); 
}



while (true)  
{  
$res1=mysql_query("SELECT .... FROM ... WHERE");  
$resnum1=mysql_num_rows($res1);  
if ($resnum1==0) break; sleep(5);  
}


1. Необязательно пользоваться временной переменной для кол-ва рядов (хотя это не ошибка)
2. if (... == 0) break; (но у меня [== 0] опущена, потому что [== 0] аналогично [!] и [== false], иными словами, если взять числами, то [> 0])
3. Вы break и sleep написали в одной строчке, видимо полагая, что они оба вызовутся после выполнения условия. Это не так. Без [{] и [}] выполнится только первый оператор, сразу после условия, а второй выполнится, если условие ложно и не выполнится если истинно (ибо break прервет цикл и выйдет вовне)

   
 
 автор: Gandzas   (23.01.2008 в 00:52)   письмо автору
 
   для: bronenos   (23.01.2008 в 00:33)
 

Спасибо. Поняла.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования