Nell’articolo scorso, dedicato a questa breve guida su come creare un semplice questionario in PHP, ci siamo focalizzati sulle domande e rispettive risposte con punteggio, questa volta vedremo come mostrare il totale stabilito, agli utenti che hanno terminato la prova e visualizzare anche la classifica delle prime 50 posizioni, inserendo un nickname. Passiamo subito a mostrare la pagina web che svolge questo compito, poi la commenteremo:
<?php $hostname = "xxxxx"; $database = "xxxxx"; $username = "xxxxx"; $password = "xxxxx"; $classifica = mysql_connect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR); $argomento = $_REQUEST['xxxxx']; if (strlen($argomento) <= 0) { mysql_close($classifica); header("location:../"); exit(); } mysql_select_db($database, $classifica); $totPunteggio = 0; $punteggio = mysql_query("SELECT * FROM Domande WHERE Argomento = ". $argomento, $classifica) or die(mysql_error()); $row_punteggio = mysql_fetch_assoc($punteggio); $num_punteggio = mysql_num_rows($punteggio); for ($i = 0; $i < $num_punteggio; $i++) { $r1 = $row_punteggio['Valore1']; $r2 = $row_punteggio['Valore2']; $r3 = $row_punteggio['Valore3']; if ($r2 > $r1) $r1 = $r2; if ($r3 > $r1) $r1 = $r3; $totPunteggio += $r1; $row_punteggio = mysql_fetch_assoc($punteggio); } mysql_free_result($punteggio); $data_classifica = mysql_query("SELECT * FROM Classifica WHERE Argomento = ".$argomento. " ORDER BY Punteggio DESC LIMIT 0,50", $classifica) or die(mysql_error()); $row_classifica = mysql_fetch_assoc($data_classifica); $num_classifica = mysql_num_rows($data_classifica); ?> <html> <head> <title>Classifica</title> <meta name="Description" content="Classifica."> </head> <body> <table align="center" width="970" height="300" border="0" cellpadding="0" cellspacing="0"> <tr> <td width="970" align="center" valign="top"> <br> <p align="center" class="firsttitle">Classifica</p> <br> <?php switch ($argomento) { case 1: $str_argomento = "Java"; break; case 2: $str_argomento = "C/C++"; break; ... } echo '<p align="center">Benvenuto nella classifica dei primi 50 posti del questionario su '.$str_argomento.'</p>'; echo '<p align="center">Il punteggio massimo che si può ottenere in questa prova è: <b>'.$totPunteggio. '</b></p><br><br>'; echo '<table width="500" align="center" cellpadding="0" cellspacing="0" border="0">'; for ($i = 0; $i < $num_classifica; $i++) { $j = $i + 1; echo '<tr>'; if (($i % 2) == 0) { echo '<td width="50" align="center" bgcolor="#517993">'.$j.'</td>'; echo '<td width="350" align="left" bgcolor="#517993">' .$row_classifica['Nome'].'</td>'; echo '<td width="100" align="center" bgcolor="#517993">' .$row_classifica['Punteggio'].'</td>'; } else { echo '<td width="50" align="center" bgcolor="#43647A">'.$j.'</td>'; echo '<td width="350" align="left" bgcolor="#43647A">' .$row_classifica['Nome'].'</td>'; echo '<td width="100" align="center" bgcolor="#43647A">' .$row_classifica['Punteggio'].'</td>'; } echo '</tr>'; $row_classifica = mysql_fetch_assoc($data_classifica); } echo '</table><br><br>'; echo '<p align="center">Quanto conosci '.$str_argomento.'? Fai il <a href="domande_risposte.php?argomento='. $argomento.'">questionario</a> per vedere se rientri in questa classifica.</p>'; ?> </td> </tr> </table> </body> </html> <?php mysql_free_result($data_classifica); mysql_close($classifica); ?>
Come potete notare dal codice, prima viene calcolato il punteggio massimo che è possibile stabilire nella prova, questo è volutamente non fisso per adeguarsi al possibile cambiamento delle domande in futuro, quindi vengono ricavati i primi 50 punteggi più alti della classifica e semplicemente mostrati. Ho inserito anche un piccolo ritocco ai colori della tabella dei punteggi alternando un colore più chiaro ed uno più scuro nel caso sia la riga dispari o pari. Non credo che la pagina sia fonte di grande difficoltà e spero che tutta la serie di questi tre articoli sulla creazione di un questionario in PHP vi possa essere utile per scopo didattico o altro.
e il databse mysql per la classifica?
Il database è formato da una sola tabella la cui struttura è stata descritta all’inizio del tutorial.
chiedo scusa probabilmente sono io che ho confuso qualcosa.
All’inizio del tutorial viene descritto di creare un database chiamando domande del tipo
CREATE TABLE Domande (
Argomento INT(2),
Domanda VARCHAR(200),
Risposta1 VARCHAR(150),
Valore1 INT(10),
Risposta2 VARCHAR(150),
Valore2 INT(2),
Risposta3 VARCHAR(150),
Valore3 INT(2)
);
ma nel tutorial finale viene richiamata una query da una tabella diversa
“SELECT * FROM Classifica
potrei avere maggiori delucidazioni su questo passaggio?
per il resto ottimo script che funziona perfettamente
La tabella classifica è quella che serve per inserire il nome di chi ha fatto le domande e la sua struttura è questa:
Nome varchar(50)
Punteggio int(4)
Argomento int(2)
Nel questionario, per renderlo più professionale, c’è anche un altro lavoro da fare, perché se si vede il sorgente della pagina si possono vedere i valori del punteggio ed allora si potrebbe barare. Nel mio questionario, che ho riveduto e corretto, ho crittografato quei valori ed ora infatti le prove sono molto più complicate. Magari vado avanti con il tutorial mostrando come si può crittografare ( ovviamente con un metodo diverso dal mio, altrimenti qualcuno potrebbe barare sui miei questionari di informatica 🙂 ) i punteggi delle domande. Un’altra modifica da poter fare è quella di non cambiare pagina ed utilizzare Ajax. Vedremo se in futuro ho tempo per apportare queste modifiche, perché intanto non ci provi tu?
Buonanotte!
si ho gia provveduto a crittare i sorgenti ed implementato un sistema di login un po piu complesso per la pagina admin.
ora sto facendo in modo che l’utente debba iscriversi prima di fare il quiz e che la classifica si autoincrementi da sola alla fine del test, sovrascrivendo un eventuale punteggio ( migliore ) da parte di un utente che abbia gia fatto il test.
Appena finisco saro lieto di postare i codici