【问题标题】:How to implement my student grading system inside a loop如何在循环中实现我的学生评分系统
【发布时间】:2012-03-15 08:18:13
【问题描述】:

每当我请求学生学期成绩(课程分数)时,我的这部分代码用于给学生分数打分。但是,只有一个特定的成绩会被授予所有分数,大多数时候上传到学生数据库的最后一个结果会被授予所有分数。当我在年级中添加句号时,即

  $grade .= 'A';
  $grade .= 'B';
  $grade .= 'C';
  $grade .= 'D';
  $grade .= 'E';

所有等级在每一列中都重复了。所以假设一个特定的学生在一个学期学习了 6 门课程并且总共有

  3 A's , 2 B's , 1 C 

六门课程的每行都重复了所有 6 个等级。

在我生成的 HTML 表中,我有以下列

   Course_code
   Course_title
   Course_unit
   Score
   Grade

只有前四个来自数据库中已经存在的值,最后一个(等级),每当我想请求学生的学期结果时都会生成。

   while ($row8 = mysql_fetch_assoc               ($query8)) {
            if ($row8['score'] >= 70) {
              $grade = 'A';
           }
            elseif ($row8['score'] >= 60) {
            $grade = 'B';
            }elseif ($row8['score'] >= 50) {
            $grade = 'C';
            }elseif ($row8['score'] >= 45) {
            $grade = 'D';
            }elseif($row8['score'] >= 40) {
            $grade = 'E';
            }else{
            $grade = 'F';
            }   
            }   

查询8

    $query8 = mysql_query("SELECT  m.             score 
    FROM    maintable AS m  
    INNER JOIN students AS s ON
    m.matric_no = s.matric_no
    INNER JOIN courses AS c ON
                      m.course_code = c.course_code
   WHERE m.matric_no = '".$matric_no."'
    AND m.level = '".$level."'") 
   or die (mysql_error());

表结构

MAINTABLE: 
score_id 
matric_no 
session
semester_name 
course_code 
level         
score 
grade

COURSES: 
course_id 
course_code 
course_title 
course_unit

 STUDENT 
 matric_no 
 first_name 
 last_name
 other_name 
 level

感谢您的耐心和帮助。非常感谢。

谢谢。

【问题讨论】:

  • 不清楚你的问题是什么?
  • 每当我从数据库请求学生分数时,我想动态地对分数进行评分。谢谢
  • 还不清楚。我不明白背景,请给我们一个表格(带记录)的示例。
  • 这不是您的第一个代码 sn-p 已经在做的事情(包含所有 IF 的那个)吗?
  • @truth 我有一个关于每门课程的课程和信息表。然后是一个从课程表中获取数据的主表,还包括学术会议、学期分数的列,但没有成绩列。因此,每当我查询数据库以获取学术会议(2011/2012)中所有课程的学生学期结果时,学期(雨)..应该根据学生所修课程的数量返回一些行.生成的 HTML 表包含课程名称、课程代码、课程单元、分数和等级(我想要生成)的列。谢谢

标签: php mysql loops while-loop


【解决方案1】:

编辑。

所以,根据您链接的 Pastebin(如果我碰巧给出行号,它将是我在 Pastebin 上看到的行),我没有进入整个代码,但对于我们感兴趣的部分.您的问题是您计算所有学生的成绩,并将其始终保存在同一个变量中。因此,当您稍后尝试在循环之外打印它时,该变量仅包含最后通过循环的学生的成绩。

$query7$query8 是相同的,只是您不检索相同的字段。数据库要处理两倍的工作,所以最好只使用$query7(其中也包含分数),并删除$query8(第122到130行)。

您的成绩计算(第 141 到 155 行)在 $query8 上循环,您不需要它,因为您要为一个分数计算一个成绩,而不是一次全部计算。所以,只需删除循环,保留里面的内容。

上述循环的内部(第 142 到 155 行),把它放在一个函数中,就像我在第一篇文章中所做的那样:

function makeGrade($score) { //just a rewrite of your own code, exactly the same purpose
    if($score>=70)
        return 'A';
    if($score>=60)
        return 'B';
    if($score>=50)
        return 'C';
    if($score>=45)
        return 'D';
    if($score>=40)
        return 'E';
    return 'F';
}

在第 170 到 188 行,循环 $query7 以打印数据,并在第 182 行打印 $grade。无需打印$grade,只需使用您在$query7 中检索到的字段“Score”调用函数即可:

echo makeGrade($row['Score']);

现在它应该为每个学生和每门课程提供正确的成绩。顺便说一句,这里您不需要数据库中的成绩字段,因此您可以将其删除。

另一种方法是在数据库中设置成绩(但无论如何您不需要$query8)。首先,当代码在MAINTABLE(我想是其他文件)中插入行时,您需要设置它,使用相同的makeGrade() 函数(尽管在这种情况下,您必须声明两个脚本都可以访问它的函数,例如在包含文件中)。其次,对于现有行,您需要运行一系列 UPDATE,如下所示:

UPDATE MAINTABLE SET grade='A' WHERE score>=70;
UPDATE MAINTABLE SET grade='B' WHERE score>=60 AND score<70;
UPDATE MAINTABLE SET grade='C' WHERE score>=50 AND score<60;
UPDATE MAINTABLE SET grade='D' WHERE score>=45 AND score<50;
UPDATE MAINTABLE SET grade='E' WHERE score>=40 AND score<45;
UPDATE MAINTABLE SET grade='F' WHERE score<40;

那么你只需在$query7SELECT部分添加grade,并在第182行使用$row['grade']

做出你的选择:)

