2014-03-12 33 views
1

我有一個從數據庫動態生成的HTML表格。在這個問題Adding rows to a HTML table with dynamic columns可以看到實現這一點的解決方案。動態HTML表格 - 更新單元格行

enter image description here

這工作得很好,但我想指出的所有會話的人蔘加了同一行中的每個星期 - 用下面的代碼,再舉行一次會議出勤成爲附加到HTML表中的另一行。所以,我想是這樣的:

​​

數據庫表像(「周」,「組羣」和「出勤」表)

+---------+-----------+----------+-----------+ 
| week_pk | week_name | sessions | cohort_fk | 
+---------+-----------+----------+-----------+ 
|  1 | Week 1 |  3 |   1 | 
|  2 | Week 2 |  2 |   1 | 
|  3 | Week 3 |  1 |   1 | 
+---------+-----------+----------+-----------+ 

+-----------+-------------+-------------+-------------+ 
| cohort_pk | cohort_name | cohort_code | cohort_year | 
+-----------+-------------+-------------+-------------+ 
|   1 | Some name | MICR8976 |  2014 | 
+-----------+-------------+-------------+-------------+ 

+---------------+-----------+-------------+---------+-----------+---------+---------+ 
| attendance_pk | person_id | given_names | surname | cohort_fk | week_fk | session | 
+---------------+-----------+-------------+---------+-----------+---------+---------+ 
|    1 | 123456 | Bill  | Smith |   1 |  1 |  2 | 
|    2 | 123456 | Bill  | Smith |   1 |  2 |  2 | 
|    3 | 753354 | Fred  | Jones |   1 |  1 |  1 | 
|    4 | 753354 | Fred  | Jones |   1 |  2 |  1 | 
|    5 | 753354 | Fred  | Jones |   1 |  3 |  1 | 
+---------------+-----------+-------------+---------+-----------+---------+---------+ 

而且我正在使用的代碼:

$cohort = $_POST['cohort']; 
$year = $_POST['year']; 


$query = "SELECT * FROM cohort, week 
WHERE week.cohort_fk = cohort.cohort_pk 
AND cohort.cohort_year = '$year' 
AND cohort.cohort_pk = '$cohort' 
ORDER BY week.week_pk"; 

$result = mysql_query($query, $connection) or die(mysql_error()); 

echo "<table width='100%' cellpadding='4' cellspacing='0' class='attendance_table'>"; 
echo "<tr><td class='theadings'></td>"; 
$second_row = "<tr><td class='theadings'></td>"; 
$totalcolumn = 1;        
while($row = mysql_fetch_assoc($result)){ 
    $weekname = $row["week_name"]; 
    $n_session = $row["sessions"]; 
    $weekpk  = $row["week_pk"];    
    $totalcolumn += $n_session;     
    echo "<td class='theadings' colspan='$n_session'>$weekname</td>"; 
    for($i=1; $i<=$n_session; $i++){ 
     $second_row .= "<td class='theadings_lab'>Lab $i</td>"; 
     $weeksession[$weekpk][$i] = $totalcolumn - $n_session + $i; 
    } 
} 
echo "</tr>"; 
echo $second_row . "</tr>"; 


$query = "SELECT * FROM cohort, week, attendance 
WHERE week.cohort_fk = cohort.cohort_pk 
AND attendance.week_fk = week.week_pk 
AND attendance.cohort_fk = cohort.cohort_pk 
AND cohort.cohort_year = '$year' 
AND cohort.cohort_pk = '$cohort' 
ORDER BY attendance.attendance_pk"; 
$result = mysql_query($query, $connection) or die(mysql_error()); 
while($row = mysql_fetch_assoc($result)){ 
    $name = $row["given_names"] . " " . $row["surname"]; 
    $weekpk = $row["week_pk"]; 
    $sno = $row["session"]; 
    echo "<tr><td class='tborder_person_left'>$name</td>"; 
    for($i=2; $i<=$totalcolumn; $i++){  
     if($weeksession[$weekpk][$sno] == $i) 
      echo "<td class='tborder_person_attended'>&#10004</td>"; 
     else 
      echo "<td class='tborder_person'>-</td>";    
    }          
    echo "</tr>"; 
}//end while 
echo "</table>"; 

