PHP динамическая HTML-таблица с использованием SQL

#php #html #sql

#php #HTML #sql

Вопрос:

Предыстория

Я использую приведенный ниже код для создания HTML-таблицы на основе результатов SQL.

Код

   $stid = oci_parse($conn, "

    SELECT *
    FROM
    (
     SELECT   orders.order_no, orders.porder_no, orders.date, order_totals.value
     FROM     orders, order_totals
     WHERE    orders.order_no = order_totals.order_no
     AND      orders.account_no = '" . $_SESSION['session_account'] . "'
     ORDER BY orders.order_no DESC
    )
    WHERE ROWNUM <= 15

  ");
  oci_execute($stid);

  echo "<table class='table'>
        <thread>
        <tr>
        <th>Order No</th>
        <th>Purchase Order No</th>
        <th>Date</th>
        <th>Value</th>
        </tr>
        </thread>
        <tbody>";

  while ($row = oci_fetch_array($stid, OCI_NUM)) {
    echo "<tr>";
    echo '<td><a href="view.php?id=' . $row['0'] . '">' . $row['0'] . '</a></td>';
    echo "<td>" . $row['1'] . "</td>";
    echo "<td>" . $row['2'] . "</td>";
    echo "<td>" . $row['3'] . "</td>";
    echo "</tr>";
    unset($row);
  }

  echo "</tbody>
        </table>";
 

Вопрос

Можно ли сделать часть генерации HTML-таблицы в коде более динамичной, чтобы, если мне нужно добавить дополнительный столбец, например, я мог просто исправить SQL-часть в коде?

У меня была идея установить заголовки столбцов, используя AS в SQL, и я могу изменить SQL, чтобы использовать AS , чтобы показать реальные заголовки столбцов, которые я хочу, например

 SELECT orders.order_no    AS "Order No"
,      orders.porder_no   AS "Purchase Order No"
,      orders.date        AS "Date"
,      order_totals.value AS "Total"
 

но как насчет части таблицы HTML, есть ли какой-нибудь способ просто динамически печатать все столбцы и строки, например, возможно, создать функцию printTable , которая будет обрабатывать любую таблицу?

Ответ №1:

Переменная $row — это массив, поэтому вы также можете перебирать его. Поскольку вы хотите обработать свое первое поле по-другому, запишите его перед циклом и запустите цикл с 1.

 while ($row = oci_fetch_array($stid, OCI_NUM)) {
    echo "<tr>";
    echo '<td><a href="view.php?id=' . $row[0] . '">' . $row[0] . '</a></td>';
    for ( $ii = 1; $ii < count($row); $ii   ) {
        echo "<td>" . $row[$ii] . "</td>";
    }
    echo "</tr>";
}
 

Я не знаю, для чего был unset($row), поэтому я оставил его.

Комментарии:

1. Спасибо! Можно ли также записать заголовки столбцов из SQL?

Ответ №2:

Вы можете использовать:

 SELECT * FROM {TABLENAME}
 

Затем извлеките массив.
Вы можете получить данные с $row['{FIELDNAME}']

Ответ №3:

Вы можете использовать двойной цикл:

 $results = $PDO->fetchAll(PDO::FETCH_ASSOC); // here is all columns and rows from db query.

echo '<table><tr>';

// loop only first row to get header
foreach ($results[0] as $header => $value) {
   echo "<th>{$header}</th>"
}

echo '</tr>';

// loop all rows
foreach ($results as $row) {
   echo '<tr>';
   // and loop any number of columns
   foreach ($row as $cellName => $cell) {

      // If you have only one special case, than use if statement
      switch ($cellName) {
          case 'order_no':
               echo "<td><a href='http://example.com/getOrder?id={$cell}'>{$cell}</a></td>";
               break;
          default: echo "<td>{$cell}</td>";
      }
   }
   echo '</tr>';
}
echo '</table>';