Возникла необходимость вывести с базы разбитый на три раздела(категории) список и раскидать это по блокам. Проблема в том, что я не представляю себе как это сделать. На сайте подключен пример вывода списка, который я выложу ниже. Есть две таблицы "articles" и "menu". menu содержит в себе разделы: "id, name, href, position", а articles заголовки статей: "id, date, author, title, text, cat". Я пытаюсь сделать так, чтобы строки из articles выводились в зависимости от категории из menu по шаблону allcontent.html. Есть идея соединить таблицы через запрос INNER JOIN и вывести с помощью массива, но как это грамотно сделать? Помогите мне пожалуйста хотя бы один раз на этом форуме) allcontent.html HTML: <<!--из категории автомобилей--> [_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: //Выводим из базы данных посты $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 код }
HTML: <ul class="hs owl-carousel carousel1"> [_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] </ul> <ul class="hs owl-carousel carousel2"> [_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] </ul> <ul class="hs owl-carousel carousel3"> [_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] </ul> PHP: //ФУНКЦИЯ ВЫВОДА СПИСКА function allcontent()//Функция вывода списка постов { $sm_read = file("php/templates/allcontent.html");//...подключаем шаблон $sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его preg_match("/\[_while\](.*?)\[_while\]/s",$sm_read,$tamp_while);//Находим в шаблоне тут часть, которую будет ду вайлить //Выводим из базы данных посты $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("SELECTnameFROM 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 код }
Для удобства использования JOIN сделайте в таблицах "сравнивающий" столбец (связь)...Например в таблице menu сделайте поле с названием "article_id", которая будет равна нужному id из таблицы articles. Когда будет "сравнивающий" столбец (связь), получите массив из БД, содержащий нужную Вам инфу. Ну а после в шаблоне через условия или цикл выведите эту информацию, в нужной Вам последовательности...
@Ra1s, ты сам это писал по-тайски (без пробелов) что ли? Почитай про экранирование названий полей, таблиц и баз данных.
SELECTnameFROM - это при копирование сюда как-то так получилось --- Добавлено --- Мне сейчас не до экранирования. Мне нужно что бы работало, а потом остальное. --- Добавлено --- Со структурой я разобрался не без помощи, вот только массив выводи мне все категории сразу в каждом блоке, а мне так не пойдет. Нужно чтобы одна категория=один блок. Вот пример(пока что без шаблонизации) PHP: $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"); $groups = []; foreach ($result_index as $myrow_index) { $groups[$myrow_index['category_name']][] = $item; } PHP: <?php foreach($groups as $category => $articles): ?> <h2><?=$category?></h2> <?php foreach($articles as $article): ?> <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> <?php endforeach ?> <?php endforeach ?> Блоки нельзя объединять. Такое, к сожалению, условие. <?php foreach($groups as $category => $articles): ?> <h2><?=$category?></h2> <?php foreach($articles as $article): ?> <li class="hs__item item"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/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> <?php endforeach ?> <?php endforeach ?>
PHP: $groups = []; foreach ($result_index as $myrow_index) { $groups[$myrow_index['category_name']] .= sprintf("<somehtmlcode>%s</somehtmlcode>\n", $item); } foreach($groups as $category => $articles) { printf("<h2>%s</h2>\n%s", $category, $articles); }
Да уж... мессиво то ещё. Если тебе проще думать о массивах, чем о реляционной базе: у тебя есть массив $a в котором $a['category_name'] это имя категории. Собрать уникальные имена категорий из массива — на случай если тебе захочется цикл по этим именам PHP: $cats = array_unique(array_column($a, 'category_name')) Отсортировать массив чтобы записи с одной категорией шли подряд. PHP: usort($a, fn($x, $y) => $x['category_name'] <=> $y['category_name']) Выбрать из массива подмножество записей с определенной категорией. PHP: $sub = array_filter($a, fn($x) => $x['category_name'] == 'computer') Комбинируй всё это и получишь желаемое. - - - Если таки без массивов, то просто сортируй выборку по категории, а в цикле вывода отслеживай не встретилась ли новая категория. PHP: $st = query("SELECT articles.*, categories.cat_name FROM ... JOIN ... ORDER BY categories.cat_name"); // ... $cat = null; while ($row = fetch($st)) { if ($cat !== $row['cat_name']) { if ($cat !== null) { echo "</div> <!-- category block end -->"; } $cat = $row['cat_name']; echo "<div> <!-- category block begin -->"; echo " <p style=\"category-header\">{$cat}</p>"; } // // ... вывод статьи // } if ($cat !== null) { echo "</div> <!-- category block end -->"; }
А куда это тогда девать? HTML: <ul class="hs owl-carousel carousel"> [_while] <li class="hs__item item"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/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] </ul> <ul class="hs owl-carousel carousel"> [_while] <li class="hs__item item"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/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] </ul> <ul class="hs owl-carousel carousel"> [_while] <li class="hs__item item"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/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] </ul>
P.S. Если можно использовать перед циклом какой-нибудь ведущий блок (пустой или какой-то левый), то показанный алгоритм вывода можно упростить: PHP: <ul class="левый"> <?php $cat = null; while ($row = getrow($result)): ?> <?php if ($row['cat'] != $cat): $cat = $row['cat']; ?> </ul> <ul class="hs owl-carousel carousel"> <?php endif; ?> <li><!-- ... вывод статьи --></li> <?php endwhile; ?> </ul>
@miketomlin, если вы имеете ввиду вот так, то не работает. PHP: $result = R::getAll("SELECT articles.*, categories.cat FROM articles JOIN menu ORDER BY categories.cat"); // ... <ul class="hs owl-carousel carousel"> <?php $cat = null; foreach ($result as $row): ?> <?php if ($row['cat'] != $cat): $cat = $row['cat']; ?> </ul> <?php endif; ?> <li class="hs__item item"> <div class="hs__item__image__wrapper"><img class="hs__item__image" src="https://picsum.photos/id/103/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> <?php endforeach; ?>
@Ra1s, я четко показал, что я имею в виду. Не можете понять элементарный алгоритм, возьмите задачку попроще. --- Добавлено --- У вас нет таблицы categories. Вы дублируете поле cat в выборке (или выбираете что-то др. под тем же именем). Короче нифига не сечете, что делаете. Начните с основ.
@miketomlin, просто уже голова кругом идёт от объединения этих таблиц да ещё с массивом по разным категориям