Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态HTML表-更新单元格行_Php_Mysql - Fatal编程技术网

Php 动态HTML表-更新单元格行

Php 动态HTML表-更新单元格行,php,mysql,Php,Mysql,我有一个从数据库动态生成的HTML表。在这个问题上可以看到实现这一目标的解决方案 这很好,除了我想在同一行中指出一个人每周参加的所有会议之外——使用下面的代码,一个额外的会议出席成为HTML表中附加的另一行。所以我想要的是: DB表类似于“周”、“队列”和“出席”表 +---------+-----------+----------+-----------+ | week_pk | week_name | sessions | cohort_fk | +---------+-----------

我有一个从数据库动态生成的HTML表。在这个问题上可以看到实现这一目标的解决方案

这很好,除了我想在同一行中指出一个人每周参加的所有会议之外——使用下面的代码,一个额外的会议出席成为HTML表中附加的另一行。所以我想要的是:

DB表类似于“周”、“队列”和“出席”表

+---------+-----------+----------+-----------+
| 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同一个人有两行。唯一标识符必须位于考勤表中的人员id上,抱歉之前没有显示此信息!我的坏处还包括表格右侧的附加列以及第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>";

我尝试使用虚构的数据,但效果很好:

我个人会浏览嵌套数组。 我给你举个例子。请注意,这只是原则上的,因为我没有数据库,所以我没有测试:

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>";

我尝试使用虚构的数据,但效果很好:

我会尝试使用几个交叉联接来获得session/week/person的所有可能组合,然后根据出席情况离开联接

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小提琴:-

尽管添加标题有点混乱,但是您可以很容易地循环这个问题——如果没有标题,跟随者的大小将是没有标题的一半。我已经使用了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";

?>

我会尝试使用几个交叉联接来获得session/week/person的所有可能组合,然后根据出席情况离开联接

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小提琴:-

尽管添加标题有点混乱,但是您可以很容易地循环这个问题——如果没有标题,跟随者的大小将是没有标题的一半。我已经使用了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";

?>

感谢您的帮助,但是通过您的代码,我仍然可以在html表中获得更多的行,其中有人参加了另一个会话。另外,记号&10004没有显示…@doydoy44…这看起来不错,但名称匹配有问题。在一个考勤记录和下一个考勤记录之间姓名发生变化的情况。发生这种情况时,html表中会创建另一行,因此有两行名称不同,但标记位于正确的单元格中。如果名称没有改变,它就可以正常工作。您可以修改代码以使唯一标识符为person_id吗?请参阅更新我最初从OPALS中省略的考勤表中的person_id字段。我可以确认,更改第二个考勤记录(其中姓名与个人稍有不同)会导致程序正常工作……因此需要匹配person\u id不是名称。我添加person\u id以在查询库中使用姓氏,但使用您的代码,我仍然会在html表中获得其他行,其中有人参加了另一个会话。另外,记号&10004没有显示…@doydoy44…这看起来不错,但名称匹配有问题。在一个考勤记录和下一个考勤记录之间姓名发生变化的情况。发生这种情况时,html表中会创建另一行,因此有两行名称不同,但标记位于正确的单元格中。如果名称没有改变,它就可以正常工作。您可以修改代码以使唯一标识符为person_id吗?请参阅更新我最初从OPALS中省略的考勤表中的person_id字段。我可以确认,更改第二个考勤记录(其中姓名与个人稍有不同)会导致程序正常工作……因此需要匹配person\u id不是姓名。我添加person\u id以在query@Kickstart...this开始看起来正常,但正在表的右侧创建其他列,而不是在任何“周”或“会话”列下。同样的问题是,在同一个人有两行名字,但中间加上的名字来自学生记录系统的情况下,人们在不同的会话之间更改名字……你能发布产生上述结果的测试数据吗?我已经修改了代码以使用person_id,这使事情变得更容易-如果有person表,可能会更容易
键入了person_id。@Kickstart…我已经用您最新的代码更改更新了显示结果的OP,除了显示person_id而不是姓名外,效果很好。非常感谢您在这方面的帮助,希望代码对其他尝试执行类似操作的人有用。@Kickstart…这看起来不错,但在表的右侧创建了其他列,而不是在任何“周”或“会话”列下。同样的问题是,在同一个人有两行名字,但中间加上的名字来自学生记录系统的情况下,人们在不同的会话之间更改名字……你能发布产生上述结果的测试数据吗?我已经修改了代码以使用person\u id,这使事情变得更容易-如果在person\u id上键入了person表,可能会更容易。@Kickstart…我已经用您最新的代码更改更新了我的OP,显示结果,除了显示person\u id而不是名称外,效果很好。非常感谢您在这方面的帮助,希望代码能对其他尝试做类似事情的人有用。