【问题标题】:Putting all the days info in one cell, in dynamic table in employee schedule将所有日期信息放在一个单元格中,在员工日程表的动态表中
【发布时间】:2013-07-01 16:56:33
【问题描述】:

我有一张桌子,上面有每天的信息:

idDya | date | startHour | endHour | totalHours | name
-------------------------------------------------------
1       05/01   12:00       16:00       4         John
2       05/01   12:00       16:00       4         Marko
3       05/02   12:00       17:00       3         John
4       05/02   12:00       17:00       3         Peter
5       05/03   12:50       18:00       5         Peter

我有一个动态表:

<?php

    $sql = " SELECT * FROM days "; 

    $result = mysql_query($sql);

    while ($row = mysql_fetch_assoc($result)) {

    echo "<table  width='435' border='1' cborder='1' cellpadding='2' cellspacing='0' bordercolor='#666666' class='boldtable'>

    <tr>
    <td>".$row['idDya']."</td>
    <td>".$row['date ']."</td>
    <td>".$row['totalHours']."</td>
    <td>".$row['name']."</td>
    </tr>

    </table>";

    }
?>

问题:“如何设置表格的格式,这样我就有了一个动态表格,但每个单元格都适合组合该日期的信息”。

day        schedule
--------------------------------

05/01 |     John    12:00 -16:00     
            Marko   12:00 -16:00

--------------------------------

05/02 |     John    12:00 -16:00     
            Peter   12:00 -16:00

--------------------------------

etc...

【问题讨论】:

  • 你为什么要把它存储在一个表中?这听起来像是应该在应用程序端完成的事情。
  • 它看起来像一个用于跟踪员工工作时间的表格,他为什么不将其保存在数据库中?
  • 您的查询应该是SELECT * FROM DAYS ORDER BY Date, StartHour。然后在 PHP 中使用逻辑在这些天进行控制中断。请注意,如果您的 Date 列确实是一个显示 05/0105/02 等的字符串,那么这种方法将不起作用 - 但是如果日期是像这样存储。
  • 第一个表格单元格的行跨度?
  • 哦,我只是举了一个日期的例子,它不是实际的格式。格式为 1111-11-11。我同意 PlanTheldea 应该是应用程序端,php 但仍然是什么样的动态表格式?

标签: php mysql scheduled-tasks


【解决方案1】:

您可能会发现在 MySql 端使用 GROUP_CONCAT() 来打包和获取每天的详细信息很方便,以便在渲染页面时在 php 端进一步 explode()

SELECT date, GROUP_CONCAT(CONCAT_WS('|', name, startHour, endHour) ORDER BY name) schedule
  FROM days
 GROUP BY date

样本输出:

+------------+------------------------------------ ------------+ |日期 |时间表 | +------------+------------------------------------ ------------+ | 2013-05-01 |约翰|12:00:00|16:00:00,马尔科|12:00:00|16:00:00 | | 2013-05-02 |约翰|12:00:00|17:00:00,彼得|12:00:00|17:00:00 | | 2013-05-03 |彼得|12:50:00|18:00:00 | +------------+------------------------------------ ------------+

这里是SQLFiddle演示


下面是如何使用 PDO 在 php 中处理它

<?php
$db = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$sql = "SELECT date, GROUP_CONCAT(CONCAT_WS('|', name, startHour, endHour) ORDER BY name) schedule
          FROM days
         GROUP BY date";

$query = $db->prepare($sql);
$query->execute();
$rows = $query->fetchall(PDO::FETCH_ASSOC);

$query = null;
$db = null;
?>

<table width='435' border='1' cborder='1' cellpadding='2' cellspacing='0' bordercolor='#666666' class='boldtable'>
    <thead>
        <tr>
            <th>Day</th>
            <th>Schedule</th>
        </tr>
    </thead>
    <tbody>
<?php
    foreach($rows as $row) {
        echo "<tr>
              <td>{$row['date']}</td><td>";
        $schedule = explode(',', $row['schedule']);
        foreach($schedule as $details) {
            list($name, $start_hour, $end_hour) = explode('|', $details);
            echo "$name $start_hour-$end_hour<br>";
        }
        echo "</td></tr>";
    }
?>        
    </tbody>
</table>

样本输出:

【讨论】:

  • @Iznogud 有帮助吗?您需要更多帮助来解决您最初的问题吗?
  • 嗨,彼得,抱歉回复慢了。这正是我一直在寻找的。完美运行。我还是一个新手,我从你的代码中学到的是我应该用什么方法来解决这个问题。谢谢一百万!!!
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2021-04-02
  • 2018-04-05
相关资源
最近更新 更多