@Kickstart下面是表格與您的代碼的例子。例如,你可以看到Melody Chew和Kit Yeng Melody Chew(同一人)有兩個分開的行。唯一的標識符需要在考勤表中存在的person_id上(道歉以前沒有顯示!我的壞消息還需要注意表格右側的附加列,其中的十字應該在第2周的列下。

enter image description here

回答

2

我個人會去通過嵌套數組。

我給你舉個例子。請注意,這只是在原則上,我沒有數據庫,我沒有測試過。:)

1 - >數組的聲明$liste_name = array();

2 - 由>替換你的第二個處理:

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

    $name = $row["given_names"] . " " . $row["surname"]; 
    $weekpk = $row["week_pk"]; 
    $sno = $row["session"]; 
    $person_id = $row["person_id"]; //add person_id 


    $liste_name[$person_id] = $name; // to have the last name 
    $tab[$person_id][1] = "<td class='tborder_person_left'>$name</td>"; // to have the last name 

    for($i=2; $i<=$totalcolumn; $i++){ 

     if($weeksession[$weekpk][$sno] == $i) 
      $tab[$person_id][$i] = "<td class='tborder_person_attended'>&#10004</td>";    
    } 
}//end while 

3 - >填寫的空白區域:

foreach ($liste_name as $person_id => $name){ 

    $tab2[$person_id][1] = $tab[$person_id][1]; 

    for($i=2; $i<=$totalcolumn; $i++){ 
     if (!isset($tab[$person_id][$i]) || ($tab[$person_id][$i] != "<td class='tborder_person_attended'>&#10004</td>")) 
      $tab[$person_id][$i] = "<td class='tborder_person'>-</td>"; 
     $tab2[$person_id][$i] = $tab[$person_id][$i]; 
    } 
} 

4 - >使用數組:

foreach($tab2 as $person_id => $col){ 
    echo "<tr>"; 
    foreach ($col as $i => $value){ 
     echo $value; 
    } 
    echo "</tr>"; 
} 

echo "</table>"; 

我嘗試使用虛構數據,它的工作原理。 :)

+0

