在循环中仅比较选定值以避免错误消息

Comparing only the selected value in loop to avoid error message

提问人:micky 提问时间:4/16/2016 最后编辑:Vini.g.fermicky 更新时间:4/24/2016 访问量:328

问:

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

<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">

得到结果:.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";
}

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

PHP 的MySQL

评论

2赞 fusion3k 4/17/2016
我已经测试了您的代码,它按预期工作。我唯一无法复制的是您的数据库。数据库字段中有特殊字符吗?旁注 1:您的 HTML 无效:您打开了两次。旁注 2:切勿在 / !这是完全不安全的。<form>extract()$_GET$_POST
0赞 micky 4/17/2016
@fusion3k我修复了旁注。已检查所有数据库字段。但仍然没有找到解决方案。
0赞 trincot 4/19/2016
您运行的是哪个版本的 PHP?
1赞 Tpojka 4/19/2016
我是对的吗,有两个表单开始标签?
0赞 miken32 4/19/2016
使用可能会为您节省几行代码,但它基本上是在告诉互联网“请将您喜欢的任何内容注入我的全局命名空间!extract($_POST);

答:

0赞 Vini.g.fer 4/19/2016 #1

在PHP上有点生锈,但是...... 你试过使用这个功能吗?还是适当地更改错误报告级别?isset()

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

4赞 Preuk 4/19/2016 #2

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

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

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

2赞 trincot 4/19/2016 #3

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

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
)

您将获得以下$mycheck值:extract($_POST)

$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

-2赞 Omkar Frozen 4/24/2016 #4

你为什么不创建一个新的单选按钮“不知道”,这将被初步检查

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

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

评论

0赞 Preuk 4/25/2016
值仍然是未定义的服务器端,这无济于事
0赞 Omkar Frozen 4/28/2016
我为我的一位客户创建了一个在线测试脚本,这个技巧帮助了我。你能解释一下这个错误吗?
1赞 Preuk 4/28/2016
引用OP“如果我没有从问题中选择单选按钮,即如果我离开问题,它会显示未定义的偏移错误”;您的解决方案将添加一个没有值的新默认选项,这对“仅比较所选选项”部分没有影响。
0赞 Omkar Frozen 4/29/2016
将数据库结构视为 [ques][option1][option2][option3][option4][correct ans]。正确的 ans 将存储正确的选项 no,例如 1,2,3,4 。如果用户提交了答案,则将所选值与 [correct ans] 进行比较,如果它是正确的,则递增 marks 变量。如果用户不选择任何答案并提交,则选择的选项将为 5,该选项永远不会等于 [正确答案] 的值。
0赞 Omkar Frozen 4/29/2016
为什么不使用 isset() 来检查是否选择了任何值。