Здравствуйте. У меня есть запрос: PHP: $sql="with recursive cte (id, familia, imya, otchestvo, maiden_name, father) as ( select id, familia,imya,otchestvo,maiden_name, father from personi where father = 669 union all select p.id, p.familia,p.imya,p.otchestvo,p.maiden_name, p.father from personi p inner join cte on p.father = cte.id ) select * from cte"; if($result = $conn->query($sql)){ foreach($result as $row){ $id = $row['id']; $familia = $row['familia']; $maiden_name = $row['maiden_name']; $imya = $row['imya']; $otchestvo = $row['otchestvo']; } } Возможно, и если да, то как, выгрузить этот запрос в таблицу. Я могу выгрузить в один столбец: Код (Text): <tr><td><?php echo $familia.' '.$imya.' '.$otchestvo;?></td></tr> а хотелось бы получить таблицу вроде этого: первый|второй|третий|четвертый|пятый прадед | дед | отец | сын | внук прадед | дед | отец | сын | внучка прадед | дед | отец | дочь | внучка прадед | дед | дядя | дочь прадед | дед | тетя | сын прадед | брат деда |
Добрый день, Анатолий! Насколько я понял по запросу нет вопросов. Проблема с только получением таблицы. Ваша ошибка в том, что потерялось PHP: while ($row = $result->fetch_array(MYSQLI_ASSOC)) { foreach($row as $key => $val) Если последовательность элементов в $row совпадает с последовательностью столбцов таблицы, но не нужно выводить $id, то таблицу можно вывести так PHP: echo "<table border=1>"; if($result = $conn->query($sql)){ while ($row = $result->fetch_array(MYSQLI_NUM)) { echo "<tr>"; unset($row[0]); //убираем id foreach($row as $val){ $cell = $val:$val:" "; echo <<<HTML <td>$cell</td> HTML; } echo "</tr>"; } } echo "</table>"; Если нужно изменить последовательность, то так PHP: echo "<table border=1>"; if($result = $conn->query($sql)){ while ($row = $result->fetch_array(MYSQLI_ASSOC)) { foreach($row as $key => $val) $$key = $val?$val:" "; echo <<<HTML <tr> <td>$familia</td> <td>$maiden_name</td> <td>$imya</td> <td>$otchestvo</td> </tr> HTML; } } echo "</table>"; Удачи!
Здравствуйте! Спасибо за помощь! Попробовал применить Ваш код и у меня выдало ошибку: Parse error: syntax error, unexpected ':' in C:\Server Код (Text): $cell = $val:$val:" "; Если я меняю Код (Text): $cell = $val?$val:" "; , то: 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\ Как это можно исправить?
извините, знак вопроса, опечатка. T_ENCAPSED_AND_WHITESPACE можно исправить в редакторе убрав слева табуляции в строках между echo <<<HTML HTML; PHP: echo <<<HTML <td>$cell</td> HTML; echo <<<HTML <tr> <td>$familia</td> <td>$maiden_name</td> <td>$imya</td> <td>$otchestvo</td> </tr> HTML;
Не надо извинений, это я должен извиняться за свою тупость. Строка: Код (Text): $cell = $val:$val:" "; выдает ошибку: Parse error: syntax error, unexpected ':' in C:\Server\d т.е. ругается на первый ":". Как это исправить?
Код (Text): $cell = $val?$val:" "; так выдает такую ошибку: 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 Это же просто условный оператор. Не пойму в чем ошибка?
Ошибка не в этой строке. Повторю ответ. T_ENCAPSED_AND_WHITESPACE можно исправить в редакторе убрав слева табуляции в строках между echo <<<HTML и HTML; проверил. так работает без ошибок PHP: <? echo <<<HTML <td>$cell</td> HTML; echo <<<HTML <tr> <td>$familia</td> <td>$maiden_name</td> <td>$imya</td> <td>$otchestvo</td> </tr> HTML; ?>
Еще раз, огромное Спасибо за то, что помогаете. Никогда бы не догадался, что надо убрать табуляцию. Есть одно НО. Я хотел получить таблицу такого вида: Код (Text): <tr> <td>Прадед<br> </td> <td>Дед </td> <td>Отец </td> <td>Я </td> <td>Сын</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Отец</td> <td>Я</td> <td>Дочь</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Отец</td> <td>Брат</td> <td>Племянница</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Отец</td> <td>Брат</td> <td>Племянник</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Отец</td> <td>Сестра</td> <td>Племянник1</td> </tr> <tr> <td>Прадед</td> <td>Дед </td> <td>Отец</td> <td>Сестра</td> <td>Племянник2</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Дядя</td> <td>Сестра1 </td> <td>Племянник</td> </tr> <tr> <td>Прадед</td> <td>Дед</td> <td>Дядя</td> <td>Брат</td> <td>Племянник1</td> </tr> <tr> <td>Прадед</td> <td>Брат</td> <td>Сын брата деда</td> <td>Внук брата деда</td> <td></td> </tr> <tr> <td>Прадед</td> <td>Сестра деда</td> <td>Дочь сестры деда</td> <td>Внучка сестры деда</td> <td></td> </tr> Можно ли из рекурсивного запроса сделать такую таблицу?
Вы не догадались про отступы потому, что в PHP не удачно сформулировано сообщение об ошибке. Вообще-то это полезный способ определения строк - heredoc-синтаксис см. https://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.heredoc Вывести так таблицу можно, но для этого нужно разбираться со структурой данных и запросом
Чтобы такое сделать, нужно указать № иеархии или условно уровня, как назвать уже разнцицы не имеет. При запросе order by `иеархия` Я что-то подобное делал для реферальной системы, но там всего 3 уровня вложенности. Получается, что каждый будет иметь своих потомков и строить таблицу (вывод на экран) будет гораздо проще. Пример ниже PHP: <?php // Семья $my_family = [ [ //- 'name' => 'Прадед', 'level' => 1, //- Потомки 'descendants' => [ [ 'name' => 'Дед', 'level' => 2, 'descendants' => [ [ 'name' => 'Отец', 'level' => 3, 'descendants' => [ ['name' => 'Сын', 'level' => 4], ['name' => 'Дочь', 'level' => 4, 'descendants' => [ ['name' => 'Внучка', 'level' => 5] ] ] ] ], [ 'name' => 'Дядя', 'level' => 3, 'descendants' => [ ['name' => 'Дочь', 'level' => 4] ] ], [ 'name' => 'Тетя', 'level' => 3, 'descendants' => [ ['name' => 'Сын', 'level' => 4] ] ] ] ], [ 'name' => 'Брат деда', 'level' => 2, // Потомки деда, если надо здесь ] ] ], // Другие ветви семьи, если надобно ]; // Добавить члена семьи в таблицу function add_femily(&$table, $member, $level) { // Если для данного уровня еще не создана строка, создаем ее if ( !isset($table[$level] ) ) { $table[$level] = []; } // Добавляем имя члена семьи в соответствующий уровень $table[$level][] = $member['name']; // Если у члена семьи есть потомки, рекурсивно вызываем функцию для каждого из них if ( isset( $member['descendants'] ) ) { foreach ($member['descendants'] as $d) { add_femily($table, $d, $level + 1); } } } // Показать дерево членов семьи function show_tree( $my_family ) { $html = ''; $table = []; // Массив для хранения информации об уровнях семейного дерева // Строим таблицу, начиная с первого члена семьи (корня семейного дерева) foreach ($my_family as $f) { add_femily($table, $f, 0); } // Рисуем табличку $html .= '<table border="1">'; foreach ($table as $row) { $html .= '<tr>'; foreach ($row as $name) { $html .= '<td>' . htmlspecialchars($name) . '</td>'; } $html .= '</tr>'; } $html .= '</table>'; return $html; } print show_tree( $my_family );