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

Форум PHP

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

 

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

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

тема: While-цикл и его нестабильность
 
 автор: vidal   (01.08.2010 в 01:24)   письмо автору
 
 

Здравствуйте!
Программирую меню сайта PHP/MySQL. Пришлось применить два While-цикла один в другом. Первый находит первую директорию и перестает работать после работы другого. Второй исправно находит все поддиректории. Уже мучаюсь пол дня. Может кто подскажет мою ошибку?

$query = "select * from main";
$query1 = $query;
$categoryes = mysql_db_query($dbname, $query, $link);
$categoryes1 = $categoryes;
while($stroka=mysql_fetch_array($categoryes)) // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
{
   if ($stroka["type"] == "0"){
     echo $stroka["name"]; // Вывод на экран категорий
     echo "<br>";
       while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
       {
       if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
       echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
       echo "<br>";
}
}
}
}

Когда убираю второй цикл (начиная с while и включая две фигурные скобки), первый цикл проигрывается до конца.

  Ответить  
 
 автор: sms-send   (01.08.2010 в 01:30)   письмо автору
 
   для: vidal   (01.08.2010 в 01:24)
 

Ошибка, наверное, в непонимании смысла вот этой строки:
$categoryes1 = $categoryes;

Тут не происходит копирования результата запроса, вы двумя циклами перебираете один и тот же набор результата запроса, внешнему циклу всегда достаётся только первый ряд, остальное выбирается внутренним циклом, как только он получает управление.

> // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
Отбором данных должна заниматься СУБД, насколько это возможно.

  Ответить  
 
 автор: vidal   (01.08.2010 в 01:34)   письмо автору
 
   для: sms-send   (01.08.2010 в 01:30)
 

Я думаю здесь все правильно. Это я делаю новые переменные для второго While-цикла

  Ответить  
 
 автор: sms-send   (01.08.2010 в 01:36)   письмо автору
 
   для: vidal   (01.08.2010 в 01:34)
 

Смешно =)
А я так не думаю.

> Уже мучаюсь пол дня.

> Я думаю здесь все правильно.

Как то не сходится.

Попробуйте посмотреть что выводит этот код:
// <?php

header
('Content-Type: text/plain');
$sql_query 'SELECT 123 FROM `main`';
$q1 mysql_query($sql_query);
$q2 $q1// "делаю новые переменные для второго While-цикла"
$n 0;
echo 
"Начало первого цикла\n";
while(
$row1 mysql_fetch_row($q1))
    echo 
"q1: Ряд ".($n++)."\n";
echo 
"Конец первого цикла\n";    
$n 0;
echo 
"Начало второго цикла\n";
while(
$row2 mysql_fetch_row($q2))
    echo 
"q2: Ряд ".($n++)."\n";
echo 
"Конец второго цикла\n";


Потом замените строчку
$q2 = $q1;
на
$q2 = mysql_query($sql_query);
и посмотрите на вывод ещё раз.

Обязательно читать SELECT Syntax, особенно по части ключевого слова WHERE. И сюда заглянуть не помешает: JOIN Syntax.

  Ответить  
 
 автор: vidal   (01.08.2010 в 10:50)   письмо автору
 
   для: sms-send   (01.08.2010 в 01:30)
 

Спасибо всем за небезразличие. Проблема решена следующим способом:

$query = "select * from main";
$query1 = $query;
$categoryes = mysql_db_query($dbname, $query, $link);
while($stroka=mysql_fetch_array($categoryes)) // перебор строк таблицы с начала до конца с целью поиска категорий (["type"] == "0")
{
   if ($stroka["type"] == "0"){
     echo $stroka["name"]; // Вывод на экран категорий
     echo "<br>";
       $categoryes1 = mysql_db_query($dbname, $query, $link);
       while($stroka1=mysql_fetch_array($categoryes1)) // перебор строк таблицы с начала до конца с целью поиска подкатегорий данной категории (["type"] == "1")
       {
       if (($stroka1["type"] == "1") and ($stroka1["subtype"] == $stroka["N"])){
       echo $stroka1["name"]; // Вывод на экран подкатегорий данной категории
       echo "<br>";
}
}
}
}

sms-send, neadekvat спасибо! Вы открыли мне глаза! $categoryes1 = $categoryes -этого не стоило делать, а получить данные самостоятельно для $categoryes1.

  Ответить  
 
 автор: neadekvat   (01.08.2010 в 01:42)   письмо автору
 
   для: vidal   (01.08.2010 в 01:24)
 

> mysql_db_query
Она все-таки существует :)

$categoryes = mysql_db_query($dbname, $query, $link); 
$categoryes1 = $categoryes; 
while($stroka=mysql_fetch_array($categoryes))
while($stroka1=mysql_fetch_array($categoryes1))


А теперь давайте подставим вместо переменных свои значения, итого:

while($stroka=mysql_fetch_array(mysql_db_query($dbname, "select * from main", $link)))
while($stroka1=mysql_fetch_array(mysql_db_query($dbname, "select * from main", $link)))


Так понятнее, что вы делаете на самом деле?

  Ответить  
Rambler's Top100
вверх

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