在切换语句设置中需要帮助


Need help in Switch Statement setup

$Grade和$Remark总是在$total的最后一个值处求值(即其中($check_ss=="ss"),但我希望它在if条件的每个实例处都获得值。我该怎么办例如,在第一个条件下,它得到等级值,并在随后的条件下注释相同或者我必须在每个if语句中包含switch语句吗

 //Logic and Calc
if ($check_en=="En"){
    $ot_en = $ent1 + $ent2 + $ent3 + $ent4 + $enexm;
    $total = $ot_en;
}
if ($check_ms=="Ms"){
    $ot_ms = $mst1 + $mst2 + $mst3 + $mst4 + $msexm;
    $total = $ot_ms;
}
if ($check_ss=="Ss"){
    $ot_ss = $sst1 + $sst2 + $sst3 + $sst4 + $ssexm;
    $total = $ot_ss;
}
$ot= $ot_ms + $ot_ss + $ot_en;
  switch ($total) {
        case $total > 70:
            $grade = "A";
            $remark = "Excellent";
            break;
        case $total >= 60 && $total <= 69:
            $grade = "B";
            $remark = "Very Good";
            break;
        case $total >= 50 && $total <= 59:
            $grade = "C";
            $remark = "Good";
            break;
        case $total >= 45 && $total <= 49:
            $grade = "D";
            $remark = "Pass";
            break;
        case $total >= 40 && $total <= 44:
            $grade = "E";
            $remark = "Poor";
            break;
        case $total <= 39:
            $grade = "F";
            $remark = "Fail";
            break;
    }
    if ($total == 0) {
        $grade = "F";
        $remark = "Fail";

将switch语句制作成一个函数,并使用一个数组来保存等级和备注数据。类似这样的东西:

function checkGrade($total)
{
    $ret = array();
    switch ($total) {
        case $total > 70:
            $ret['grade'] = "A";
            $ret['remark'] = "Excellent";
            break;
        case $total >= 60 && $total <= 69:
            $ret['grade'] = "B";
            $ret['remark'] = "Very Good";
            break;
        case $total >= 50 && $total <= 59:
            $ret['grade'] = "C";
            $ret['remark'] = "Good";
            break;
        case $total >= 45 && $total <= 49:
            $ret['grade'] = "D";
            $ret['remark'] = "Pass";
            break;
        case $total >= 40 && $total <= 44:
            $ret['grade'] = "E";
            $ret['remark'] = "Poor";
            break;
        case $total <= 39:
            $ret['grade'] = "F";
            $ret['remark'] = "Fail";
            break;
    }
    return $ret;
}

现在,您可以在if()条件下轻松地使用它,并在每一点上获得分数。

$gradesAlongTheWay = array();
if ($check_en=="En"){
    $ot_en = $ent1 + $ent2 + $ent3 + $ent4 + $enexm;
    $total = $ot_en;
    $gradesAlongTheWay['En'] = checkGrade($total);
}
if ($check_ms=="Ms"){
    $ot_ms = $mst1 + $mst2 + $mst3 + $mst4 + $msexm;
    $total = $ot_ms;
    $gradesAlongTheWay['Ms'] = checkGrade($total);
}
if ($check_ss=="Ss"){
    $ot_ss = $sst1 + $sst2 + $sst3 + $sst4 + $ssexm;
    $total = $ot_ss;
    $gradesAlongTheWay['Ss'] = checkGrade($total);
}

然后,您可以转储gradesAlongTheWay(),以了解每个特定点的分数。这将是一个具有3个主要索引的多维数组:

Array(
    'En' => array(
        'grade' => 'Some Letter',
        'remark' => 'Some notation'
    ),
   'Ms' => array(
        'grade' => 'Some Letter',
        'remark' => 'Some notation'
    ),
   'Ss' => array(
        'grade' => 'Some Letter',
        'remark' => 'Some notation'
    )
)

现在,我们可以很容易地通过指数及其等级访问每个点的等级,因此:

echo $gradesAlongTheWay['En']['grade']; // produces the letter from this check
echo $gradesAlongTheWay['Ss']['remark']; //produces the notation/message from this check

你也可以在它们上面循环。

foreach($gradesAlongTheWay as $type => $gradeArray)
{
    echo 'For Check '. $type .' you received an: '. $gradeArray['grade'] .'. '. $gradeArray['remark'];
}

编辑

由于PHP代码中的'撇号被注入到MySQL代码中,所以您会出现SQL错误。相反,您需要使用mysqli prepared statements

$stmt = mysqli_prepare($conn, "INSERT INTO records VALUES (NULL, '?', 'English Language', '?', '?', '?', '?', '?', '?', ?, 'Poor'");
mysqli_stmt_bind_param($stmt, "ssssssss", $sid, $ent1, $ent2, $ent3, $ent4, $enexm, $ot_en, $gradesAlongTheWay['En']['grade']);
mysqli_stmt_execute($stmt);

这将确保您的数据得到正确的净化。

请在这里阅读更多关于mysqli准备的语句