За последние 24 часа нас посетили 17202 программиста и 1584 робота. Сейчас ищут 1329 программистов ...

Рекурсивный запрос в таблицу на странице

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

Метки:
  1. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте.
    У меня есть запрос:
    PHP:
    1. $sql="with recursive cte (id, familia, imya, otchestvo, maiden_name, father) as (
    2.  select     id,
    3.             familia,imya,otchestvo,maiden_name,
    4.             father
    5.  from       personi
    6.  where      father = 669
    7.  union all
    8.  select     p.id,
    9.             p.familia,p.imya,p.otchestvo,p.maiden_name,
    10.             p.father
    11.  from       personi p
    12.  inner join cte
    13.          on p.father = cte.id
    14. )
    15. select * from cte";
    16. if($result = $conn->query($sql)){
    17.     foreach($result as $row){
    18.                   $id = $row['id'];
    19.                   $familia = $row['familia'];
    20.                   $maiden_name = $row['maiden_name'];
    21.                   $imya = $row['imya'];
    22.                   $otchestvo = $row['otchestvo'];
    23.     }
    24. }
    Возможно, и если да, то как, выгрузить этот запрос в таблицу.
    Я могу выгрузить в один столбец:
    Код (Text):
    1. <tr><td><?php echo $familia.' '.$imya.' '.$otchestvo;?></td></tr>
    а хотелось бы получить таблицу вроде этого:

    первый|второй|третий|четвертый|пятый
    прадед | дед | отец | сын | внук
    прадед | дед | отец | сын | внучка
    прадед | дед | отец | дочь | внучка
    прадед | дед | дядя | дочь
    прадед | дед | тетя | сын
    прадед | брат деда |
     
    #1 Анатолий37, 8 фев 2024
    Последнее редактирование модератором: 8 фев 2024
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день, Анатолий!
    Насколько я понял по запросу нет вопросов. Проблема с только получением таблицы.
    Ваша ошибка в том, что потерялось
    PHP:
    1.  while ($row = $result->fetch_array(MYSQLI_ASSOC))
    2.   {
    3.     foreach($row as $key => $val)
    Если последовательность элементов в $row совпадает с последовательностью столбцов таблицы, но не нужно выводить $id, то таблицу можно вывести так
    PHP:
    1. echo "<table border=1>";
    2. if($result = $conn->query($sql)){
    3.   while ($row = $result->fetch_array(MYSQLI_NUM))
    4.   {
    5.     echo "<tr>";
    6.     unset($row[0]); //убираем id
    7.     foreach($row as $val){
    8.       $cell = $val:$val:"&nbsp;";
    9.       echo <<<HTML
    10.       <td>$cell</td>
    11.       HTML;
    12.     }
    13.     echo "</tr>";
    14.   }
    15. }
    16. echo "</table>";
    Если нужно изменить последовательность, то так
    PHP:
    1. echo "<table border=1>";
    2. if($result = $conn->query($sql)){
    3.   while ($row = $result->fetch_array(MYSQLI_ASSOC))
    4.   {
    5.     foreach($row as $key => $val)
    6.       $$key = $val?$val:"&nbsp;";
    7.     echo <<<HTML
    8.     <tr>
    9.     <td>$familia</td>
    10.     <td>$maiden_name</td>
    11.     <td>$imya</td>
    12.     <td>$otchestvo</td>
    13.     </tr>
    14.     HTML;
    15.   }
    16. }
    17. echo "</table>";
    Удачи!
     
    Анатолий37 нравится это.
  3. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте! Спасибо за помощь!
    Попробовал применить Ваш код и у меня выдало ошибку:
    Parse error: syntax error, unexpected ':' in C:\Server
    Код (Text):
    1. $cell = $val:$val:"&nbsp;";

    Если я меняю
    Код (Text):
    1. $cell = $val?$val:"&nbsp;";
    ,
    то:
    Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Server\data\htdocs\
    Как это можно исправить?

     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    извините, знак вопроса, опечатка.
    T_ENCAPSED_AND_WHITESPACE можно исправить в редакторе убрав слева табуляции в строках между echo <<<HTML HTML;
    PHP:
    1. echo <<<HTML
    2. <td>$cell</td>
    3. HTML;
    4.  
    5. echo <<<HTML
    6. <tr>
    7. <td>$familia</td>
    8. <td>$maiden_name</td>
    9. <td>$imya</td>
    10. <td>$otchestvo</td>
    11. </tr>
    12. HTML;
     
    #4 Vladimir Kheifets, 8 фев 2024
    Последнее редактирование: 8 фев 2024
  5. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Не надо извинений, это я должен извиняться за свою тупость.
    Строка:
    Код (Text):
    1. $cell = $val:$val:"&nbsp;";
    выдает ошибку:
    Parse error: syntax error, unexpected ':' in C:\Server\d
    т.е. ругается на первый ":".
    Как это исправить?
     
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Код (Text):
    1. $cell = $val?$val:"&nbsp;";
     
  7. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Код (Text):
    1. $cell = $val?$val:"&nbsp;";
    так выдает такую ошибку:
    Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\Server\data
    Это же просто условный оператор. Не пойму в чем ошибка?
     
  8. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Ошибка не в этой строке. Повторю ответ.
    T_ENCAPSED_AND_WHITESPACE можно исправить в редакторе убрав слева табуляции в строках между echo <<<HTML и HTML;
    проверил. так работает без ошибок
    PHP:
    1. <?
    2. echo <<<HTML
    3.   <td>$cell</td>
    4. HTML;
    5.  
    6. echo <<<HTML
    7.   <tr>
    8.   <td>$familia</td>
    9.   <td>$maiden_name</td>
    10.   <td>$imya</td>
    11.   <td>$otchestvo</td>
    12.   </tr>
    13. HTML;
    14. ?>
     
    #8 Vladimir Kheifets, 8 фев 2024
    Последнее редактирование: 8 фев 2024
    Анатолий37 нравится это.
  9. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Еще раз, огромное Спасибо за то, что помогаете.
    Никогда бы не догадался, что надо убрать табуляцию.
    Есть одно НО. Я хотел получить таблицу такого вида:
    Код (Text):
    1. <tr>
    2.         <td>Прадед<br> </td>
    3.         <td>Дед  </td>
    4.         <td>Отец </td>
    5.         <td>Я </td>
    6.         <td>Сын</td>
    7.       </tr>
    8.       <tr>
    9.         <td>Прадед</td>
    10.         <td>Дед</td>
    11.         <td>Отец</td>
    12.         <td>Я</td>
    13.         <td>Дочь</td>
    14.       </tr>
    15.       <tr>
    16.         <td>Прадед</td>
    17.         <td>Дед</td>
    18.         <td>Отец</td>
    19.         <td>Брат</td>
    20.         <td>Племянница</td>
    21.       </tr>
    22.       <tr>
    23.         <td>Прадед</td>
    24.         <td>Дед</td>
    25.         <td>Отец</td>
    26.         <td>Брат</td>
    27.         <td>Племянник</td>
    28.       </tr>
    29.       <tr>
    30.         <td>Прадед</td>
    31.         <td>Дед</td>
    32.         <td>Отец</td>
    33.         <td>Сестра</td>
    34.         <td>Племянник1</td>
    35.       </tr>
    36.       <tr>
    37.         <td>Прадед</td>
    38.         <td>Дед </td>
    39.         <td>Отец</td>
    40.         <td>Сестра</td>
    41.         <td>Племянник2</td>
    42.       </tr>
    43.       <tr>
    44.         <td>Прадед</td>
    45.         <td>Дед</td>
    46.         <td>Дядя</td>
    47.         <td>Сестра1 </td>
    48.         <td>Племянник</td>
    49.       </tr>
    50.       <tr>
    51.         <td>Прадед</td>
    52.         <td>Дед</td>
    53.         <td>Дядя</td>
    54.         <td>Брат</td>
    55.         <td>Племянник1</td>
    56.       </tr>
    57.       <tr>
    58.         <td>Прадед</td>
    59.         <td>Брат</td>
    60.         <td>Сын брата деда</td>
    61.         <td>Внук брата деда</td>
    62.         <td></td>
    63.       </tr>
    64.       <tr>
    65.         <td>Прадед</td>
    66.         <td>Сестра деда</td>
    67.         <td>Дочь сестры деда</td>
    68.         <td>Внучка сестры деда</td>
    69.         <td></td>
    70.       </tr>
    Можно ли из рекурсивного запроса сделать такую таблицу?
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    425
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Вы не догадались про отступы потому, что в PHP не удачно сформулировано сообщение об ошибке.
    Вообще-то это полезный способ определения строк - heredoc-синтаксис
    см. https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc
    Вывести так таблицу можно, но для этого нужно разбираться со структурой данных и запросом
     
  11. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Спасибо за помощь, буду разбираться.
     
  12. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    87
    Симпатии:
    17
    Чтобы такое сделать, нужно указать № иеархии или условно уровня, как назвать уже разнцицы не имеет. При запросе order by `иеархия`

    Я что-то подобное делал для реферальной системы, но там всего 3 уровня вложенности.

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

    Пример ниже

    PHP:
    1. <?php
    2. // Семья
    3. $my_family =
    4. [
    5.     [
    6.         //-
    7.         'name' => 'Прадед',
    8.         'level' => 1,
    9.         //- Потомки
    10.         'descendants' =>
    11.         [
    12.             [
    13.                 'name' => 'Дед',
    14.                 'level' => 2,
    15.                 'descendants' =>
    16.                 [
    17.                     [
    18.                         'name' => 'Отец',
    19.                         'level' => 3,
    20.                         'descendants' => [
    21.                             ['name' => 'Сын', 'level' => 4],
    22.                             ['name' => 'Дочь', 'level' => 4, 'descendants' =>
    23.                              [
    24.                                 ['name' => 'Внучка', 'level' => 5]
    25.                              ]
    26.                             ]
    27.                         ]
    28.                     ],
    29.                     [
    30.                         'name' => 'Дядя',
    31.                         'level' => 3,
    32.                         'descendants' =>
    33.                         [
    34.                             ['name' => 'Дочь', 'level' => 4]
    35.                         ]
    36.                     ],
    37.                     [
    38.                         'name' => 'Тетя',
    39.                         'level' => 3,
    40.                         'descendants' =>
    41.                         [
    42.                             ['name' => 'Сын', 'level' => 4]
    43.                         ]
    44.                     ]
    45.                 ]
    46.             ],
    47.             [
    48.                 'name' => 'Брат деда',
    49.                 'level' => 2,
    50.                 // Потомки деда, если надо здесь
    51.             ]
    52.         ]
    53.     ],
    54.     // Другие ветви семьи, если надобно
    55. ];
    56.  
    57.  
    58. // Добавить члена семьи в таблицу
    59. function add_femily(&$table, $member, $level)
    60. {
    61.     // Если для данного уровня еще не создана строка, создаем ее
    62.     if ( !isset($table[$level] ) )
    63.     {
    64.         $table[$level] = [];
    65.     }
    66.  
    67.     // Добавляем имя члена семьи в соответствующий уровень
    68.     $table[$level][] = $member['name'];
    69.  
    70.     // Если у члена семьи есть потомки, рекурсивно вызываем функцию для каждого из них
    71.     if  ( isset( $member['descendants'] ) )
    72.     {
    73.         foreach ($member['descendants'] as $d)
    74.         {
    75.             add_femily($table, $d, $level + 1);
    76.         }
    77.     }
    78. }
    79.  
    80. // Показать дерево членов семьи
    81. function show_tree( $my_family )
    82. {
    83.     $html  = '';
    84.     $table = []; // Массив для хранения информации об уровнях семейного дерева
    85.  
    86.  
    87.     // Строим таблицу, начиная с первого члена семьи (корня семейного дерева)
    88.     foreach ($my_family as $f)
    89.     {
    90.         add_femily($table, $f, 0);
    91.     }
    92.  
    93.     // Рисуем табличку
    94.     $html .= '<table border="1">';
    95.     foreach ($table as $row)
    96.     {
    97.         $html .= '<tr>';
    98.         foreach ($row as $name)
    99.         {
    100.             $html .= '<td>' . htmlspecialchars($name) . '</td>';
    101.         }
    102.         $html .= '</tr>';
    103.     }
    104.     $html .= '</table>';
    105.  
    106.     return $html;
    107. }
    108.  
    109.  
    110.  
    111. print show_tree( $my_family );
     
  13. Анатолий37

    Анатолий37 Новичок

    С нами с:
    8 фев 2024
    Сообщения:
    7
    Симпатии:
    0
    Огромнейшее СПАСИБО !!!!!!!!!