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