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

Форум MySQL

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

 

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

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

тема: Рекурсия
 
 автор: Евгений Петров   (02.09.2005 в 21:37)   письмо автору
 
 

Есть функция которая рекурсивно удаляет раздел и все подразделы. Подскажите пожалуйста почему она зацикливается? Вроде все правильно написал.
<?
  DeleteAll
(1);

  function 
DeleteAll($num)
  {
    
mysql_query("DELETE FROM resource WHERE id = '$num'");
    
$query mysql_query("SELECT * FROM resource WHERE parent = '$num'");
    if(
mysql_num_rows($query) != 0)
      while(
$fetch mysql_fetch_array($query))
        
DeleteAll($fetch['id']);
     else
       return 
0;
  }
?>


Вот дамп таблицы:
CREATE TABLE 'resource' (
  'id' int(11) NOT NULL auto_increment,
  'name' varchar(255) NOT NULL default '',
  'parent' int(11) NOT NULL default '0',
  PRIMARY KEY  ('id')
) TYPE=MyISAM AUTO_INCREMENT=9 ;

INSERT INTO 'resource' VALUES (1, 'Новый раздел', 0);
INSERT INTO 'resource' VALUES (2, 'Новый раздел', 0);
INSERT INTO 'resource' VALUES (3, 'Новый раздел', 0);
INSERT INTO 'resource' VALUES (4, 'Новый раздел', 1);
INSERT INTO 'resource' VALUES (5, 'Новый раздел', 1);
INSERT INTO 'resource' VALUES (6, 'Новый раздел', 1);
INSERT INTO 'resource' VALUES (7, 'Новый раздел', 4);
INSERT INTO 'resource' VALUES (8, 'Новый раздел', 4);

   
 
 автор: cheops   (03.09.2005 в 01:35)   письмо автору
 
   для: Евгений Петров   (02.09.2005 в 21:37)
 

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

   
 
 автор: isset   (03.09.2005 в 02:16)   письмо автору
 
   для: cheops   (03.09.2005 в 01:35)
 

Не могла :)
if(mysql_num_rows($query) != 0)
Для пхп значит - не равно false.

Попробуй
if(mysql_num_rows($query) !== 0)

   
 
 автор: cheops   (03.09.2005 в 02:35)   письмо автору
 
   для: isset   (03.09.2005 в 02:16)
 

Если честно не очень понял почему не могла - вы бы не поленились, а воспроизвели ситуацию...

   
 
 автор: isset   (03.09.2005 в 02:46)   письмо автору
 
   для: cheops   (03.09.2005 в 02:35)
 

У меня тоже не зацикливается, видимо не тот код.

Простой пример:

<?
$a 
0;
if(
$a != 0) { echo "not zero"; } else { echo "zero"; }
$a false;
if(
$a != 0) { echo " not zero"; } else { echo " zero"; }
?>

Результат: zero zero

   
 
 автор: cheops   (03.09.2005 в 02:51)   письмо автору
 
   для: isset   (03.09.2005 в 02:46)
 

Это я как раз понимаю, я непонимаю, почему в ответ на синтаксически верный SQL-запрос
"SELECT * FROM resource WHERE parent = '$num'"

Функция mysql_num_rows() должна возвращать что-либо отлчиное от числа. Точно также думает и код, приведённый выше, так как в результате его работы остаются только две записи с id = 2 и id = 3.

   
 
 автор: Евгений Петров   (03.09.2005 в 13:57)   письмо автору
 
   для: cheops   (03.09.2005 в 01:35)
 

Странно я создал новую таблицу и запустил только этот скрипт и у меня действительно не зациклилась, значит дело не в этом хотя в чем не знаю. Кстати у вас ошибочка в форуме небольшая, например у меня стоит отображение линейное, а если я открою окно по ссылке в сообщении, то откроется структурный форум.

   
 
 автор: cheops   (03.09.2005 в 14:02)   письмо автору
 
   для: Евгений Петров   (03.09.2005 в 13:57)
 

Хм... странно, вообще стуктура форума прописывается в cookie и не должна меняться в зависимости от способа открытия темы...

   
 
 автор: Евгений Петров   (03.09.2005 в 14:06)   письмо автору
 
   для: cheops   (03.09.2005 в 14:02)
 

Я об этом тоже думал, поэтому и спросил

   
 
 автор: Евгений Петров   (03.09.2005 в 14:15)   письмо автору
 
   для: Евгений Петров   (03.09.2005 в 14:06)
 

А ещё фигня какая то, если создать отдельный документ и в нем только сама функция и её вызов, то если вызов поместить перед функцией то све нормально, а если это все в самом скрипте (не в отдельном документе) то если вызов поместить до самой функции он её не найдет.

   
 
 автор: Евгений Петров   (03.09.2005 в 17:25)   письмо автору
 
   для: Евгений Петров   (03.09.2005 в 14:15)
 

Теперь вообще ничего не понятно, я эту функцию в самое начало вставил и все работает.

   
Rambler's Top100
вверх

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