За последние 24 часа нас посетили 22504 программиста и 1141 робот. Сейчас ищут 800 программистов ...

Проблема вывести по три колонки из двух таблиц БД

Тема в разделе "PHP для новичков", создана пользователем star112, 8 май 2021.

  1. star112

    star112 Новичок

    С нами с:
    8 май 2021
    Сообщения:
    6
    Симпатии:
    0
    Всем доброго времени суток!
    Прошу помощи в следующей задаче:
    Есть две таблицы в БД "groups" и "hodo1". В таблице groups находятся заголовки для будущких колонок таблицы. У groups есть строки в БД category_id(auto increment) и name(название группы).
    В таблице hodo1 есть link(auto_increment) category_id(сюда вписывается значение category_id из groups)
    name и url(для создания href, имя и ссылка).
    В настоящее время есть 19 групп и к каждой группе принадлежит от 20 до 70 ссылок(сортировка по category_id) в таблице hodo1.
    Моя задача компактно отобразить на web странице таблицу,где в ряду таблицы будет по 3 колонки. Т.е.
    заголовок 1,2,3 из таблицы groups и все линки, которые есть в hodo1 с соответсвующим category_id=1,2,3. Далее пойдет вторая таблица с тремя следующими заголовками и всеми линками(category_id 4,5,6). Прикладываю код, который работает без ошибок, однако он выводит все столбцы в один ряд. Никак не могу понять, как наложить правильный цикл так, чтобы выводилось именно по 3 столбца в один ряд до тех пор, пока количество строк groups существуют.
    Заранее спасибо!

    PHP:
    1.  <?php
    2. $i=0;
    3. $cat_id_groups = array();
    4. $conn = mysqli_connect($servername, $username, $password, $database);
    5. $result = $conn->query("SELECT name FROM groups");
    6. $for_groups="SELECT category_id FROM groups";
    7. $cat_ids= mysqli_query($conn, $for_groups);
    8. $counter=mysqli_num_rows($cat_ids);
    9. while($cat_id = mysqli_fetch_assoc($cat_ids)) {
    10.     $category_id_groups = $cat_id['category_id'];
    11.  
    12.     $cat_id_groups[$i] = $category_id_groups;
    13.     $i++;
    14. }
    15. echo "<table cols=3 border=0 cellspacing=0 cellpadding=0 width=1000";
    16. echo "<tr>";
    17. while (list($name) = $result->fetch_array()) {
    18.     echo
    19.            "  <td>$name</td>\n" ;
    20. }
    21. echo "</tr><tr>";
    22.  
    23. for($k=0;$k<$counter;$k++) {
    24. $main="SELECT * FROM hodo1 WHERE category_id=$cat_id_groups[$k] ORDER BY sort";
    25. $result1= mysqli_query($conn, $main);
    26. echo "<td>";
    27. while($row = mysqli_fetch_row($result1)){  
    28.  
    29. echo "<a href=$row[1]>$row[3]</a><br>";
    30.  
    31. }
    32.  
    33. }
    34. echo "</td></tr>";
    35. echo "</table>";
    36.  
    37.  
    38. ?>
     
  2. star112

    star112 Новичок

    С нами с:
    8 май 2021
    Сообщения:
    6
    Симпатии:
    0
    Добрый вечер!
    Спустя время вновь вернулся к этой задаче и выполнил. Оставлю здесь код, вдруг кому пригодится.
    Сделал 2 функции. Одна выводит имя группы из таблицы groups. Вторая функция выводит URL и его имя из таблицы hodo1.

    Далее загнал в массив все category_id из таблицы groups и на их основании через циклы сделал таблицу, которая выводит по три колонки до тех пор, пока цикл не превысит количества всех строк в таблице groups, деленных на три(так как по 3 колонки выводит). Также использовал ceil, чтобы округление шло в бОльшую сторону, иначе последние колонки код бы не вывел. Да, пришлось заглушить вывод ошибок, так как бывает ситуация, что в последнеем выводе есть только одна колонка, которую тоже нужно вывести. При такой ситуации в код вбрасывается два несуществующих в БД category_id и вылезает ошибка.

    P.S. Если кто сможет посоветовать, что можно подправить, то буду очень признателен.

    PHP:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.  
    5. <meta charset="utf-8">
    6. </head>
    7. <body>
    8. <?php
    9. $servername = "localhost";
    10. $database = "hodo";
    11. $username = "root";
    12. $password = "";
    13. $conn = mysqli_connect($servername, $username, $password, $database);
    14. ini_set('display_errors', 0);
    15.  
    16. function groups_id($category_id) {
    17. $servername = "localhost";
    18. $database = "hodo";
    19. $username = "root";
    20. $password = "";
    21. $conn = mysqli_connect($servername, $username, $password, $database);
    22. $groups= "SELECT * FROM groups WHERE category_id=$category_id";
    23. $groups_res= mysqli_query($conn, $groups);
    24. while($row = mysqli_fetch_assoc($groups_res)) {
    25.     echo $row['name'];
    26.     }
    27. }
    28.  
    29. function links_id($category_id) {
    30. $servername = "localhost";
    31. $database = "hodo";
    32. $username = "root";
    33. $password = "";
    34. $conn = mysqli_connect($servername, $username, $password, $database);
    35. $links= "SELECT * FROM hodo1 WHERE category_id=$category_id ORDER BY sort";
    36. $links_res= mysqli_query($conn, $links);
    37. while($lingid= mysqli_fetch_assoc($links_res)) {
    38.     echo "<a href=$lingid[url]>$lingid[name]</a><br>";
    39. }
    40. }
    41. $groups_sum= "SELECT category_id FROM groups ORDER BY sort";
    42. $groups_all= mysqli_query($conn, $groups_sum);
    43. $all=mysqli_num_rows($groups_all);
    44. $array = Array();
    45. while($numbers= mysqli_fetch_assoc($groups_all)) {
    46.     $array[]=$numbers['category_id'];
    47. }
    48.  
    49.  
    50.  
    51. $a=0;$b=2;
    52. for($d=1;$d<=ceil($all/3);$d++) {
    53. echo "<table><tr>";
    54. for($i=$a;$i<=$b;$i++) {
    55. echo "<td>";
    56. echo groups_id($array[$i]);
    57. echo "</td>";
    58. }
    59. echo "</tr><tr>";
    60.  
    61. for($k=$a;$k<=$b;$k++) {
    62.     echo "<td>";
    63. echo links_id($array[$k]);
    64. echo "</td>";
    65. }
    66. echo "</tr>";
    67. echo "</table>";
    68. $a=$a+3; $b=$b+3;
    69. }
    70.  
    71. ?>
    72. </body>
    73. </html>
     
  3. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вы зашли не с той стороны.
    Покажите сами таблицы и пример того как оно должно выглядеть в HTML.
     
  4. star112

    star112 Новичок

    С нами с:
    8 май 2021
    Сообщения:
    6
    Симпатии:
    0
    Добрый день,
    Таблица groups: category_id(INT,PK,AI), sort(INT,NN), name(varchar)
    Таблица hodo1: link(INT,PK,AI), category_id(INT), sort(INT,NN), name(varchar), url(varchar)

    Пример таблицы groups:
    category_id sort name
    1 1 Abisaatjad1
    2 2 Abisaatjad2
    3 3 Abisaatjad3
    4 4 Abisaatjad4
    5 5 Abisaatjad5
    6 6 Abisaatjad6

    Пример таблицы hodo1:
    link category_id sort name url
    2 1 2 link1 http://
    3 1 3 link2 http://
    4 2 4 link3 http://
    5 2 5 link4 http://
    6 3 7 link5 http://
    7 3 8 link6 http://
    8 1 4 link7 http://
    9 1 5 link8 http://
    10 3 9 link9 http://

    Как это работает с точки зрения пользователя(добавление,замена, удаление происходит не в БД, а на страничках php). Создается новая группа, AI присваивает новый category_id. После создаются линки в таблице hodo1, где category_id переносится из таблицы groups конкретной группы в таблицу hodo1(на этом основана связка, чтобы потом вытащить группу и все линки, принадлежащие к группе). sort в обеих таблицах используется для того, чтобы пользователь сам мог выбрать,в каком конкретном месте будет отображаться группа и в какой последовательности будут висеть сами линки для группы.
    В настоящей таблице порядка 40 групп и около 600 линков, поэтому менять логику таблиц достаточно сложно. Пример(без стилей):
    upload_2021-8-1_10-45-29.png
     
  5. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Попробуйте сначала вот такой запрос

    Код (Text):
    1. SELECT *
    2. FROM `groups`
    3. JOIN `hodo1`
    4. USING ( `category_id` )
    5. ORDER BY `groups`.`name` ASC
     
  6. star112

    star112 Новичок

    С нами с:
    8 май 2021
    Сообщения:
    6
    Симпатии:
    0

    Огромное спасибо! Про JOIN я, честно говоря, просто не знал...От слова совсем:) Теперь смогу еще лучше оптимизировать.
    P.S. Первый вариант вывода из БД был таков, что я к каждой группе и линкам делал отдельный запрос...код получился на 2000+ строк:)
     
  7. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Это только SQL.
    Отладьте его в phpMyAdmin, добившись именно той выдачи, которая требуется.
    Почитайте про объединения таблиц и выборок, сортировки, группировки...
    И только после этого переходите к PHP.
    Там у вас тоже есть что оптимизировать.
    Получите выборку в массив и обращайтесь с ним в форум.