За последние 24 часа нас посетили 35886 программистов и 1745 роботов. Сейчас ищут 1353 программиста ...

Вложенные циклы While

Тема в разделе "PHP для новичков", создана пользователем allforweb, 28 дек 2010.

  1. allforweb

    allforweb Активный пользователь

    С нами с:
    18 сен 2010
    Сообщения:
    72
    Симпатии:
    0
    Вопрос по использованию вложенного цикла While.
    Задача такая:
    Вывести на страницу все категории сайта
    Вывести под каждой категорией список тизеров, которые показываются в этйо категории
    В базе каждый тизер имеет поле где цифрой обозначено id категории к которой он принадлежит

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

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

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

    [js]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>";
    }
    }[/js]
     
  2. marsik

    marsik Активный пользователь

    С нами с:
    30 дек 2008
    Сообщения:
    246
    Симпатии:
    17
    Я вот новичок и не могу понять зачем здесь функция нужна,
    Код (Text):
    1. $teaser = mysql_query ("SELECT * FROM teasers"); // выбираю все тизеры
    можно же:
    $teaser = mysql_query ("SELECT * FROM `teasers` WHERE `category id` = '$row_category[id_cat]' "); //

    while, for и построили таблицу с названием категорий и ихних тизеров
     
  3. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    конструкция обработки возвращаяемого sql ресурса сработает лишь один раз.

    Код (Text):
    1.  
    2. function teaser2(){
    3.   $category = mysql_query("SELECT * FROM category"); //выбираю все категории
    4.   $teaser = mysql_query ("SELECT * FROM teasers"); // выбираю все тизеры
    5.   $teasers = array();
    6.   while ($row_teaser = mysql_fetch_array($teaser)){  $teasers[] = $row_teaser; }
    7.   while ($row_category = mysql_fetch_array($category)){
    8.     echo $row_category['name'];
    9.     echo "<br /><hr>";
    10.     foreach($teasers as $row_teaser){
    11.       if ($row_teaser['category'] != $row_category['id_cat']){
    12.         continue;
    13.       } else { // иначе вывожу тизер на страницу                  
    14.         echo "<a href='#'>уд</a> - <a href='#'>ред</a> - <a href='#'>а</a> - <a href='#'> ".$row_teaser['title']."</a><br />";
    15.       }  
    16.     }
    17.     echo "<br /><hr>";
    18.   }
    19. }
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    allforweb
    Не уверен что mysql_ умеет фетчить сразу два ресурса на одном подключении. По крайней мере для odbtp мне приходится делать два подключения. Или сначала все взять из первого запроса, а потом уже работать со вторым. Что, собственно, и предложил Gromo.

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

    Ну и мой вариант. =))
    [js]function teaser2()
    {
    $res = mysql_query("SELECT c.name, t.title FROM category as c left outer join teasers as t on t.category=c.id_cat ");
    $cat='';
    while ($row = mysql_fetch_array($res)){
    if ($cat!=$row['name']){
    echo "<br /><hr>";
    echo $row['name'];
    echo "<br /><hr>";
    $cat=$row['name'];
    }
    echo "<a href='#'>уд</a> - <a href='#'>ред</a> - <a href='#'>а</a> - <a href='#'> ".$row['title']."</a><br />";
    }
    }[/js]