我正在尝试构建一个基本的测验系统。下面的代码显示了用户如何使用单选按钮选择答案,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_exists
或isset
。
PHP有点生锈,但。。。你试过使用isset()
函数吗?或者适当地更改错误报告级别?
http://php.net/manual/pt_BR/function.error-reporting.php
为什么不创建一个新的单选按钮"不知道",最初会检查
<input type="radio" name="" checked>
因此,默认情况下,该按钮将被选中。