2013-12-12 80 views
1

我試圖從我的表中的一個coloumns的字母等級中打印出平均成績。它適用於前兩個輸入,但在此之後,當我繼續添加平均值不再是真實的時候,我不確定發生了什麼。試圖使用mysql和php打印平均等級

* I relize這個心不是最乾淨的代碼

$totalGrade =0; 
    $result = mysqli_query($con,"SELECT id,grade FROM gpa"); 
while ($row = mysqli_fetch_array($result)) { 

    if($row['grade'] == 'A') { 
     $numberGrade = 4; 
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'A-') { 
    $numberGrade = 3.67; 
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'B+') { 
    $numberGrade = 3.33;  
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'B') { 
    $numberGrade = 3;  
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'B-') { 
    $numberGrade = 2.67; 
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'C+') { 
    $numberGrade = 2.33;  
    $totalGrade = ($totalGrade + $numberGrade);                     
} if ($row['grade'] == 'C') { 
    $numberGrade = 2; 
    $totalGrade = ($totalGrade + $numberGrade); 
} if ($row['grade'] == 'C-') { 
    $numberGrade = 1.67; 
    $totalGrade = ($totalGrade + $numberGrade);                     
} if ($row['grade'] == 'D') { 
    $numberGrade = 1; 
    $totalGrade = ($totalGrade + $numberGrade);                   
} else { 
    $numberGrade = 0; 
    $totalGrade = ($totalGrade + $numberGrade);                   
} 
$totalGrade = $totalGrade/$row['id']; 
} 
+0

你可能想查看[switch](http://php.net/manual/en/control-structures.switch.php)語句.. 。看起來很容易/管理 –

回答

1

有兩個問題:

$totalGrade = $totalGrade/$row['id'];不應該循環,它目前在裏面。將它移到while循環之外。

$totalGrade = $totalGrade/$row['id'];除以該行的ID。你不能依靠那些被加起來的成績數來表示。

相反,把之前,你的循環:

$count = 0; 

然後,你的循環裏面,放:

$count++; 

然後,終於,你的循環,放:

$totalGrade = $totalGrade/$count; 

最後,有一個更優雅(和更容易維護)的方法來做到這一點,利用陣列圖或類似的。我強烈建議尋找它。

基本上,在循環之前,建立一個數組,像這樣:

$grade_values = array( 'A' => 4.0, 
         'A-'=> 3.67, 
         'B' => 3.0, 
         ...etc... 
); 

然後,你的整個功能可以看起來像這樣:

while ($row = mysqli_fetch_array($result)) { 
    $totalGrade+= ($grade_value[$row['grade']]); 
    $count++; 
} 
$count = mysql_num_rows($result); 
$totalGrade = $totalGrade/$count; 

維護更簡單。這只是代碼的一小部分。而且看起來更愉快!

好的,終於終於,你不應該使用mysql。你應該使用mysqli或PDO。 Mysql已過時,並且不安全,依此類推:PHP documentation on mysql

+0

jeez,即時通訊是一個白癡哈哈非常感謝,但現在很好! – user3062910

1

我想通過向您展示我喜歡的所有條件的替代方案來添加到@ cale_b的答案。你可以用一個數組代替,看一看

<?php 
$totalGrade = 0; 
$result = mysqli_query($con, "SELECT id,grade FROM gpa"); 

$grades = array(
    'A' => 4, 
    'A-' => 3.67, 
    'B+' => 3.33, 
    'B' => 3, 
    'B-' => 2.67, 
    'C+' => 2.33, 
    'C' => 2, 
    'C-' => 1.67, 
    'D' => 1 
); 

$totalGrade = 0; 
$numGrades = 0; 
while($row = mysqli_fetch_array($result)) { 
    $numberGrade = 0; 
    $grade  = $row['grade']; 

    if(isset($grades[$grade])) 
     $numberGrade = $grades[$grade]; 

    $totalGrade = $totalGrade + $numberGrade; 
    $numGrades++; 
} 

$totalGrade /= $numGrades;