在循环中只比较选定的值以避免出现错误消息


Comparing only the selected value in loop to avoid error message

我正在尝试构建一个基本的测验系统。下面的代码显示了用户如何使用单选按钮选择答案,getresult.php将单选输入值与answer列进行比较。在我的数据库中有一个问题、opt1、opt2、opt3、opt4和答案列。

<form method="POST" action="getresult.php">
   <label>Enter Your Name:</label><br>
    <input type="text"  name="name"><br><br>
<?php
    $db = new mysqli("localhost", "root", "","learndb");
    $stmt=$db->prepare("SELECT * FROM quiz");
    $stmt->execute();
    $result=$stmt->get_result();
    echo "<form method='POST' action='getresult.php'>";
    while($myrow = $result->fetch_assoc())
{
echo $myrow['id'];
echo ".";   
echo $myrow['question'];
echo "<br>";
echo "<input type='radio' name='mycheck[".$myrow['id']."]' value=".$myrow['opt1'].">";
echo $myrow['opt1'];
echo "<br>";
echo "<input type='radio' name='mycheck[".$myrow['id']."]' value=".$myrow['opt2'].">";
echo $myrow['opt2'];
echo "<br>";
echo "<input type='radio' name='mycheck[".$myrow['id']."]' value=".$myrow['opt3'].">";
echo $myrow['opt3'];
echo "<br>";
echo "<input type='radio' name='mycheck[".$myrow['id']."]' value=".$myrow['opt4'].">";
echo $myrow['opt4'];
echo "<br><br>";

}?>
<input type="submit" name="submit" value="Get Results" class="btn btn-primary">

//getresult.php

<?php
extract($_POST);
$db = new mysqli("localhost", "root", "","learndb");
$stmt=$db->prepare("SELECT * FROM quiz");
$stmt->execute();
$result=$stmt->get_result();
$submit=isset($_POST['submit']);   
$count=0;
if($submit)
{
    while($myrow = $result->fetch_assoc())
{
        if($mycheck[$myrow['id']]==$myrow['answer'])
        {   
            $count=$count+1;
        }
}
    echo "Hello ";
    echo $_POST['name'];
    echo "<br>";
    echo "You scored ";
    echo "$count";
}

一切都是正确的,但如果我没有从问题中选择单选按钮,即如果我离开问题,它会显示未定义的偏移错误,这是显而易见的,但我怎么能不显示呢。或者,我如何只比较选定的选项?

您应该尝试这样的array_key_exists():

    if(array_key_exists($myrow['id'], $mycheck)
        && array_key_exists('answer', $myrow)
        && $mycheck[$myrow['id']]==$myrow['answer'])
    {   
        $count=$count+1;
    }

或者更好的做法是,根据已验证的行从数据库中请求答案。

提交表单时,所选值传递为(例如):

mycheck[1]=2
mycheck[2]=3
mycheck[3]=1
mycheck[4]=2

等等。如果你有一个问题没有得到回答,比如说问题2,那么这个问题的值不会提交给服务器,所以提交的值可能是这样的:

mycheck[1]=2
mycheck[3]=1
mycheck[4]=2

当PHP将其存储在$_POST[]中时,它将是一个关联数组:

$_POST['mycheck'] === array(
    '1' => 2,
    '3' => 1,
    '4' => 2
)

使用extract($_POST),您可以获得$mycheck的以下值:

$mycheck === array(
    '1' => 2,
    '3' => 1,
    '4' => 2
)

现在,代码中的以下循环仍将处理所有问题:

while($myrow = $result->fetch_assoc())
{
    if($mycheck[$myrow['id']]==$myrow['answer'])
    {   
        $count=$count+1;
    }
}

但是(在本例中)问题2的检查将失败,因为$myrow['id']将等于2,而$mycheck[2]定义偏移错误。

作为一个未回答的问题,显然不应该增加计数,你可以如下解决这个问题:首先测试问题是否得到了回答($mycheck有一个条目吗?),只有在这种情况下,才能从该条目中检索答案:

while($myrow = $result->fetch_assoc())
{
    $id = myrow['id'];
    if(array_key_exists($id, $mycheck) && $mycheck[$id]==$myrow['answer'])
    {
        $count=$count+1;
    }
}

对于以上额外的测试,您可以使用array_key_existsisset

PHP有点生锈,但。。。你试过使用isset()函数吗?或者适当地更改错误报告级别?

http://php.net/manual/pt_BR/function.error-reporting.php

为什么不创建一个新的单选按钮"不知道",最初会检查

<input type="radio" name="" checked> 

因此,默认情况下,该按钮将被选中。