【讨论】:

  • 感谢您的帮助。这是我正在制作的 html 表的示例。最右边的列是成绩,你会注意到所有的成绩都是'C',但总和应该是'B'而其他人是'F'。那是我的问题。 m.box.com/view/f_1809576751 谢谢一百万。我很感激。
  • 对于任何一个学期,学生都将学习几门课程,但只能获得一门课程的分数。因此,如果他/她在一个学期学习 6 门课程,他/她预计将获得 6 分,因此 6 分取决于特定课程的分数。
  • 我正在使用 CSV 文件上传结果。而且它只有两列.. Matric_no 和 score..
  • 然后,如果您需要为每个分数评分,那么您发布的代码似乎是正确的。如果学生的名字不一样,你的 INSERT 应该没问题,那么你的 UPDATE 请求如何,设置成绩的那个?我曾经犯过这个错误,忘记了UPDATE中的WHERE子句......
  • 感谢您的帮助。我不更新了。分数已经在数据库中请参阅 m.box.com/view/f_1809576751 了解我在说什么。
【解决方案2】:

最好这样尝试,

while ($row8 = mysql_fetch_assoc               ($query8)) {

echo "<td>$row['course_id']</td>";
 echo "<td>$row['course_code']</td>";
 echo "<td>$row['course_title']</td>";
 echo "<td>$row['score']</td>";
echo "<td>";
            if ($row8['score'] >= 70) {
              $grade = 'A';
           }
            elseif ($row8['score'] >= 60) {
            $grade = 'B';
            }elseif ($row8['score'] >= 50) {
            $grade = 'C';
            }elseif ($row8['score'] >= 45) {
            $grade = 'D';
            }elseif($row8['score'] >= 40) {
            $grade = 'E';
            }else{
            $grade = 'F';
            }   

echo $grade ."</td></tr>";

}

【讨论】:

    【解决方案3】:

    你的问题不是很清楚。这是一个建议。

    通过matric_no获取query8 order的查询结果

      $lastid='-1';
       $newgrade="";
       while ($row8 = mysql_fetch_assoc($query8)) {
            if ($row8['score'] >= 70) {
              $grade = 'A';
           }
            elseif ($row8['score'] >= 60) {
            $grade = 'B';
            }elseif ($row8['score'] >= 50) {
            $grade = 'C';
            }elseif ($row8['score'] >= 45) {
            $grade = 'D';
            }elseif($row8['score'] >= 40) {
            $grade = 'E';
            }else{
            $grade = 'F';
            }   
            }   
           $mno=$row8['matric_no'];
           if(($lastid!=$mno && $lastid!='-1')) {
            echo "<tr><td>all db details</td><td>$newgrade</td></tr>"; //$newgrade has appended grades of student(identified by matric_no)
            $newgrade="";
           }
           $newgrade.=$grade;
           $lastid=$mno;
       }
    

    【讨论】:

    • 感谢您的帮助。这是我正在制作的 html 表的示例。最右边的列是成绩,你会注意到所有的成绩都是'C',但总和应该是'B'而其他人是'F'。那是我的问题。 m.box.com/view/f_1809576751 谢谢一百万。我很感激。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多