【问题标题】:getting values from database for radio buttons for mcsq'z从数据库中获取 mcsq'z 单选按钮的值
【发布时间】:2015-09-22 08:22:39
【问题描述】:

我是一个制作测验应用程序,它有一个名为 question_bank 的数据库表,它有列:

id | question | a | b | c | d | right_ans | given_ans

我想从数据库中获取所有问题,当用户提交表单时,它应该比较 given_ans 和 right_ans。我能够从数据库中获取所有问题,但它无法正常运行。它应该从四个给定的选项中只选择一个值,但是这段代码允许我选择所有选项。我需要单选按钮的值为 a、b、c、d。因为我会将它与 right_ans 列进行比较。

    $query="SELECT * from question_bank";
    $result= mysqli_query($connection,$query);
    echo "<form method='post' action='exam.php'>";
    while ($read_all_data = mysqli_fetch_assoc($result))
    { 
    $id=$read_all_data['id'];
    $a=$read_all_data['a'];
    $b=$read_all_data['b'];
    $c=$$read_all_data['c'];
    $d=$read_all_data['d'];
     echo $read_all_data['question']."</br>";
     echo "A:<input type ='radio' value ='a'  name='$a' >".$a."</br>";
     echo "B:<input type ='radio' value ='b'  name='$b' >".$b."</br>";
     echo "C:<input type ='radio' value ='c'  name='$c' >".$c."</br>";
     echo "D:<input type ='radio' value ='d'  name='$d' >".$d."</br>";
    }
    echo "<input type='submit' value='submit' name='submit'>"[!

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    单选按钮必须具有相同的名称,这样它们才能像您想要的那样互斥:

     echo "A:<input type ='radio' value ='a'  name='response".$i."' >".$a."</br>";
     echo "B:<input type ='radio' value ='b'  name='response".$i."' >".$b."</br>";
     echo "C:<input type ='radio' value ='c'  name='response".$i."' >".$c."</br>";
     echo "D:<input type ='radio' value ='d'  name='response".$i."' >".$d."</br>";
    

    【讨论】:

    • 如果我给单选按钮起相同的名字,它只允许我从所有问题中选择一个选项。
    • 另请注意,这不是做 br 标签的正确方法。您可以使用

    • 先生,提交表格后如何取回所有值?我想要所有给定的答案,与正确的答案进行比较。
    • 你在问一个新问题。如果原始问题已得到回答,请开始一个新问题并关闭此问题
    【解决方案2】:

    构建表单。

    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是问题的idvalue是用户选择的答案。

    如何验证表单的示例:

    $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 &amp;&amp; '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>";
    

    【讨论】:

    • 非常感谢。 :) 你刚刚节省了我大量的时间。
    【解决方案3】:

    您正在 while 循环中执行。 然后试试这个:

    $i =1;
    
     while ($read_all_data = mysqli_fetch_assoc($result))
    { 
    $id=$read_all_data['id'];
    $a=$read_all_data['a'];
    $b=$read_all_data['b'];
    $c=$$read_all_data['c'];
    $d=$read_all_data['d'];
     echo $read_all_data['question']."</br>";
     echo "A:<input type ='radio' value ='a'  name=response'$i' >".$a."</br>";
     echo "B:<input type ='radio' value ='b'  name=response'$i' >".$b."</br>";
     echo "C:<input type ='radio' value ='c'  name=response'$i' >".$c."</br>";
     echo "D:<input type ='radio' value ='d'  name=response'$i' >".$d."</br>";
     $i++;
    }
    

    它将使您的电台名称为 response1、response 2 等等...

    【讨论】:

    • 先生,我还要问一件事。当用户提交测验时,我如何获得给定答案的所有值?
    • 当用户提交测验时,我如何获得给定答案的所有值?我在做 if(isset($_POST['submit'])) { $a=$_POST['response.$i']; }
    • POST 后你从哪里得到 $i
    • 我正在尝试从我的表单中获取问题的值。提交后我想取回这些值以与正确答案进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2013-05-04
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多