感謝這一點,但與您的代碼我仍然在人們參加了另一個會話的HTML表中額外的行。此外,蜱(&#10004)沒有顯示... – IlludiumPu36

+0

@ doydoy44 ...這看起來不錯,但是在匹配名稱時存在問題。一個人的名字在一個出席記錄和下一個出席記錄之間發生變化的情況。發生這種情況時,在html表中會創建另一行,因此有兩行每個都有不同的名稱,但是正確單元格中的刻度會顯示。名稱沒有改變的地方工作正常。你能修改你的代碼,以便唯一標識符是person_id嗎? – IlludiumPu36

+0

請參閱更新OP re我在OP – IlludiumPu36

2

我會試圖使用幾個CROSS JOIN來獲得會話/周/人的所有可能組合,然後離開參加會議。

SELECT unique_names.given_names, 
     unique_names.surname, 
     week_sessions.week_pk, 
     week_sessions.session, 
     attendance.attendance_pk 
FROM 
(
    SELECT week_pk, sub1.i AS session, week_name, week.cohort_fk, cohort.cohort_year 
    FROM week 
    INNER JOIN cohort 
    ON week.cohort_fk = cohort.cohort_pk 
    INNER JOIN 
    (
     SELECT 1 i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 
    ) sub1 
    ON week.sessions >= sub1.i 
    WHERE cohort.cohort_year = 2014 
    AND cohort.cohort_pk = 1 
) week_sessions 
CROSS JOIN 
(
    SELECT DISTINCT given_names, surname 
    FROM attendance 
) unique_names 
LEFT OUTER JOIN attendance 
ON week_sessions.week_pk = attendance.week_fk 
AND week_sessions.cohort_fk = attendance.cohort_fk 
AND week_sessions.session = attendance.session 
AND unique_names.given_names = attendance.given_names 
AND unique_names.surname = attendance.surname 
ORDER BY unique_names.given_names, 
     unique_names.surname, 
     week_sessions.week_pk, 
     week_sessions.session 

我敲了一個SQL搗鼓這一點: -

http://www.sqlfiddle.com/#!2/4a388/7

然後你可以圍繞這一點很容易循環(雖然添加標題是有點亂 - 以下是一半大小沒有標題)。我已經使用了mysql_ *函數,因爲這是你已經使用的。

<?php 

$connection = mysql_connect("localhost", "root", "") or die(mysql_error()); 
mysql_select_db("test_area") or die(mysql_error()); 

$sql = "SELECT unique_names.person_id, 
       unique_names.FullName, 
       week_sessions.week_pk, 
       week_sessions.session, 
       attendance.attendance_pk 
     FROM 
     (
      SELECT week_pk, sub1.i AS session, week_name, week.cohort_fk, cohort.cohort_year 
      FROM week 
      INNER JOIN cohort 
      ON week.cohort_fk = cohort.cohort_pk 
      INNER JOIN 
      (
       SELECT 1 i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 
      ) sub1 
      ON week.sessions >= sub1.i 
      WHERE cohort.cohort_year = 2014 
      AND cohort.cohort_pk = 1 
     ) week_sessions 
     CROSS JOIN 
     (
      SELECT person_id, MAX(CONCAT_WS(' ', given_names, surname)) AS FullName 
      FROM attendance 
      GROUP BY person_id 
     ) unique_names 
     LEFT OUTER JOIN attendance 
     ON week_sessions.week_pk = attendance.week_fk 
     AND week_sessions.cohort_fk = attendance.cohort_fk 
     AND week_sessions.session = attendance.session 
     AND unique_names.person_id = attendance.person_id 
     ORDER BY unique_names.person_id, 
       unique_names.FullName, 
       week_sessions.week_pk, 
       week_sessions.session"; 

$result = mysql_query($sql, $connection) or die(mysql_error()); 
$prev_person_id = 0; 
$first = true; 
$header = array('Name'=>array('Session')); 
$output = array(); 
while($row = mysql_fetch_assoc($result)) 
{ 
    if ($prev_person_id != $row['person_id']) 
    { 
     if ($prev_person_id != 0) 
     { 
      $first = false; 
     } 
     $prev_person_id = $row['person_id']; 
     $output[$prev_person_id] = array(); 
    } 
    if ($first) 
    { 
     $header["Week ".$row['week_pk']]["S".$row['session']] = "S".$row['session']; 
    } 
    $output[$prev_person_id][] = (($row['attendance_pk'] == '') ? '&nbsp;' : 'X'); 
} 

$header1 = ''; 
$header2 = ''; 
foreach($header as $key=>$value) 
{ 
    $header1 .= "<td colspan='".count($value)."'>$key</td>\r\n"; 
    foreach($value as $key1=>$value1) 
    { 
     $header2 .= "<td>$value1</td>\r\n"; 
    } 
} 
echo "<table border='1'>\r\n"; 
echo "<tr>\r\n$header1</tr>\r\n"; 
echo "<tr>\r\n$header2</tr>\r\n"; 

foreach($output as $name=>$value) 
{ 
    echo "<tr><td>$name</td>"; 
    foreach($value as $key1=>$value1) 
    { 
     echo "<td>$value1</td>\r\n"; 
    } 
    echo "</tr>"; 
} 

echo "</table>\r\n"; 

?> 
+0

@Kickstart ...這樣開始看起來不錯,但是在表格右邊不是在任何星期或會話列下創建附加列。同樣的問題,人們在同一個人中存在兩行的會話之間改變他們的名字,但是中間加入了名字(這是來自學生記錄系統...) – IlludiumPu36

+0

查看更新OP ... – IlludiumPu36

+1

您可以發佈測試產生上述結果的數據?我修改了代碼以使用person_id(這使事情變得更簡單 - 如果在person_id上鍵入了人員表格,則可能會更容易)。 – Kickstart