Обновление для CodingBiz:
Я помещаю это в свой код:
for($i=1;$i<=$numRows;$i++) { $output .= '<tr>'; $row = $this->fetchAssoc($result); $colRow = $this->fetchAssoc($colResult); foreach($colRow as $colName) { $output .= "<td>".$row[$colName]."</td>"; } $output .= '</tr>'; }
на месте
for($i=1;$i<=$numRows;$i++) { $output .= '<tr>'; $row = $this->fetchAssoc($result); for($j=1;$j<=$colNumRows;$j++) { $colRow = $this->fetchAssoc($colResult); $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>"; } $output .= '</tr>'; }
Что-то не так с этим?
Оригинальное сообщение:
Я пишу функцию в классе PHP для отображения результатов запроса в таблице. Я сам не структурирую ни одну из таблиц, я хочу, чтобы все было сделано с использованием PHP. Вот мой код:
function allResults($table,$cols) { if(isset($cols)) { $query = "SELECT $cols FROM $table"; } else { $query = "SELECT * FROM $table"; } $result = $this->query($query); $numRows = $this->numRows($result); $colQuery ="SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='shareride' AND TABLE_NAME='$table'"; $colResult = $this->query($colQuery); $colNumRows = $this->numRows($colResult); $output = '<table class="allResults">'; $output .= '<tr>'; for($i=1;$i<=$colNumRows;$i++) { $colRow = $this->fetchAssoc($colResult); $output .= "<td>".$colRow["COLUMN_NAME"]."</td>"; } $output .= '</tr>'; for($i=1;$i<=$numRows;$i++) { $output .= '<tr>'; $row = $this->fetchAssoc($result); for($j=1;$j<=$colNumRows;$j++) { $colRow = $this->fetchAssoc($colResult); $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>"; } $output .= '</tr>'; } $output .= '</table>'; return $output; }
Если это неясно, query
относится к mysqli_query
, numRows
относится к mysqli_num_rows
, а fetchAssoc
относится к mysqli_fetch_assoc
. Имя базы данных «shareride».
Я знаю, что мне не хватает чего-то в этой строке:
$output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";
но я просто не знаю, что это. Прямо сейчас, я получаю все заголовки столбцов таблицы правильно, и я получаю правильное количество строк содержимого, но я просто не могу заполнить эти строки фактическими данными из базы данных.
Что мне не хватает? Любая помощь была бы высоко оценена!
Получить имена данных и столбцов из одного набора результатов
<?php $i = 0; $colNames = array(); $data = array(); while($row = ***_fetch_assoc($res)) //where $res is from the main query result not schema information { //get the column names into an array $colNames if($i == 0) //make sure this is done once { foreach($row as $colname => $val) $colNames[] = $colname; } //get the data into an array $data[] = $row; $i++; } ?>
ОБНОВЛЕНИЕ: Предлагается @YourCommonSense для замены вышеуказанного кода, и это сработало, просто и короче – ПУТЬ ПОЛУЧИТЬ КНОПКИ НАКЛОНА / МАССИВЫ КОЛОННЫ БЕЗ ОТКЛОНЕНИЯ ЧЕРЕЗ КАК Я ДОЛЖЕН
$data = array(); while($row = mysql_fetch_assoc($res)) { $data[] = $row; } $colNames = array_keys(reset($data))
Продолжение по-прежнему: печать таблицы
<table border="1"> <tr> <?php //print the header foreach($colNames as $colName) { echo "<th>$colName</th>"; } ?> </tr> <?php //print the rows foreach($data as $row) { echo "<tr>"; foreach($colNames as $colName) { echo "<td>".$row[$colName]."</td>"; } echo "</tr>"; } ?> </table>
Результат испытаний
Вы можете видеть, как я отделил извлечение данных от генерации таблицы. Теперь они зависят друг от друга, и вы можете протестировать генерацию таблицы без базы данных, заполнив массивы статическими данными
Вы также можете сделать их отдельными функциями.
$cols
– в конечном итоге это приведет к ошибкам и инъекциям. я бы попытался заменить часть данных чем-то вроде:
while($row = $this->fetchAssoc($colResult)) { echo "<tr>"; foreach($row as $value) { echo sprintf("<td>%s</td>",$value) } echo "</tr>"; }
я знаю, что это не правильный ответ, но действительно трудно прочитать этот код imho