За последние 24 часа нас посетили 17182 программиста и 1836 роботов. Сейчас ищут 1549 программистов ...

Как вывести из БД список, поделить его на категории и правильно разместить в шаблонизаторе

Тема в разделе "PHP для новичков", создана пользователем Ra1s, 21 фев 2023.

Метки:
  1. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    Возникла необходимость вывести с базы разбитый на три раздела(категории) список и раскидать это по блокам. Проблема в том, что я не представляю себе как это сделать.

    На сайте подключен пример вывода списка, который я выложу ниже. Есть две таблицы "articles" и "menu". menu содержит в себе разделы: "id, name, href, position", а articles заголовки статей: "id, date, author, title, text, cat".

    Я пытаюсь сделать так, чтобы строки из articles выводились в зависимости от категории из menu по шаблону allcontent.html. Есть идея соединить таблицы через запрос INNER JOIN и вывести с помощью массива, но как это грамотно сделать? Помогите мне пожалуйста хотя бы один раз на этом форуме)

    allcontent.html

    HTML:
    1. <<!--из категории автомобилей--> [_while] <li class="hs__item item" onclick="location.href='main.php';"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div> <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div> </li> [_while] <<!--из категории природы--> [_while] <li class="hs__item item" onclick="location.href='main.php';"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div> <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div> </li> [_while] <<!--из категории стран--> [_while] <li class="hs__item item" onclick="location.href='main.php';"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div> <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div> </li> [_while]
    PHP:
    1. //Выводим из базы данных посты $result_index = R::getAll("SELECT id,author,title,cat FROM articles ORDER BY id DESC"); foreach ($result_index as $myrow_index) { if($myrow_index != "")//Проверяем есть ли в базе данных записи {//Если есть... if($myrow_index['cat'] != 0) { $result_cat = R::getAll("SELECT name FROM menu WHERE id='$myrow_index[cat]'");//Выводим из базы имя пункта foreach ($result_cat as $myrow_cat) { $name_cat = $myrow_cat['name']; } } else $name_cat = "Нет категории"; $copy_tamp = $tamp_while[1];//Сохраняем ту часть которая будет повторяться в отдельную переменную //Делаем замены код-слов $copy_tamp = str_replace("[_title]",$myrow_index['title'],$copy_tamp);//Название поста $copy_tamp = str_replace("[_author]",$myrow_index['author'],$copy_tamp);//Автор $copy_tamp = str_replace("[_id]",$myrow_index['id'],$copy_tamp);//ID постов $copy_tamp = str_replace("[_cat]",$name_cat,$copy_tamp);//Имя категории $list .= $copy_tamp;//Объединяем результат в одну переменную } else $sm_read = "<p align='center'>Нет пользователей</p>";//Если записей нет, то вывести это сообщение } $sm_read = preg_replace("/\[_while\].*?\[_while\]/s",$list,$sm_read);//Вставляем в шаблон список постов return $sm_read;//Выводим с генерированный html код }
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.575
    Симпатии:
    1.759
    Размести код ещё раз, но так, чтоб его можно было читать
     
    aliensgroup нравится это.
  3. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    HTML:
    1. <ul class="hs owl-carousel carousel1">
    2.         [_while]
    3.         <li class="hs__item item" onclick="location.href='main.php';">
    4.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div>
    5.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    6.         </li>
    7.         [_while]
    8.       </ul>
    9. <ul class="hs owl-carousel carousel2">
    10.         [_while]
    11.         <li class="hs__item item" onclick="location.href='main.php';">
    12.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div>
    13.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    14.         </li>
    15.         [_while]
    16.       </ul>
    17. <ul class="hs owl-carousel carousel3">
    18.         [_while]
    19.         <li class="hs__item item" onclick="location.href='main.php';">
    20.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div>
    21.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    22.         </li>
    23.         [_while]
    24.       </ul>
    PHP:
    1. //ФУНКЦИЯ ВЫВОДА СПИСКА
    2. function allcontent()//Функция вывода списка постов
    3. {
    4. $sm_read = file("php/templates/allcontent.html");//...подключаем шаблон
    5. $sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
    6. preg_match("/\[_while\](.*?)\[_while\]/s",$sm_read,$tamp_while);//Находим в шаблоне тут часть, которую будет ду вайлить
    7.  
    8. //Выводим из базы данных посты
    9. $result_index = R::getAll("SELECT id,author,title,cat FROM articles ORDER BY id DESC");
    10. foreach ($result_index as $myrow_index)
    11. {
    12.     if($myrow_index != "")//Проверяем есть ли в базе данных записи
    13.     {//Если есть...
    14.         if($myrow_index['cat'] != 0)
    15.         {
    16.             $result_cat = R::getAll("SELECTnameFROM menu WHERE id='$myrow_index[cat]'");//Выводим из базы имя пункта
    17.             foreach ($result_cat as $myrow_cat)
    18.             {
    19.                 $name_cat = $myrow_cat['name'];
    20.             }
    21.         }
    22.         else $name_cat = "Нет категории";
    23.  
    24.         $copy_tamp = $tamp_while[1];//Сохраняем ту часть которая будет повторяться в отдельную переменную
    25.         //Делаем замены код-слов
    26.         $copy_tamp = str_replace("[_title]",$myrow_index['title'],$copy_tamp);//Название поста
    27.         $copy_tamp = str_replace("[_author]",$myrow_index['author'],$copy_tamp);//Автор
    28.         $copy_tamp = str_replace("[_id]",$myrow_index['id'],$copy_tamp);//ID постов
    29.         $copy_tamp = str_replace("[_cat]",$name_cat,$copy_tamp);//Имя категории
    30.  
    31.  
    32.         $list .= $copy_tamp;//Объединяем результат в одну переменную
    33.     }
    34.     else $sm_read = "<p align='center'>Нет пользователей</p>";//Если записей нет, то вывести это сообщение
    35. }
    36.    
    37. $sm_read = preg_replace("/\[_while\].*?\[_while\]/s",$list,$sm_read);//Вставляем в шаблон список постов
    38. return $sm_read;//Выводим с генерированный html код
    39. }
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.208
    Симпатии:
    185
    Что содержится в $result_index?

    SELECTnameFROM - это работать не будет.

    Хочу увидеть структуру базы.
     
  5. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Для удобства использования JOIN сделайте в таблицах "сравнивающий" столбец (связь)...Например в таблице menu сделайте поле с названием "article_id", которая будет равна нужному id из таблицы articles.
    Когда будет "сравнивающий" столбец (связь), получите массив из БД, содержащий нужную Вам инфу. Ну а после в шаблоне через условия или цикл выведите эту информацию, в нужной Вам последовательности...
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    912
    Симпатии:
    143
    @Ra1s, ты сам это писал по-тайски (без пробелов) что ли? Почитай про экранирование названий полей, таблиц и баз данных.
     
  7. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    SELECTnameFROM - это при копирование сюда как-то так получилось
    [​IMG]
    [​IMG]
    [​IMG]
    --- Добавлено ---
    Мне сейчас не до экранирования. Мне нужно что бы работало, а потом остальное.
    --- Добавлено ---
    Со структурой я разобрался не без помощи, вот только массив выводи мне все категории сразу в каждом блоке, а мне так не пойдет. Нужно чтобы одна категория=один блок. Вот пример(пока что без шаблонизации)
    PHP:
    1. $result_index = R::getAll("SELECT a.id, a.author, a.title, m.name category_name FROM articles a LEFT JOIN menu m ON m.id = a.cat ORDER BY a.id DESC");
    2. $groups = [];
    3. foreach ($result_index as $myrow_index) {
    4.     $groups[$myrow_index['category_name']][] = $item;
    5. }
    PHP:
    1. <?php foreach($groups as $category => $articles): ?>
    2.         <h2><?=$category?></h2>
    3.         <?php foreach($articles as $article): ?>
    4.         <li class="hs__item item" onclick="location.href='main.php';">
    5.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/112/300/300" alt=""/></div>
    6.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    7.         </li>
    8.         <?php endforeach ?>
    9.       <?php endforeach ?>
    10. Блоки нельзя объединять. Такое, к сожалению, условие.
    11. <?php foreach($groups as $category => $articles): ?>
    12.       <h2><?=$category?></h2>
    13.         <?php foreach($articles as $article): ?>
    14.         <li class="hs__item item">
    15.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/300/300" alt=""/></div>
    16.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    17.         </li>
    18.         <?php endforeach ?>
    19.       <?php endforeach ?>
     
  8. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    PHP:
    1. $groups = [];
    2. foreach ($result_index as $myrow_index) {
    3.     $groups[$myrow_index['category_name']] .= sprintf("<somehtmlcode>%s</somehtmlcode>\n", $item);
    4. }
    5.  
    6.  
    7. foreach($groups as $category => $articles) {
    8.      printf("<h2>%s</h2>\n%s", $category, $articles);
    9. }
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    Да уж... мессиво то ещё.

    Если тебе проще думать о массивах, чем о реляционной базе: у тебя есть массив $a в котором $a['category_name'] это имя категории.

    Собрать уникальные имена категорий из массива — на случай если тебе захочется цикл по этим именам
    PHP:
    1. $cats = array_unique(array_column($a, 'category_name'))
    Отсортировать массив чтобы записи с одной категорией шли подряд.
    PHP:
    1. usort($a, fn($x, $y) => $x['category_name'] <=> $y['category_name'])
    Выбрать из массива подмножество записей с определенной категорией.
    PHP:
    1. $sub = array_filter($a, fn($x) => $x['category_name'] == 'computer')
    Комбинируй всё это и получишь желаемое.

    - - -

    Если таки без массивов, то просто сортируй выборку по категории, а в цикле вывода отслеживай не встретилась ли новая категория.
    PHP:
    1. $st = query("SELECT articles.*, categories.cat_name FROM ... JOIN ... ORDER BY categories.cat_name");
    2. // ...
    3. $cat = null;
    4. while ($row = fetch($st)) {
    5.   if ($cat !== $row['cat_name']) {
    6.     if ($cat !== null) {
    7.       echo "</div> <!-- category block end -->";
    8.     }
    9.     $cat = $row['cat_name'];
    10.     echo "<div> <!-- category block begin -->";
    11.     echo "  <p style=\"category-header\">{$cat}</p>";
    12.   }
    13.   //
    14.   // ... вывод статьи
    15.   //
    16. }
    17.  
    18. if ($cat !== null) {
    19.   echo "</div> <!-- category block end -->";
    20. }
     
  10. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    А куда это тогда девать?
    HTML:
    1. <ul class="hs owl-carousel carousel">
    2.         [_while]
    3.         <li class="hs__item item">
    4.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/300/300" alt=""/></div>
    5.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    6.         </li>
    7.         [_while]
    8.       </ul>
    9. <ul class="hs owl-carousel carousel">
    10.         [_while]
    11.         <li class="hs__item item">
    12.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/300/300" alt=""/></div>
    13.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    14.         </li>
    15.         [_while]
    16.       </ul>
    17. <ul class="hs owl-carousel carousel">
    18.         [_while]
    19.         <li class="hs__item item">
    20.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/300/300" alt=""/></div>
    21.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    22.         </li>
    23.         [_while]
    24.       </ul>
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    Переписать под норм. шаблонизатор, можно сразу под нативный пыха.
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    P.S. Если можно использовать перед циклом какой-нибудь ведущий блок (пустой или какой-то левый), то показанный алгоритм вывода можно упростить:
    PHP:
    1. <ul class="левый">
    2. <?php $cat = null; while ($row = getrow($result)): ?>
    3. <?php if ($row['cat'] != $cat): $cat = $row['cat']; ?>
    4. </ul>
    5. <ul class="hs owl-carousel carousel">
    6. <?php endif; ?>
    7.   <li><!-- ... вывод статьи --></li>
    8. <?php endwhile; ?>
    9. </ul>
     
    #12 miketomlin, 23 фев 2023
    Последнее редактирование: 23 фев 2023
    artoodetoo нравится это.
  13. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    @miketomlin, если вы имеете ввиду вот так, то не работает.
    PHP:
    1. $result = R::getAll("SELECT articles.*, categories.cat FROM articles JOIN menu ORDER BY categories.cat");
    2. // ...
    3. <ul class="hs owl-carousel carousel">
    4.         <?php $cat = null; foreach ($result as $row): ?>
    5.         <?php if ($row['cat'] != $cat): $cat = $row['cat']; ?>
    6.       </ul>
    7. <?php endif; ?>
    8.         <li class="hs__item item">
    9.           <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/300/300" alt=""/></div>
    10.           <div class="hs__item__description"><span class="hs__item__title">[_title]</span><span class="hs__item__subtitle">[_author]</span><span><a style="font-weight:100;" href="php/eddform.php?page=edd_content&id=[_id]">ред.</a><a style="font-weight:100;" href="?page=edd_content&del_post=[_id]"><img src="img/del.jpg" border="0px"></a></span></div>
    11.         </li>
    12.       <?php endforeach; ?>
    [​IMG]
    [​IMG]
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.829
    Симпатии:
    651
    @Ra1s, я четко показал, что я имею в виду. Не можете понять элементарный алгоритм, возьмите задачку попроще.
    --- Добавлено ---
    У вас нет таблицы categories. Вы дублируете поле cat в выборке (или выбираете что-то др. под тем же именем). Короче нифига не сечете, что делаете. Начните с основ.
     
  15. Ra1s

    Ra1s Новичок

    С нами с:
    21 фев 2023
    Сообщения:
    7
    Симпатии:
    0
    @miketomlin, просто уже голова кругом идёт от объединения этих таблиц да ещё с массивом по разным категориям