如何在循环中实现我的学生评分系统

时间:2012-03-15 08:18:14

标签: php mysql loops while-loop

这部分代码用于在我申请学生学期成绩(课程分数)时将成绩授予学生分数。但是,只有特定等级被授予所有分数,大多数时候上传到学生数据库的最后结果被授予所有分数。当我把时期添加到等级,即

  $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';
            }   
            }   

Query8

    $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

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

感谢。

3 个答案:

答案 0 :(得分:0)

最好这样试试,

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

}

答案 1 :(得分:0)

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

通过matric_no

获取query8的查询结果
  $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;
   }

答案 2 :(得分:0)

编辑。

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

$query7$query8相同,只是您不检索相同的字段。这是DB处理工作的两倍,所以最好只使用$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中检索到的“得分”字段调用该函数:

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

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

另一种方法是在DB中包含等级(但无论如何你不需要$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;

然后,您只需在grade的{​​{1}}部分添加$query7,然后在第182行使用SELECT

做出选择:)