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

Форум MySQL

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

 

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

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

тема: Вложенные циклы While
 
 автор: allforweb   (28.12.2010 в 21:41)   письмо автору
 
 

Вопрос по использованию вложенного цикла 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>";
        }
    }

  Ответить  
 
 автор: cheops   (28.12.2010 в 21:49)   письмо автору
 
   для: allforweb   (28.12.2010 в 21:41)
 

Дело в том, что при прохождения цикла, дескриптор результирующей таблицы устанавливается в конец, чтобы его снова поставить в начало необходимо перед внутренним циклом вызывать функцию mysql_data_seek(), выставляя дескриптор $teaser снова на 0.

  Ответить  
 
 автор: neadekvat   (28.12.2010 в 21:58)   письмо автору
 
   для: allforweb   (28.12.2010 в 21:41)
 

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

Я бы сделал так:
<?php
$sql 
"SELECT * FROM teasers t1
        LEFT JOIN category t2 ON t1.id_cat = t2.category
        ORDER BY t1.id_cat ASC"
;
$query mysql_query($sql);

$cat_id 0// вводим "индикатор" текущей категории
/*
    Допустим, что в массиве $arr будут содержаться следующие записи
    cat_name - название категории
    cat_id - id категории
*/
while($arr mysql_fetch_assoc($query))
{
    
/*
        Если id категории не равен текущему, то выводим название этой категории
        и обновляем "индикатор"
    */
    
if ($arr['cat_id'] != $cat_id) {
        
$cat_id $arr['cat_id'];
        echo 
$arr['cat_name'] . '<br /><hr>';
    }
    
    echo 
"<a href='#'>уд</a> - <a href='#'>ред</a> - <a href='#'>а</a> - <a href='#'>{$row_teaser['title']}</a><br />";
}

Не забудьте подставить свои значения индексов и т.д. И вообще, вам главное понять предлагаемый принцип.

  Ответить  
 
 автор: allforweb   (28.12.2010 в 22:37)   письмо автору
 
   для: neadekvat   (28.12.2010 в 21:58)
 

Спасибо за помощь. Все понял.

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

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