@happysmile_hm

Как мне выводить из базы данных информацию по группам?

Привет всем не совсем уверен что правильно написал оглавление , но думаю взглянув на представленные мной скриншоты вы всё поймете

Я только недавно начал изучать программирование и первым же делом решил создать сайт телефонного справочника , но столкнулся с такой проблемой , при выводе данных из db при помощи foreach колонка department постоянно дублируется и повторяется перед каждым контактом . Я догадываюсь что решением проблемы может стать грамотно прописанный запрос , но вот как составить его я не могу понять.

У меня есть 5 таблицы в моей db .

1. filial_work | id | filial

2.department_work | id | department | department_email

3.position | id | position

4.number_work | id | number

5. contact_work | id | id_filial | id_department | id_position | full_name | email_user | id_number | tel_number

вот мой код выводящий информацию(не обращайте внимание на лёгкое несоответствие написанного кода и того как всё выглядит на скриншотах , изначально я решил просто отложить этот вопрос и занялся другими аспектами телефонного справочника )
function selectAll1 ($table1 , $table2 , $table3 , $table4 , $table5){
    global $pdo;
    $sql = "SELECT 
    t1.id,
    t1.full_name,
    t1.email_user,
    t1.tel_number,
    t2.filial,
    t3.department,
    t3.department_email,
    t4.position,
    t5.number
    FROM $table1 AS t1 INNER JOIN $table2 AS t2  ON t1. id_filial = t2.id 
    INNER JOIN $table3 AS t3 ON t1. id_department = t3.id
    INNER JOIN $table4 AS t4 ON t1. id_position = t4.id
    INNER JOIN $table5 AS t5 ON t1. id_number = t5.id ORDER BY `t2`.`filial` ASC , `t3`.`department` DESC ";
    $query = $pdo->prepare($sql);
    $query->execute();
    dbCheckError($query);
    return $query->fetchAll();
}


$postsContact = selectAll1('contact_work' , 'filial_work', 'department_work','position','number_work' );


<?php foreach($postsContact as $key => $contacts): ?>
                        <tr>
                        <td><?=$contacts['filial']?></td>
                        <td><?=$contacts['department']?><br><a href="#"><?=$contacts['department_email']?></a></td>
                        <td><?=$contacts['position'];?></td>
                        <td><?=$contacts['full_name'];?></td>
                        <td><a href="#"><?=$contacts['email_user'];?></a></td>
                        <td><?=$contacts['number'];?></td>
                        <td><?=$contacts['tel_number'];?></td>
                        <td><a href="workers/edit.php?id=<?=$contacts['id'];?>">Редактировать</a></td>
                        <td><a href="workers/edit.php?delite_id=<?=$contacts['id'];?>">Удалить</a></td>
                        </tr>
                    <?php endforeach; ?>

Вот что я получаю 668e45d0488c5774542325.jpeg

Вот как я хочу получать запрос 668e45e4a3112068450043.jpeg
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Я только недавно начал изучать программирование

Это очень похвально. Только ради бога, учите его по нормальным учебникам, а не по видеокурсам, которые делали неграмотные дети на мамкином ноутбуке.
Примеры говнокода

  • unction selectAll1 - это глупость и говнокод. У функции должно быть осмысленное имя
  • ($table1 , $table2 , $table3 , $table4 , $table5){ - это глупость и говнокод. Учитывая, что функция в любом случае уникальная для используемых таблиц, передавать их в качестве параметров имеет 0 смысла.
  • global $pdo; - это глупость и говнокод. Потом сами не будете знать, что откуда взялось. Все параметры надо передавать в функцию явно.
  • dbCheckError($query); - это глупость и говнокод. Специально проверять запрос на ошибки не нужно. Надо написать один общий обработчик ошибок для всего сайта и любых ошибок.
  • <?=$contacts['filial']?> - это говнокод и дыра в безопасности. В любых данных, выводимых в HTML, должны экранироваться спецсимволы HTML


Поскольку вы используете PDO, то можете сразу получить трехмерный массив, сгруппированный по одному полю
function listContactsByDepartment ($pdo){
    $sql = "SELECT 
    t3.department, -- обращаем внимание на эту строчку. Она должна быть первой
    t1.id,
    t1.full_name,
    t1.email_user,
    t1.tel_number,
    t2.filial,
    t3.department_email,
    t4.position,
    t5.number
    FROM contact_work AS t1 INNER JOIN filial_work AS t2  ON t1. id_filial = t2.id 
    INNER JOIN department_work AS t3 ON t1. id_department = t3.id
    INNER JOIN position AS t4 ON t1. id_position = t4.id
    INNER JOIN number_work AS t5 ON t1. id_number = t5.id
    ORDER BY `t2`.`filial` ASC , `t3`.`department` DESC ";
    return $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP); # Обращаем внимание на эту константу
}
$contacts = listContactsByDepartment ($pdo);

Из этой функции вы получите трехмерный массив, который выводится двумя вложенными циклами
<?php foreach($contacts as $department_title => $department_contacts): ?>
                      <tr>
                        <td colspan=10><?=htmlspecialchars($department_title) ?>
                      <tr>
    <?php foreach($department_contacts as $row): ?>
                      <tr>
                        <td><?=htmlspecialchars($row['filial']) ?></td>
                        ...
                      </tr>
    <?php endforeach ?>
<?php endforeach ?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы