0

クイズジェネレーターを作成しています。多肢選択式の回答用のラジオボタンが付いたHTMLフォームがあります。現在、フォームを送信すると、$_POST変数の内容は次のようになります。

Array ( [a1] => Bob [a2] => Bobby )

(ボブとボビーは私が選んだラジオボタンの選択肢です)

このフォームは、HTMLフォームのエコーに加えて、回答の配列を返すPHP関数を使用して生成しています。次のように、$ _ POST変数を変更して「answer」フィールド(回答を確認するため)を設定する方法はありますか?

 Array( [a1] => Bob [a2] => Bobby [answers] => Array( [0] => Bob [1] => Bilbo ))

上記は、$_POST配列を使用して回答配列をチェックするために私が考えた1つの方法でした。

編集:私がこれまでに持っているものに関する詳細情報:

  • HTMLフォームをエコーし​​、正解の配列を返すPHP関数getTest()があります。
  • getTest()は各質問をランダムに生成するため、正解はランダムです。
  • 主な問題は、2つの別々のPHPファイル、questions.phpとverify.phpがあることです。
    • question.phpは、getTest()を使用してフォームをエコーし​​、回答の配列を持っています。
    • verify.phpには$_POSTの内容しかありませんが、正解の配列はありません。

一般的なフォーム送信の結果を確認するためのより良い方法はありますか?ありがとう!

4

6 に答える 6

1

クイズを行う最良の方法は、回答配列とユーザー入力配列を用意することです。一方をループし、同じ増分を使用してもう一方と比較します。

すべての投稿変数を取得して、配列print_r($ _ POST);を作成できます。次に、これをループします。

$inputArray = //the post data into an array
$answerArray = array('a','b','a');
$numCorrect = 0;
for($a = 0; $a < count($inputArray); $a++)
{
if($inputArray[$a] == $answerArray[$a])
{
$numCorrect++;
}
}
于 2012-08-18T02:51:32.200 に答える
1

フォームを送信するときに回答を送信する場合は、ページに表示されない非表示タイプ(など)の入力を使用できます。ただし、ユーザーがページのソースHTMLをチェックするだけでこれらの回答が表示されるため、使用に適さない場合があります。お役に立てれば

于 2012-08-18T03:52:27.733 に答える
1

私はあなたがする必要があるのはセッションを見ることだと思います。

  • そうすれば、questions.phpで、セッション変数への回答を保存できます。
  • 次に、verify.phpで、セッション変数から回答を読み取り、$_POST変数によって提供される回答と比較できます。
于 2012-08-18T04:03:04.587 に答える
1

本当に必要な場合は、フォームの非表示フィールドを使用して回答配列を送信することもできます。ただし、誰でもソースを変更して、正解を変更できます。

最良の方法は、同じキー(a1、a2)を使用して、正しい答えを使用して、処理スクリプトに配列を含めることです。

処理スクリプトは次のようになります。

$answers = array('a1'=>'Robert', 'a2'=>'Hobo');

foreach($_POST as $key => $value)
{
   if (!array_key_exists($key, $answers))
   {
       continue;
   }

   if (trim($value) == $answers[$key])
   {
        // correct
   }
   else
   {
        // incorrect
   }
}
于 2012-08-18T04:23:32.350 に答える
0

$ _POSTに配列を含める場合は、フォームの名前フィールドで角かっこ配列表記を使用できます。

例えば:

<fieldset class="Question1"> 
  <input type="radio" name="answers[]" value="Question1Answer1">Question1Answer1<br>
  <input type="radio" name="answers[]" value="Question1Answer2">Question1Answer2<br>
  <input type="radio" name="answers[]" value="Question1Answer3">Question1Answer3<br>
</fieldset>

<fieldset class="Question2"> 
  <input type="radio" name="answers[]" value="Question2Answer1">Question2Answer1<br>
  <input type="radio" name="answers[]" value="Question2Answer2">Question2Answer2<br>
  <input type="radio" name="answers[]" value="Question2Answer3">Question2Answer3<br>
</fieldset>

<fieldset class="Question3"> 
  <input type="radio" name="answers[]" value="Question3Answer1">Question1Answer1<br>
  <input type="radio" name="answers[]" value="Question3Answer2">Question1Answer2<br>
  <input type="radio" name="answers[]" value="Question3Answer3">Question1Answer3<br>
</fieldset>

(フィールドセットタグはオプションであることに注意してください。グループ化するためにタグを含めただけです)

postの出力は、質問ごとに1つの要素を持つ配列$_POST['answers']になります。したがって、質問1に回答1を選択し、質問2に回答2を選択し、質問3に回答2を選択した場合、次のようになります。

$_POST['answers'] = [ 'Question1Answer1', 'Question2Answer2', 'Question3Answer2' ]
于 2012-08-18T02:59:24.093 に答える
0

わかりませんが、問題はX (XY問題であるのに対し、解決策Yを求めているように見えます

XY問題は、Xを実行する必要がある場合であり、Yを使用してXを実行できると考えているため、Yを実行する方法について質問します。実際に実行する必要があるのは、X問題が何であるかを示すことです。Yよりも優れたZソリューションがあるかもしれませんが、Xが言及されていない場合、誰もそれを提案することはできません。

通常、$ _ POST配列を変更したり、質問を含む回答をクライアント側に送信したりしないことはお勧めしません。questions.php代わりに、答えは必要ないので、アプローチはそうあるべきですが、そうする必要があるので、答えにアクセスできるのはshoulverify.phpだけです。verify.php

たとえば、解答リストが試験の際に質問用紙と一緒に試験会場に運ばれることはありません。

私はあなたのコード構造を自由に変更しました。それでも自分のコードを使いたい場合は、投稿してください。そうすれば、必要な答えを得ることができます。

これを使用してみてください:

question.php:

<form action="verify.php" method="POST">
<fieldset class="Question1"> Complete this: ___<b>bar</b>
  <input type="radio" name="answers[]" value="foo">Foo<br>
  <input type="radio" name="answers[]" value="too">Too<br>
  <input type="radio" name="answers[]" value="cho">Cho<br>
</fieldset>

<fieldset class="Question2"> Complete this: ___<b>overflow</b> 
  <input type="radio" name="answers[]" value="stack">Stack<br>
  <input type="radio" name="answers[]" value="stock">Stock<br>
  <input type="radio" name="answers[]" value="stick">Stick<br>
</fieldset>
</form>

answers.php:

//correct answers
$answers = array("foo", "stock");

verify.php:

include("answers.php");
$user_answers = $_POST["answers"];
$user_answers_count = count($user_answers);

$error = "";
for($i=0;$i<$user_answers_count;$i++)
    if($user_answers[$i] !== $answers[$i]) //verify
        $error[] = "Answer for Question ".($i+1)." is wrong!";

if(empty($error))
    //Notify that user has passed the Quiz
else
    //Notify that user has NOT passed the Quiz
    //print the $error array 

いくつかのメモ:

  • 私はanswers.php別のファイルとして使用しましたが、特別な要件がない場合は、answers.phpverify.phpanswers.phpコードを上に置くverify.php)をマージすることを検討してください。さらに良いことに、これら3つのファイルすべてを1つにマージすることもできます。
  • $_POSTはサニタイズされていると思います。
  • 質問とanswers配列のシーケンスは同じです。つまりanswers[foo]、正解です$_POST["answers"][foo]
于 2012-08-18T05:14:54.787 に答える