PHP - Вывод по категориям в цикле

249
06 октября 2017, 18:11

Вывожу из БД, логика примерно такая:

$STH = $DBH->query('SELECT id,name,image,link,categ from products');  
$STH->setFetchMode(PDO::FETCH_ASSOC);  
  while($row = $STH->fetch()) {  
    $content='<a href="product.php?link='.$row['link'].'"><div class="col-md-3 col-xs-12 col-sm-6 mainposter">'.
    '<div class="wrapp_mainposter_content">'.
    '<img src="img_tovar/'.$row['image'].'" class="mainblockimg"/>'.
    '<div class="mainposter_title">'.$row['name'].'</div>'.
    '</div></div></a>';
    if($row['categ']=='categ1'){ echo "<h2>Категория1</h2>".$content}
    if($row['categ']=='categ2'){ echo "<h2>Категория2</h2>".$content}
  }

Хочу вывести заголовок + товары, но разумеется так, как в цикле, заголовок выводится кучу раз, это можно, конечно, решить с помощью 2-ух отдельных запросов с where, но это как то не оптимально.

Answer 1

Самое тупое решение "в лоб":

<?php
$STH = $DBH->query('SELECT id,name,image,link,categ from products');
$STH->setFetchMode(PDO::FETCH_ASSOC);
$result = $STH->fetchAll();
?>
    <h2>Категория 1</h2>
<?php
foreach($result as $row) {
    if($row['categ']=='categ1'){
?>
        <a href="product.php?link=<?=$row['link']?>">
            <div class="col-md-3 col-xs-12 col-sm-6 mainposter">
                <div class="wrapp_mainposter_content">
                    <img src="img_tovar/<?=$row['image']?>" class="mainblockimg"/>
                    <div class="mainposter_title"><?=$row['name']?></div>
                    </div>
            </div>
        </a>
<?php
    }
}
?>
    <h2>Категория 2</h2>
<?php
foreach($result as $row) {
    if($row['categ']=='categ2'){
        ?>
        <a href="product.php?link=<?=$row['link']?>">
            <div class="col-md-3 col-xs-12 col-sm-6 mainposter">
                <div class="wrapp_mainposter_content">
                    <img src="img_tovar/<?=$row['image']?>" class="mainblockimg"/>
                    <div class="mainposter_title"><?=$row['name']?></div>
                </div>
            </div>
        </a>
        <?php
    }
}
?>
Answer 2

Как всегда, основную мысль уже обозначили в комментариях.

Идея: при прохождении в цикле сначала распихиваем в массивчик по категориям, а затем уже по этому (результирующему) массивчику выводим.

Единственное что скажу, раз Вы всё равно используете величайшее изобретение человечества (PDO), то почему бы не использовать и FETCH_GROUP:

$STH = $DBH->query('SELECT categ,id,name,image,link from products');
$data = $STH->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_ASSOC);
foreach($data as $categ => $c_data) {
    if($categ =='categ1'){ echo "<h2>Категория1</h2>"}
    if($categ =='categ2'){ echo "<h2>Категория2</h2>"}
    foreach($c_data as $row) {
        echo '<a href="product.php?link='.$row['link'].'">'.
            '<div class="col-md-3 col-xs-12 col-sm-6 mainposter">'.
            '<div class="wrapp_mainposter_content">'.
            '<img src="img_tovar/'.$row['image'].'" class="mainblockimg"/>'.
            '<div class="mainposter_title">'.$row['name'].'</div>'.
            '</div></div></a>';
    }
}

Остальное, про что пишут в комментах - это на любителя. Если проект еще на стадии зародыша - имеет смысл действительно подумать о шаблонизаторах, фреймворках и прочем, потому что "прикрутить потом" будет намного сложнее, чем сделать это сразу. Но это решать Вам.

Использовавшаяся для решения задачи информация:

ссылка1

ссылка2

READ ALSO
Мгновенные выплаты на сайте [требует правки]

Мгновенные выплаты на сайте [требует правки]

Уже несколько дней ищу способ организовать мгновенные выплаты на сайтеДелаю сайт на подобии https://skins

229
simplexml взять название бренда

simplexml взять название бренда

Добрый вечерТакая проблема есть товар в xml и в нем есть id категории и бренда - http://joxi

201
Обновление страницы после нажатие submit

Обновление страницы после нажатие submit

как отключить обновление страницы после отправки формы? ps

232
Написание и сохранение текста

Написание и сохранение текста

Предположим, что есть одностраничный сайт с полем для ввода, кнопкой "Отправить" и текстом снизу

221