【问题标题】:How to generate HTML table based on group by?如何根据 group by 生成 HTML 表格?
【发布时间】:2017-07-10 14:52:03
【问题描述】:

我正在尝试创建非常简单的时间跟踪应用程序,数据库中只有 3 个值:descriptiontime-spentdate需要按日期对结果进行分组并生成 HTML 表格。

例如:

今天(10.07)这个日期我在数据库中有 3 条记录,我需要为这个日期生成 HTML 表。

Tommorow(11.07) 当我使用新日期创建新记录时 - 它会创建新的 HTML 表格。

我有很多带有特定日期的 HTML 表格。

(HTML 表格为自己的日期)。

那么如何按日期分组以及如何生成HTML表格呢?

下面的截图反映了我想要实现的目标:

下面是我的代码:

function getLogs( $con ) {
  $stmt = $con->prepare( "SELECT * FROM timelogsapp GROUP BY DATE ORDER BY date DESC" );
  $stmt->execute();
  $result = $stmt->fetchAll();
  foreach( $result as $row ) {
    echo '<table class="list-table">';
    echo '<thead>';
    echo '<span class="date">';
    echo datetime();
    echo '</span>';
    echo '<tr>';
    echo '<th>Description</th>';
    echo '<th>Time</th>';
    echo '<th>Date</th>';
    echo '</tr>';
    echo '</thead>';
    echo '<tbody>';
    echo '<tr>';
    echo '<td>' . $row['description'] . '</td>';
    echo '<td>' . $row['time'] . '</td>';
    echo '<td>' . $row['date'] . '</td>';
    echo '</tr>';
    echo '</tbody>';
    echo '</table>';
  }
}

【问题讨论】:

  • 从循环中移除 table 和 head 标签。仅在表格行上循环。

标签: php html sql html-table


【解决方案1】:

您可以创建一个 SQL WHERE,日期在所需范围内。所以你说你想成为今天,它看起来像这样:

更新

这应该会创建多个查询,您可以在 WHERE 子句中添加更多查询,以获取自定义日期,我希望这能让您了解可以做什么。

每条记录都将创建它的唯一表,因为它们位于 foreach 子句中。

<?php

$today = date('d.m');
$today_query = "SELECT * FROM timelogsapp WHERE date = $today DESC";

$yesterday = date('d.m', time() - 60 * 60 * 24);
$yesterday_query = "SELECT * FROM timelogsapp WHERE date = $yesterday DESC";

$custom = "";
if (isset($_POST['date']))
{
    $custom = $_POST['date'];
}
$custom_query = "SELECT * FROM timelogsapp WHERE date = $custom DESC";

$tom = new DateTime('tomorrow');
$tomorrow = $tom->format('d.m');
$tomorrow_query = "SELECT * FROM timelogsapp WHERE date = $tomorrow DESC";


function getLogs($con){
    $stmt = $con->prepare("SELECT * FROM timelogsapp WHERE date = $today AND date = $yesterday AND date = $custom DESC");
    $stmt->execute();
    $result = $stmt->fetchAll();
    foreach($result as $row) {
        echo '<table class="list-table">';
            echo '<thead>';
                echo '<span class="date">';
                    echo datetime();
                echo '</span>';
                echo '<tr>';
                    echo '<th>Description</th>';
                    echo '<th>Time</th>';
                    echo '<th>Date</th>';
                echo '</tr>';
            echo '</thead>';
            echo '<tbody>';
                echo '<tr>';
                    echo '<td>'.$row['description'].'</td>';
                    echo '<td>'.$row['time'].'</td>';
                    echo '<td>'.$row['date'].'</td>';
                echo '</tr>';
            echo '</tbody>';
        echo '</table>';
    }
}
?>

当然,您可以通过使用一些 PHP 来使其更具动态性。但这将从timelogsapp 中选择日期等于10.07 的所有记录。然后按降序显示。

【讨论】:

  • 您并没有真正回答我关于如何生成 html 表的问题。 :) 我可以用 WHERE DATE(date) = CURDATE() 得到今天的日期
  • 什么意思?您需要如何生成 html 表?一个用于今天、明天和其他任何日期?
  • 今天、昨天和前几天。看看上面的图片。 :)
  • 让我知道更新后的答案是否有效......我猜这就是你要找的
  • 这看起来更符合我的需要,但我收到此错误 - 注意:未定义变量:all_dates in ,致命错误:未捕获 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1065 查询是空:
【解决方案2】:

我设法达到了我一直在寻找的结果。

 // getting all dates from database with limit
$all_dates_query = "SELECT * FROM timelogsapp GROUP BY date(date) ORDER BY date DESC LIMIT $limit OFFSET $offset";
$stmt = $con->prepare($all_dates_query);
$stmt->execute();
$all_dates = $stmt->fetchAll();

function getLogs($con, $all_dates)
{
    foreach ($all_dates as $row) {
        $this_date = $row['date'];
        $all_dates = "SELECT * FROM timelogsapp WHERE date(date) = date('$this_date') ORDER BY date DESC"; //getting all logs for current date
        $stmt = $con->prepare($all_dates);
        $stmt->execute();
        $result = $stmt->fetchAll();
        //generating html table with logs
        echo '<table class="list-table">';
        echo '<thead>';
        echo '<span class="date">';
        echo datetime($this_date);
        echo '</span>';
        echo '<tr>';
        echo '<th>Description</th>';
        echo '<th>Time</th>';
        echo '<th>Date</th>';
        echo '</tr>';
        echo '</thead>';
        echo '<tbody>';
        foreach ($result as $row) {
            echo '<tr>';
            echo '<td>'.$row['description'].'</td>';
            echo '<td>'.$row['time'].'</td>';
            echo '<td>'.date('d.m.Y H:i', strtotime($row['date'])).'</td>';
            echo '</tr>';
        }
        echo '</tbody>';
        echo '</table>';
    }
}

【讨论】:

  • 研究人员不应使用此答案的大部分内容。应尽可能避免迭代查询。准备好的语句不应该是循环内的prepare()d,它们应该只声明一次并在循环中执行一次或多次。您没有将值绑定到 stmt,而是通过将变量写入 sql 来引入漏洞/不稳定性。 fetchAll() 不应在同一层中迭代。如果迭代完整的结果集,不要全部提取,而是进行迭代提取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2020-09-18
  • 2017-07-26
  • 1970-01-01
  • 2017-08-11
  • 2021-02-26
相关资源
最近更新 更多