构建表单。
Radio buttons 通常分组在一起,共享相同name 属性的单选按钮属于一组(示例中对一个问题的所有答案)。由于默认情况下不检查任何答案,因此当在单选按钮组中未检查任何答案时,将不会提交输入。为了防止在组中的第一个单选按钮上使用required 属性,这将告诉浏览器仅在输入不为空时才提交表单。
这是一个例子,我在面向对象的风格中使用mysqli:
$connection = new mysqli( 'host', 'user', 'pass', 'db' );
$questions = $connection->query( "SELECT * FROM question_bank" );
echo "<form method='POST' action='exam.php'>";
while ( $row = $questions->fetch_assoc() ) {
echo $row[ 'question' ] . "<br>";
echo "<input type ='radio' value ='a' name='$row[id]' required>" . $row[ 'a' ] . "<br>";
echo "<input type ='radio' value ='b' name='$row[id]' >" . $row[ 'b' ] . "<br>";
echo "<input type ='radio' value ='c' name='$row[id]' >" . $row[ 'c' ] . "<br>";
echo "<input type ='radio' value ='d' name='$row[id]' >" . $row[ 'd' ] . "<br>";
}
echo "<input type='submit' value='submit' name='submit'></form>";
处理表单请求。
检查表单是否通过post 方法和!empty( $_POST['submit'] )(或使用$_SERVER['REQUEST_METHOD'] === 'POST')提交,循环遍历所有问题以将收到的答案与正确答案进行比较。由于单选按钮使用帖子id 作为name 属性进行分组,$_POST 数组将如下所示:
大批
(
[1] => b
[2] => c
[3] => c
[提交] => 提交
)
,其中key是问题的id,value是用户选择的答案。
如何验证表单的示例:
$connection = new mysqli( 'host', 'user', 'pass', 'db' );
if ( !empty( $_POST['submit'] ) ) {
$questions = $connection->query( "SELECT * FROM question_bank" );
while ( $row = $questions->fetch_assoc() ) {
if ( !empty( $_POST[ $row[ 'id' ] ] ) ) {
$ans = $row[ $_POST[ $row[ 'id' ] ] ];
if ( $ans === $row[ 'right_ans' ] ) {
echo $row[ 'question' ] . ': correct<br>';
} else {
echo $row[ 'question' ] . ': incorrect<br>';
}
} else {
echo $row[ 'question' ] . ': no answer<br>';
}
}
}
如何将给出的答案与表格中的正确答案进行比较。
好的,今天我心情很好,所以这是一个修改后的示例,您可以将提供的答案保存在一个数组中,并在构建表单时使用该数组。我还将向您展示如何使用ternary operator(( $checked && 'd' == $checked ? 'checked' : '' ))在表单提交后检查正确答案
$answers = [];
$questions = $connection->query( "SELECT * FROM question_bank" );
if ( !empty( $_POST['submit'] ) ) {
while ( $row = $questions->fetch_assoc() ) {
if ( !empty( $_POST[ $row[ 'id' ] ] ) ) {
$ans = $row[ $_POST[ $row[ 'id' ] ] ];
if ( $ans === $row[ 'right_ans' ] ) {
$answers[ $row[ 'id' ] ] = "'$ans' is correct";
} else {
$answers[ $row[ 'id' ] ] = "'$ans' is not correct, correct is $row[right_ans]";
}
} else {
$answers[ $row[ 'id' ] ] = 'No answer provided';
}
}
}
$questions = $connection->query( "SELECT * FROM question_bank" );
echo "<form method='POST' action='exam.php'>";
while ( $row = $questions->fetch_assoc() ) {
echo $row[ 'question' ] . "<br>";
$checked = null;
if ( isset( $answers[ $row[ 'id' ] ] ) ) {
echo $answers[ $row[ 'id' ] ] . "<br>";
$checked = array_search( $row[ 'right_ans' ], array( 'a' => $row[ 'a' ], 'b' => $row[ 'b' ], 'c' => $row[ 'c' ], 'd' => $row[ 'd' ] ) );
}
echo "<input type ='radio' value ='a' name='$row[id]' required " . ( $checked && 'a' == $checked ? 'checked' : '' ) . ">" . $row[ 'a' ] . "<br>";
echo "<input type ='radio' value ='b' name='$row[id]' " . ( $checked && 'b' == $checked ? 'checked' : '' ) . ">" . $row[ 'b' ] . "<br>";
echo "<input type ='radio' value ='c' name='$row[id]' " . ( $checked && 'c' == $checked ? 'checked' : '' ) . ">" . $row[ 'c' ] . "<br>";
echo "<input type ='radio' value ='d' name='$row[id]' " . ( $checked && 'd' == $checked ? 'checked' : '' ) . ">" . $row[ 'd' ] . "<br>";
}
echo "<input type='submit' value='submit' name='submit'></form>";