Presentare i Risultati degli Utenti, la Classifica in PHP

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.

<< Lezione PrecedenteInizio Tutorial

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in PHP e contrassegnata con . Contrassegna il permalink.

5 risposte a Presentare i Risultati degli Utenti, la Classifica in PHP

  1. giovanni scrive:

    e il databse mysql per la classifica?

  2. giovanni scrive:

    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

    • Giampaolo Rossi scrive:

      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!

  3. giovanni scrive:

    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

I commenti sono chiusi.