2017-07-20 3 views
1

ループ内のデータベースからデータをフェッチするクエリがあり、ループの各インスタンスごとにフォームが作成されます。ループ自体内の各フォームデータの値と、それはデータベース内の対応する行の列と一致するかどうかを確認します。例えばためPHPは、フォームがデータベースからフェッチされたループ内にあるときにフォームデータを取得します

<?php 
    $marks = 0; 
    while ($row= mysqli_fetch_assoc($resut)) { 
     echo '<form method="POST" action=""> 
     <div class="col-sm-8" id="question">'.$row['question'] .'</div> 
     <input type="radio" placeholder="" name="answer" value = "true" id=""> True 
     <input type="radio" placeholder="" name="answer" value = "false" id=""> false 
    </form>'; 

     if (isset($_POST['save'])){ // this is the submit button present outisde the loop at last 
     if ($_POST['answer'] == $row['answer']) { 
      $marks++; 
     } else { 
      echo "incorrect"; 
     } 
     } 
    } 
?> 
<form role="form" action="" method= "POST"> 
    <button name ="save" id=" class="btn btn-primary">Save</button> 
</form> 

それでは、私が達成しようとしていることは、私が列を持っているということですデータベース内でループ内で$row['answer']を取得できます。この行のフォームデータを確認するには、if($_POST['answer'] == $row['answer']) .. .do smth ...しかし問題は、ループの外側に送信ボタンを残しておかなければならないということですループは機能していません。

私の試み:

  1. 私はループの前にformタグを維持しようとしました。これを行うと、データベースに10行あり、ループ内で10個のフォームと10個の値が必要になるとします。しかし、行の1つでラジオボタンを押すと、他のものは選択解除されます。だから私の意見では、フォームタグはループ全体の中だけにあるはずです。

  2. フェッチされた行のすべてのインスタンス内のwhileループ内にフォーム送信ボタン(現時点では最後)を保持しようとしました。再度、それは動機ではないすべての行のすべてのボタンをエコーし​​ます。私はすべてのフォームを提出し、それに応じて値を取得するボタンを1つだけ必要とします。

  3. また、ループのすべてのインスタンス、つまり$row['answer']のフォームラジオボタンデータのすべてのインスタンス(つまり、$_POST['answer'])を確認する必要があるため、このチェックを外部または他のページで行うことはできません。

ありがとうございます。

+0

ですから、データベースから正しい答えをロードし、利用者の解答と比較何をここで行うのですか?それは間違ったアプローチです。フォームが提出されたら、回答のチェックを行う必要があります。 – hungrykoala

+0

NO!まずユーザー自身のために存在するフォームがデータベースから作成されます。これらは実際には管理者が質問表にアップロードした質問です。後でそれがquiz.phpに取り込まれます。フォームがループ内で生成されます –

+0

私が間違っていないのであれば、ここで何をしようとしているのですか?質問を表示し、ラジオボタンを選択して保存をクリックすることでユーザーに答えさせます。そのロジックの問題は、 '$ _POST ['answer']'は最後の値を保存するだけなので、現在の実装はうまくいきません。ここで行う必要があるのは、各回答を配列に格納し、その配列を使用してその答えが正しいかどうかを確認することです。 – hungrykoala

答えて

1

すべての回答を一度に送信する場合は、1つのフォームを使用する必要があります。

これを行うには、各質問ごとに異なるようにinputnameを変更することができます。

$marks = 0; 
$idx = 0; 
echo '<form method="POST" action="">'; 
while ($row= mysqli_fetch_assoc($resut)) { 
    ++$idx; 
    echo 
    '<div class="col-sm-8" id="question">'.$row['question'].'</div> 
    <input type="radio" placeholder="" name="answer'.$idx.'" value = "true" id=""> True 
    <input type="radio" placeholder="" name="answer'.$idx.'" value = "false" id=""> False'; 

    if (isset($_POST['save'])) { // this is the submit button present 
    outisde the loop at last 

     if ($_POST['answer'] == $row['answer']) { 
      $marks++; 
     } else { 
      echo "incorrect"; 
     } 
    } 
} 
echo '</form>'; 

また、あなたはシングル$_POST['answer']エントリを与えるブラケット、間$idxを注入することができますが、その代わりに、文字列の配列になります。その配列は、あなたが$idxとして注入キーにassignatedすべてのあなたの答えが含まれています:

<input type="radio" placeholder="" name="answer['.$idx.']" value = "true" id=""> True 
<input type="radio" placeholder="" name="answer['.$idx.']" value = "false" id=""> False 
+0

フォームデータ、$ _POST ['answer']や$ _POST ['answer' $ idx]をどうすればいいですか? –

+0

@ GauravMaharjanあなたが選んだものに応じて、 '$ _POST ['answer1']'と '$ _POST ['answer'] [1]'の間にあります。 情報が同じ方法で扱われる場合、特にあなたがどれくらい持っているかわからない場合は、 'name =" answer ['。$ idx。'] "メソッド - これにより、 '$ _POST ['answer'] [1]'、 '$ _POST ['answer'] [2]' ...を使ってデータにアクセスする方が、実装する方がずっと簡単です。 – ksjohn

関連する問題