繁体   English   中英

SQL组使用PHP命名为表头行

[英]SQL group names as table header rows using PHP

我正在尝试使用PHP输出动态表,如下所示:

Paul     56
Paul     6
Paul     78
Paul     34
Paul     76
Mark     56
Mark     5
Mark     34
Mark     87
Mark     23
Mark     765

基本上我想输出的是这样的:

<table>
<tr colspan="2">Name: Paul</tr>
<tr><td>56</td><td>Edit</td></tr>
<tr><td>6</td><td>Edit</td></tr>
<tr><td>78</td><td>Edit</td></tr>
<tr><td>34</td><td>Edit</td></tr>
<tr><td>76><td>Edit</td></tr>

<tr colspan="2">Name: Mark</tr>
<tr><td>56</td><td>Edit</td></tr>
<tr><td>5</td><td>Edit</td></tr>
<tr><td>34</td><td>Edit</td></tr>
<tr><td>87</td><td>Edit</td></tr>
<tr><td>23/td><td>Edit</td></tr>
<tr><td>765/td><td>Edit</td></tr>
</table>

到目前为止我的PHP代码是什么样的:

<?php
$name_holder = null;
for($i=0;$i<count($data);$i++) {
    if($name_holder != $data[$i]->name){
        $name_holder = $data[$i]->name;
        //not sure what to do here??
    }

    echo "<tr>";
    echo "<td align='left'>".$data[$i]->name."</td>";
    echo "<td align='left'>".$data[$i]->hour."</td>";
    echo "</tr>";
}
?>

SQL

SELECT name,hour FROM checkin_tbl GROUP BY name ORDER BY name ASC;

您无需在数据库级别对数据进行分组。 可以这样做,但是对于每个组,您需要另一个SELECT来读取相关数据,并且会导致过多的查询被发送到数据库。

因此,我选择使用直接查询来读取数据,这将是这样的:

SELECT name,hour FROM checkin_tbl ORDER BY name ASC;

我没有提供下面的数据库代码,因为不清楚你正在使用什么数据库(例如MySQL)或你正在使用什么接口(例如PDO)。 因此我使用数组模拟了一个数据源 - 我确信你可以用fetchAll()foreach()和行fetch()来交换它。

因此,尝试这样的事情:

<?php

// Data from your database
$rawData = [
    ['Paul', 56],
    ['Paul', 6],
    ['Mark', 56],
    ['Mark', 5],
];

// Let's reformat this
$out = [];
foreach ($rawData as $pair)
{
    $name = $pair[0];
    if (!isset($out[$name]))
    {
        $out[$name] = [];
    }

    // Pop the value on the list
    $out[$name][] = $pair[1];
}

// Use this to look at your structure
#print_r($out);

?>

<!-- Here's your rendering section -->

<?php foreach ($out as $name => $data): ?>
    <tr colspan="2"><td>Name: <?php echo htmlentities($name) ?></td></tr>

    <?php foreach ($data as $item): ?>
        <tr><td><?php echo htmlentities($item) ?></td><td>Edit</td></tr>
    <?php endforeach ?>
<?php endforeach ?>

我的策略是在模板之外尽可能地格式化数据 - 你的代码和另一个答案(在撰写本文时)在我看来是过度混合逻辑和布局,你需要将它们分开。

这就是我在渲染部分切换到打开/关闭PHP标签的原因:这是带有PHP片段的广泛HTML,需要动态输出。 如果您这样做,您将从IDE中的标记匹配和语法着色中受益。

我添加了htmlentities()以防止XSS。

看看期望的情况,绝对不需要GROUP BY。 实际上,这实际上阻碍了您显示给定人员的所有记录。 你最终会以每人一行结束,并填写该人的最后一条记录。

为了得到你想要的情况,剥去GROUP BY。 PHP解决方案可能是。

$name_holder = null;
for($i=0;$i<count($data);$i++) {
    if($name_holder != $data[$i]->name){
        $name_holder = $data[$i]->name;
        echo "<tr><td colspan='2'>Name: " . $name_holder . "</td></tr>"
    }

    echo "<tr>";
    echo "<td align='left'>".$data[$i]->hour."</td>";
    echo "<td align='left'>edit</td>";
    echo "</tr>";
}

你正在顺利找到正确的解决方案。

有关分组和您的问题的背景信息:

一个很好的解释在这里找到: http://www.tutorialspoint.com/sql/sql-group-by.htm :这是行不通的演示可以W3Schools的演示数据库上进行测试HTTP://www.w3schools。 COM / SQL / trysql.asp?文件名= trysql_select_groupby

所有记录:

SELECT CustomerId, ShipperId FROM [Orders] WHERE ShipperId = 1

分组:

SELECT CustomerId, ShipperId FROM [Orders] WHERE ShipperId = 1 GROUP BY ShipperId

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM