【问题标题】:PHP mysql dynamic table (attendance sheet)PHP mysql动态表(考勤表)
【发布时间】:2012-08-13 20:49:26
【问题描述】:

我的数据库中有 3 个表:

  • 学生
  • 课程
  • 出席

前 2 个表有 2 个字段(id、name),第三个有:corseID、studID、attDate 和 attStatus,其中 attStatus 存在或不存在

我需要的是:具有以下属性的动态表:

  • 第一列的标题应为“姓名”,其中填充了学生表中的学生姓名(完成)
  • 第一行应填充出勤表中 attDate 字段中的日期(完成)
  • 上述列和行之间的其余单元格应从出勤表中的 attStatus 字段中提取出勤状态,给出学生姓名和出勤日期

请提供如何解决此问题的演练(越详细越好)。

【问题讨论】:

    标签: php mysql dynamic


    【解决方案1】:

    您可以使用以下 SQL 查询来获取 ALL 记录:

    SELECT
    s.id Student_ID,
    s.name Student_Name,
    c.name Course_Name,
    a.attStatus Attendance_Status,
    a.attDate Attendance_Date
    FROM students s
    INNER JOIN attendance a ON (s.id=a.studID)
    INNER JOIN courses c ON (a.courseID=c.id)
    ORDER BY a.attDate ASC
    

    编辑

    您没有说学生是否可以每天参加多门课程,所以我认为可以。

    在 PHP 方面,执行以下操作:

    $dates=array();
    $students=array();
    while($row=mysqli_fetch_assoc($result))
    {
     if(!in_array($dates[$row["Attendance_Date"]])) $dates[]=$row["Attendance_Date"];
     if(empty($students[$row["Student_ID"]]))
       $students[$row["Student_ID"]]=array("name"=>$row["Student_Name"]);
     if(empty($students[$row["Student_ID"]][$row["Attendance_Date"]])
       $students[$row["Student_ID"]][$row["Attendance_Date"]]=array();
     $students[$row["Student_ID"]][$row["Attendance_Date"]][$row["Course_Name"]]=$row["Attendance_Status"];
    }
    

    所以当循环结束时,你可以得到这样的$students数组:

    Array(2) =>
    {
      123 =>
       {
         "name"=>"Einstein",
         "2012-08-01"=>
          {
            "Math"=>"present",
            "Phys"=>"absent"
          }
         "2012-08-02"=>
          {
            "Liter"=>"absent",
            "Music"=>"present"
          }
       }
      456 =>
       {
         "name"=>"Heisenberg",
         "2012-08-01"=>
          {
            "Math"=>"absent",
            "Phys"=>"present"
          }
       }
    }
    

    还有$dates 数组中的所有日期。然后你可以foreach$dates数组绘制第一行,然后foreach($students){foreach($dates){}}绘制每一行。

    【讨论】:

    • 这确实让我得到了我想要的结果,但我的问题是我如何让它们像之前概述的那样显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多