[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вложенные циклы While
allforweb
Вопрос по использованию вложенного цикла While.
Задача такая:
Вывести на страницу все категории сайта
Вывести под каждой категорией список тизеров, которые показываются в этйо категории
В базе каждый тизер имеет поле где цифрой обозначено id категории к которой он принадлежит

Написан функцию, которая все это должна реализовать, но проблема в том, что все прекрасно работает только в первом шаге цикла.

Первыя цикл выводим список категорий и здесь все нормально, а далее вложенный цикл выводит список тизеров только к первой категории, к остальным нет.

Прилагаю код с коммментариями:

function teaser2()
{
$category = mysql_query("SELECT * FROM category"); //выбираю все категории
$teaser = mysql_query ("SELECT * FROM teasers"); // выбираю все тизеры
while ($row_category = mysql_fetch_array($category)) //вывожу категории в цикле
{
echo $row_category['name'];
echo "<br /><hr>";
while ($row_teaser = mysql_fetch_array($teaser)) //вывожу тизеры в цикле
{
if ($row_teaser['category'] != $row_category['id_cat']) //если id категории тизера не равно id самой категории – продолжаю цикл без вывода
{
continue;
} else { // иначе вывожу тизер на страницу
echo "<a href='#'>уд</a> - <a href='#'>ред</a> - <a href='#'>а</a> - <a href='#'> ".$row_teaser['title']."</a><br />";
}
}

echo "<br /><hr>";
}
}





Спустя 18 минут, 25 секунд (28.12.2010 - 22:00) inpost написал(а):
1. В качестве знаний - в мои подписи.
2. Я бы советовал изменить построение БД. Есть 2 варианта: в teasers прописать не id_cat, а id_name. И сделать лишь единичный цикл по сортировке (BY id_name).
Либо как второй вариант всё запихнуть вообще в одну таблицу. Вот пример на скорую руку написал навигацию на моём сайте (так как времени не было проектировать, занят более важными делами):
$res = mysql_query("SELECT `id`,`title`,`id_parent` 
FROM `lessons`
ORDER BY `id_first`,`id_parent`
"
);
while($row = mysql_fetch_assoc($res))
$navigation .= '<div class="'.(empty($row['id_parent']) ? 'les_navi_main' : 'les_navi_second').'">
<a href="#">'
.(empty($row['id_parent']) ? '' : '- ').$row['title'].'</a>
</div>'
;

То есть по строению есть id и id_parent. если id_parent - отсутствует - значит это оглавление(Категории), в противном случае это уже подраздел (Тизер). Пример - последняя подпись у меня. Стили задаются через les_navi_second (ТИЗЕР) и les_navi_main (Категория)

Спустя 1 минута, 56 секунд (28.12.2010 - 22:02) sharki написал(а):
function teaser2()
{
$category = mysql_query("SELECT * FROM category"); //выбираю все категории
while ($row_category = mysql_fetch_array($category)) //вывожу категории в цикле
{
echo $row_category['name'];
echo "<br /><hr>";
$teaser = mysql_query ("SELECT * FROM teasers"); // выбираю все тизеры
while ($row_teaser = mysql_fetch_array($teaser)) //вывожу тизеры в цикле
{
if ($row_teaser['category'] != $row_category['id_cat']) //если id категории тизера не равно id самой категории – продолжаю цикл без вывода
{
continue;
} else { // иначе вывожу тизер на страницу
echo "<a href='#'>уд</a> - <a href='#'>ред</a> - <a href='#'>а</a> - <a href='#'> ".$row_teaser['title']."</a><br />";
}
}

echo "<br /><hr>";
}
}

Спустя 10 минут, 9 секунд (28.12.2010 - 22:12) inpost написал(а):
sharki
Ужас =) Я понимаю, что так хотел ТС, но поддакивать его желаниям... это какой-то код индусов. Количество обращений к БД будет равен количеству категорий +1. Да к тому же Каждый раз будут перебираться все разделы. А эта конструкция с continue - зачем? Меняем местами условие с != на ==, и тогда else вообще не нужно.

Спустя 5 минут, 22 секунды (28.12.2010 - 22:18) sharki написал(а):
inpost
Жопа, но что поделать =))
Он же не просил оптимизировать код =)

Спустя 17 минут, 53 секунды (28.12.2010 - 22:35) allforweb написал(а):
inpost - не правильно ты понял мою задачу.
sharki - главную ошибку свою понял. Спасибо.

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

А конструкцию continue я пробовал разные варианты и с ней и без нее с одинаковым результатом.

Спустя 5 минут, 8 секунд (28.12.2010 - 22:41) inpost написал(а):
allforweb
Упрямству нет предела, а потом заглянут на этот код... особенно эту часть: href='#' ... Я указал ошибки, показал, что делать дальше, решай сам. Если лень совершенствоваться, то я не буду помогать, удачи.

Спустя 10 минут, 20 секунд (28.12.2010 - 22:51) allforweb написал(а):
Цитата (inpost @ 28.12.2010 - 19:41)
allforweb
Упрямству нет предела, а потом заглянут на этот код... особенно эту часть: href='#' ... Я указал ошибки, показал, что делать дальше, решай сам. Если лень совершенствоваться, то я не буду помогать, удачи.

Ну что сразу за категоричность в выводах? href='#' при чем здесь вообще, это просто метки для ссылок, я всегда их использую, это очень удобно. Людям зачем пост увеличивать по размеру, там только суть у меня выложена. Им зачем еще и УРЛы читать. Я сказал о том, что задачу по функционалу моему ты не верно понял, а по программному коду все верно, я не в претензии.

Спустя 7 минут, 8 секунд (28.12.2010 - 22:58) inpost написал(а):
allforweb
Результат один и тот же получится в моём и твоём случае.
Поменяется кодер, посмотрят на код - стыдно будет тебе. Да и ещё HTML свойства тегов в двойные кавычки брать надо, а не в одинарные. Зашел бы по ссылке моей, почитал бы - всё бы понял без разъяснений =)

Спустя 10 часов, 28 минут, 9 секунд (29.12.2010 - 09:26) linker написал(а):
Делать как сказал inpost. Результат одинаковый, только код inpost программерский, а код ТС - мягко сказать, не кондиционный.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.