2016-04-16 9 views
8

Sto provando a creare un sistema di quiz di base. Il codice seguente mostra come l'utente sceglie la risposta usando radio butto e getresult.php confronta il valore di ingresso radio con la colonna di risposta. Nel mio database c'è una domanda, opt1, opt2, opt3, opt4 e answer colonne.Confronto solo del valore selezionato in loop per evitare il messaggio di errore

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

// getresult.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"; 
} 

tutto è corretto, ma se non si seleziona un pulsante di scelta da una domanda, vale a dire se lascio la questione viene visualizzato definito errore di offset che è ovvio ma come posso non mostrarlo. O come posso confrontare solo le opzioni scelte?

+2

Ho testato il codice e funziona come previsto. L'unica cosa che non riesco a riprodurre è il tuo database. Hai caratteri speciali nei campi del database? Nota a margine 1: il tuo codice HTML non è valido: apri '

' due volte. Nota a margine 2: ** MAI ** usare 'extract()' su '$ _GET' /' $ _POST'! È totalmente pericoloso. – fusion3k

+0

@ fusion3k ho fissato le note laterali. controllato tutti i campi del database. ma ancora non ha trovato la soluzione. – micky

+0

Su quale versione di PHP stai lavorando? – trincot

risposta

4

Si dovrebbe provare array_key_exists() come questo:

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

O meglio ancora, richiedere le risposte dal database basato sulle righe convalidati.

2

quando il modulo viene inviato, i valori scelti sono passati come (per esempio):

mycheck[1]=2 
mycheck[2]=3 
mycheck[3]=1 
mycheck[4]=2 

... ecc. Ora, se si lascia una domanda senza risposta, diciamo domanda 2, quindi nessun valore verrà inviato al server per quella domanda, in modo che i valori inviati potrebbero essere qualcosa di simile:

mycheck[1]=2 
mycheck[3]=1 
mycheck[4]=2 

quando i negozi PHP questo in $ _POST [], sarà un array associativo:

$_POST['mycheck'] === array(
    '1' => 2, 
    '3' => 1, 
    '4' => 2 
) 

Con extract($_POST) si ottiene il seguente valore per $ mycheck:

$mycheck === array(
    '1' => 2, 
    '3' => 1, 
    '4' => 2 
) 

Ora il seguente ciclo nel codice sarà ancora passare attraverso tutte le domande:

while($myrow = $result->fetch_assoc()) 
{ 
    if($mycheck[$myrow['id']]==$myrow['answer']) 
    { 
     $count=$count+1; 
    } 
} 

Ma (nell'esempio) l'assegno per la domanda 2 fallirà, perché $ myrow [ 'id'] volontà uguale a 2, mentre $ mycheck [2] non esiste. Questo produce l'errore offset non definito.

Come una domanda senza risposta, ovviamente, non dovrebbe aumentare il numero, si potrebbe risolvere il problema nel modo seguente: primo test se la questione è stata risolta (si fa $ mycheck hanno una voce per esso?), E solo se questo è il caso, recuperare la risposta da quella voce:

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

Per la prova in più di cui sopra è possibile utilizzare array_key_exists, o isset.

-2

Perché non si crea un nuovo pulsante di opzione "Non so", che sarebbe inizialmente controllati

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

Quindi per default tale pulsante verrà controllato.

+0

sarebbe ancora indefinito sul lato server, questo non sarebbe d'aiuto – Preuk

+0

Ho creato uno script di test online per uno dei miei clienti e questo trucco mi ha aiutato. Mi puoi spiegare l'errore –

+1

citando OP "se non seleziono un pulsante di opzione da una domanda, cioè se lascio la domanda viene visualizzato l'errore di offset non definito"; la tua soluzione aggiungerebbe una nuova opzione predefinita senza valore, che non farebbe alcuna differenza sulla parte "confronta solo l'opzione scelta". – Preuk

Problemi correlati