在表格中显示数据的最佳方式

时间:2013-06-26 22:31:42

标签: php mysql

稍稍偏离我的舒适区,我希望有人可以解释实现我需要的最佳方式。

这是一个非常简单的员工出勤系统。

员工表包括员工的姓名。

出勤表包括当天工作班次的日期和类型(全日/半日/半日)。

我现在想要做的是创建一个报告作为一个表格,显示所有员工在两个日期(支付期)之间的出勤率。

我认为第一列应该是员工姓名,然后后续列将以两个日期之间的每个日期(start_date和end_date)为首,然后我想要填充表的其余部分。一名工作人员在特定日期工作。

所以,它看起来像这样:

     Name     |  2013-05-26  |   2013-05-27   |   etc
     -------------------- ---------------------------
     John     |     full     |      half      |
     Mary     |     off      |      full      |
     Peter    |     half     |      full      |

以下查询为我提供了所有数据:

SELECT a.id, first_name, last_name, attDate, staff_id, att, late
FROM staff as a LEFT OUTER JOIN staff_attendance AS b
  ON a.id = b.staff_id 
    AND b.`attDate` >= '2013-05-26' 
    AND  b.`attDate` <= '2013-06-27' 
ORDER BY last_name, attDate;

基本上是:

    id  |   first_name   | last_name |  attDate    | staff_id | att   |  late
    ------------------------------------------------------------------------
    1   |     John       |    smith  | 2013-05-26  |     1    | full  |    0
    1   |     John       |    smith  | 2013-05-27  |     1    | half  |    0
    2   |     Mary       |    Jones  | 2013-05-26  |     2    | off   |    0
    2   |     Mary       |    Jones  | 2013-05-27  |     2    | full  |    0
    3   |     Peter      |    Doe    | 2013-05-26  |     3    | half  |    0
    3   |     Peter      |    Doe    | 2013-05-26  |     3    | full  |    0

正如您所看到的,我拥有所有数据,我根本不知道如何将其纳入表中。

非常欢迎任何想法或建议。

非常感谢

格雷姆

根据dev-null-dweller的建议,我有以下代码:

    $dbh = new PDO("mysql:host=$hostname;dbname=web14-fresh", $username, $password);
    $sql = "SELECT a.id, first_name, last_name, attDate, staff_id, att, late FROM staff as a LEFT OUTER JOIN staff_attendance AS b ON a.id = b.staff_id AND b.`attDate` >= '" .                   $startdate. "' AND  b.`attDate` <= '". $enddate . "' ORDER BY last_name, attDate;";
    $stmt = $dbh->query($sql);

    $dates = array();
    $users = array();

    while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
        $dates[] = $row['attDate'];
        if (!isset($users[$row['id']])) {
            $users[$row['id']] = array(
                'first_name' => $row['first_name'], 
                'last_name' => $row['last_name'],
                'attendance' => array()
            );
        }
        $users[$row['id']]['attendance'][$row['attDate']] = $row['att'];
    }

    $dates = array_unique($dates);
    sort($dates);

    // header
    echo '<table border=1><tr>';
    echo '<td>Name</td>';
    foreach($dates as $d){
        echo '<td>'.$d.'</td>';
    }
    echo '</tr>';

    //data
    foreach($users as $u) {
        echo '<tr><td>'.$u['first_name'].'</td>';
        foreach($dates as $d) {
            if (isset($u['attendance'][$d])) {
                echo '<td>'.$u['attendance'][$d].'</td>';
            } else {
                echo '<td>?</td>';
            }
        }
        //end row
        echo '</tr>';
    }
    echo '</table>';

这似乎并没有填充顶部的所有日期,也看不出原因。 这就是我得到的。

    Name        2013-06-26
    Katy    ?   full
    Lauren  ?   full
    Laura   ?   full
    Louise  ?   holiday
    Jade    ?   off

不太确定日期数组是否填充不正确: - /

4 个答案:

答案 0 :(得分:2)

一段代码来说明我的comment

$dates = array();
$users = array();

while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
    $dates[] = $row['attDate'];
    if (!isset($users[$row['id']])) {
        $users[$row['id']] = array(
            'first_name' => $row['first_name'], 
            'last_name' => $row['last_name'],
            'attendance' => array()
        );
    }
    $users[$row['id']]['attendance'][$row['attDate']] = $row['att'];
}

$dates = array_unique($dates);
sort($dates);

// header
//echo 'name';
foreach($dates as $d){
    echo $d;
}

//data
foreach($users as $u) {
    //echo $u['first_name'];
    foreach($dates as $d) {
        if (isset($u['attendance'][$d])) {
            echo $u['attendance'][$d];
        } else {
            // for missing records?
        }
    }
    //end row
}

答案 1 :(得分:1)

这是我用于输出SQL结果的基本输出循环。它可以通过基于$key值的条件格式或者你有什么来扩展。

您还应该对printf()sprintf()函数表示友好,因为它们非常实用。

$rs; // assuming this is an indexed array of rows returned from your DB
// ie: $rs[0]['id']

$output = '<table>';

//print header row by iterating through the first result row and printing the keys
$output .= '<tr>';
foreach($rs[0] as $key => $value) {
  $output .= sprintf('<td>%s</td>', $key);
}
$output .= '</tr>';

//now the data rows
foreach($rs as $row) {
  $output .= '<tr>';
  foreach($row as $key => $value) {
    $output .= sprintf('<td>%s</td>', $value);
  }
  $output .= '</tr>';
}

$output .= '</table>';
echo $output;

答案 2 :(得分:1)

简言之: 首先查询日期以创建表头。 接下来使用您的查询来获取数据以在html表中创建所有行。 而且你必须记住前一个结果行中的first_name。如果更改first_name,则在html表中开始新行。

伪代码(未完成):

$results = query("SELECT ... only dates");

// ... some html ... opening header row

foreach($results as $date) {
    echo "<td>", $date, "</td>"; 
}

$results = query("SELECT ... your query");
$last__first_name = "";

// ... some html ... closing header row and opening data rows

foreach($results as $row) {

    if( $row->first_name != $last__first_name ) {
        $last__first_name = $row->first_name;
        echo "</tr><tr>"; // create new row in html table
        echo "<td>", $row->first_name, "</td>";
    }

    echo "<td>", $row->att, "</td>"; // next column 
}

// ... some html ... closing table

答案 3 :(得分:-1)

您可以在HTML表格中回显结果。首先,您创建标题:

echo '<table>';
echo '<tr><td>Column 1</td><td>Column 2</td><td>Column 3</td>......</tr>';

然后,执行SQL查询(SELECT):

$result = mysql_query("SELECT * FROM table ... ...");

在此之后,您可以使用“while”迭代结果:

while ($row = mysql_fetch_array($result ) ) {
echo '<tr><td>'.$row['name_of_column_1_in_db'].'</td><td>'.$row['name_of_column_2_in_db'].'</td> .......... </tr>';
}

然后,关闭表格标签:

echo '</table>';