За последние 24 часа нас посетили 22913 программистов и 1268 роботов. Сейчас ищут 773 программиста ...

Прерывается первый цикл внутри второго do while

Тема в разделе "PHP для новичков", создана пользователем Олег Файн, 24 сен 2019.

  1. Олег Файн

    Олег Файн Новичок

    С нами с:
    13 мар 2018
    Сообщения:
    5
    Симпатии:
    0
    есть цикл do while в другом... примерной схемой
    Код (Text):
    1. do {
    2.      do {
    3.  
    4.      } while ( ) ;
    5.  
    6. } while ( ) ;
    внутренний цикл работает как положено, но с завершением закрывает и внешний
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Поздравляю. Условия и порядок вычисления их значений мы сами должны додумать?
    --- Добавлено ---
    P.S. Чую, тема не для этого раздела.
     
  3. Олег Файн

    Олег Файн Новичок

    С нами с:
    13 мар 2018
    Сообщения:
    5
    Симпатии:
    0
    я показал лишь примерную схему, условия все есть, мне важен факт, почему прерывается внешний цикл
     
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Олег Файн, дьявол он в деталях... всё дело в волшебных пузырьках условиях
    ну или break с параметром внутри внутреннего цикла
     
  5. Олег Файн

    Олег Файн Новичок

    С нами с:
    13 мар 2018
    Сообщения:
    5
    Симпатии:
    0
    Код (Text):
    1. допустим
    2. <?php
    3. $db->query('SELECT * FROM cat_news LIMIT 10');
    4. $cats = $db->FetchArray();
    5. do { // этот цикл выводит только 1 запись
    6. ?>
    7. $cat_id = $cats['id'];
    8. вывод содержимого <?=$cats['title]; ?> <br>
    9. $db->query('SELECT * FROM news  WHERE cat_id = $cat_id LIMIT 3');
    10. $news= $db->FetchArray();
    11. do { // этот цикл работает
    12. ?>
    13. Вывод новостей <?=$news['title]; ?> <br>
    14. <?php
    15. } while ($news= $db->FetchArray());
    16. ?>
    17. <br>
    18. <?php
    19. } while ($cats= $db->FetchArray());
    20. ?>
    --- Добавлено ---
    я читал про break, куда и как его вставить?), с каким параметром
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Олег Файн, всё очень плохо.
    Начни с осознания того, что запросы в цикле - это 99% твоя логическая ошибка.
     
    miketomlin нравится это.
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Опять Попов-стайл. Пока не перевернете циклы, см. не стану :)
    --- Добавлено ---
    P.S. Чуйка меня не подвела :)
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, переворачивание не поможет, условия одинаковые, как только false внутренний цикл, так сразу и внешний.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, а я и не говорил, что поможет ;)
    --- Добавлено ---
    @Олег Файн, как выше намекнули, тут достаточно одного-двух запросов. И не мешайте их с разметкой!
    --- Добавлено ---
    Сортируйте в запросе новости по id категории. Мета-данные категории присоединяйте при помощи LEFT JOIN или выбирайте их отдельным запросом. При выводе отслеживайте изменение id категории. Как только появляется новый id, выводите заголовок категории. Так можно обойтись одним циклом. Конечно, это не ед. возможный способ реализации.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Олег Файн, ну там так какой-то нестандартный класс с базой работает, и, видимо, не рассчитан на двойные запросы. Хотя, как сказали, лучше их избегать. И если этот класс - не часть фреймворка/cms, а самописная какая-нибудь оболочка, которая ничего интересного к PDO или mysqli не добавляет, я бы от неё избавился
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    P.S. Хотя у ТСа макс. три новости в каждой категории выводятся, а не все...
    --- Добавлено ---
    @mkramer, ну в шаблоне какую-то обертку для fetch лучше все же использовать. Естественно, я не беру в расчет возможность предварительного пересохранения всей выборки в двумерном массиве и т.п.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    ( Написал много букв и удалил )

    @Олег Файн Фигня в том, что новый $qb->query() перекрывает результат предыдущего где-то там внутри реализации $db. Циклы как таковые не при чём. Эта реализация доступа к БД не позволяет использовать "вложенные fetch". Такая архитектурная особенность.
     
    #12 artoodetoo, 24 сен 2019
    Последнее редактирование: 24 сен 2019
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Потому что ололо дергает в двух циклах один и тот же результирующий контент, пока не вернется null. А там и родителю циклу очевидный ответ
    1
    - 2
    - 3
    - 4
    - 5
    - 0
    0
    --- Добавлено ---
    Опыт с лермы
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Правильно. А то я уже написал тебе, что там все проще:
    PHP:
    1. } while ($news= $db->FetchArray());
    2. ...
    3. } while ($cats= $db->FetchArray());
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    А вообще надо избегать запросов в цикле. Надо либо объединить таблицы в один запрос, либо выбрать сначала данные из одной и затем один раз запросить вторую с массивом ID из первого — так внутри Laravel Eloquent работает "жадный" запрос.
     
  16. Олег Файн

    Олег Файн Новичок

    С нами с:
    13 мар 2018
    Сообщения:
    5
    Симпатии:
    0
    правильно, перекрывает, поэтому и не выводит (выводить не чего) потому что результат False)

    Понял в чем причина, всем спасибо, а запросы в цикле мне были нужны и без них в моем случае никуда, так что вот так вот)
     
  17. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    ой вряд ли :)
     
  18. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Есть решения и для вашего случая. Даже оптимизированные, на основе оконных функций и т.п. (правда, в мускуле оконные ф-ции появились только в восьмерке, но ХЗ, что у вас за СУБД).
    --- Добавлено ---
    P.S. Вот у яши на первой странице серпа по запросу «sql выбрать по три записи одним запросом» нашел такое:
    http://www.sql-ex.ru/help/select16.php?Lang=0
    --- Добавлено ---
    P.P.S. Может, проще выбирать актуальные новости по дате, чем по кол-ву.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    На форуме точно были примеры как в MySQL получить N топовых записей из каждой группы. Только найти сложно :)
    --- Добавлено ---
    Гуглится как "MySQL get top n in group"
    Например это нашлось: https://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per-group

    Update: создал тему с примерами Top N, чтобы модно было комментировать и добавлять.
    https://php.ru/forum/threads/grouping-by-top-n-in-mysql.80189/
     
    #19 artoodetoo, 24 сен 2019
    Последнее редактирование: 25 сен 2019