69 Preparazione ai Prepared statements

Si utilizzerà solo la versione procedurale, la versione OOP la si riprenderà con i PDO

I prepared statements sono molto efficaci ogni qualvolta abbiamo la necessità di ripetere molte volte lo stesso comando SQL.

Ritorniamo al nostro programma ed eravamo rimasti che l’utente sceglieva se era docente o alunno e, una volta superato il login, veniva indirizzato alla pagina main.php. La scelta del tipo di utente l’ avevamo memorizzata nella elogin_migliorata_oop.php dentro la variabile di sessione $_SESSION

$_SESSION['tipo_utente']=$riga['tipo_utente'];

Tale scelta vuol dire che non memorizzeremo nella tabella users un campo aggiuntivo per il tipo utente. Questo da una parte ha il vantaggio di non dover salvare dati doppi, se ad esempio un docente vuole seguire altri quiz come studente. L’attenzione va posta, però, nel controllo dello status con il quale l’utente è entrato.

Ricreando un po’ tutte le pagine per fare un po’ di pulizia e rinominando la vecchia cartella quizmaker in quizmaker vecchio, nella nuova elogin.php la riga di memorizzazione del tipo di utente sarà:

$_SESSION['tipo_utente']=$tipo_utente;

nella main.php vado a recuperare questo stato

$tipo_utente = $_SESSION['tipo_utente'];

ed effettuo 2 condizioni, se è docente creo una minimale interfaccia (giusto per esempio) con delle funzioni previste per il docente

if ($tipo_utente=='docente')
 {  
 echo "<li> <a href='gestione_argomenti.php'> Gestione Argomenti </a> </li>\n";
 echo "<li> <a href='gestione_domande.php'> Gestione Domande </a> </li>\n";
 echo "<li> <a href='crea_questionario.php'> Crea un questionario </a> </li>\n";
 }
 else
 ; //qui dovremmo generare l'interfaccia per lo studente

i tag <li> (list item) fanno parte di una lista <ul> (unorderer list) che avrò precedentemente creato, (in fondo scriverò il codice completo). Ogni list item indirizza ad una pagina php, quella che andremo ad esaminare è la crea_questionario.php, che si presenta in questo modo:

Descrizione questionario:

Scegliere un argomento_: 

Nel primo campo il docente attribuisce un nome al questionario, nel secondo si sceglie l’argomento dalla drop down list, la cui lista è composta da tag <option> recuperati da php dal database. A noi restituirà il value (quindi l’elenco degli argomenti) mentre invierà al browser il codice di quell’argomento con la proprietà selected, per far capire al browser quale è argomento è stato scelto.

Una volta cliccato il pulsante Domande per l’argomento scelto, php richiama la stessa pagina con la action del tag <form> (la pagina php richiama se stessa), recuperando e inserendo col metodo POST i dati inseriti (descrizione e argomento) e aggiungendo un altro form con dei check box per le domande di quell’argomento scelto.

Descrizione questionario:

Scegliere un argomento_: 

Scegli le domande che compongono il questionario
 Domande dell’argomento scelto
Per capire se è la seconda volta che carico la pagina, nel secondo form (quello delle domande) eseguirò un controllo se è settato un valore dalla lista argomenti e l’id argomento verrà confrontato al suo value e sarà selected
if( isset($_POST['elenco_argomenti']) &&
 $riga['idargomento']==$_POST['elenco_argomenti'])
 echo "selected";

Quando andrò a cliccare sul bottone Registra i dati del questionario, oltre ai check box delle domande, devo recuperare i dati anche del primo form. Un metodo è quello di inserirli in un tag <input> di tipo hidden, che non si vedrà perché nascosto, ma sarà inviato come gli altri elementi:

echo "<input type='hidden' value='".$_POST['descrizione']."' />";

poi sceglierò le domande flaggate nei check box usando il seguente comando SQL

$comandoSQL = "select * from domande where fkargomento='".
 $_POST['elenco_argomenti']."'";

poi con il ciclo finale scelgo le domande checkate

while ($riga = mysqli_fetch_assoc($risultato) )
 {
 echo "<input type='checkbox' name='domande_scelte[]' ".
 "value='".$riga['iddomanda']."'>";
 echo $riga['testo_domanda']."\n".$nl;

ecco il codice html generato dal browser e visualizzando la sorgente:

 <form name="argomento" action="crea_questionario.php" method="post">
Descrizione questionario:
<input type="text" name="descrizione" value="test geografia - Marzo 2016"><br>

Scegliere un argomento_:
<select name="elenco_argomenti">
 <option value="1"> storia</option>
<option value="2" selected=""> geografia</option>
<option value="3"> chimica</option>
<option value="4"> informatica</option>
</select>
<br>
<input type="submit" name="ok" value="Domande per l'argomento scelto">

</form>

<form name="scelta_domande" action="registra_dati_questionario.php" method="post"><input type="hidden" value="test geografia - Marzo 2016">Scegli le domande che compongono il questionario <br><input type="checkbox" name="domande_scelte[]" value="3">La Russia confina con la Turchia?
<br><input type="checkbox" name="domande_scelte[]" value="4">Qual'è il fiume più lungo della Francia
<br><br><input type="submit" name="ok" value="Registra i dati del questionario">
</form>
Descrizione questionario:
Scegliere un argomento_:
Scegli le domande che compongono il questionario
La Russia confina con la Turchia?
Qual’è il fiume più lungo della Francia

Ed ecco il codice della pagina php

<?php
 include($_SERVER['DOCUMENT_ROOT']."/fagtest/my_include/setup_con_DB.php");

 if ( !isset($_SESSION['iduser']) )
 {
 header("Location: login.php?errore=autenticazione_richiesta"); //user non autenticato
 exit;
 }

 //recupero credenziali da file ESTERNO alla cartella pubblica del sito
 $accessData=parse_ini_file($cartella_ini . 'confagtest.ini');
 
 //connessione e selezione db
 $conn = @mysqli_connect("localhost",$accessData['username'],$accessData['password']); 
 
 if(!$conn)
 { echo "Connessione al server fallita. Impossibile procedere. Contattare ...";
 die; 
 }
 
 if ( !@mysqli_select_db($conn, $accessData['dbname']) )
 {
 echo "Non trovo il data base ...";
 die; 
 }
 
 ?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
 <title>CREAZIONE QUESTIONARIO</title>
</head>

<body>
<form name="argomento" action="crea_questionario.php" method="post">
Descrizione questionario:
<input type="text" name="descrizione"
//se siamo ritornati sulla pagina dopo aver scelto largomento riproponiamo
//la descrizione precedentemente inserita 
<?php
if( isset($_POST['descrizione']) )
 echo " value='".$_POST['descrizione']."'";
echo " />"; //fine input
?>
<br />

Scegliere un argomento_:
<select name="elenco_argomenti">
 <?php
 //leggiamo elenco argomenti dalla tabella argomenti 
 $comandoSQL = "select * from argomenti";
 $risultato = @mysqli_query($conn, $comandoSQL);
 
 while ($riga = mysqli_fetch_assoc($risultato) )
 {
 echo "<option value='".$riga['idargomento']."' ";
 
 //siamo ritornati su questa pagina dopo aver scelto l'argomento
 //e siamo sulla option corrispondente alla scelta fatta? -> selected
 if( isset($_POST['elenco_argomenti']) &&
 $riga['idargomento']==$_POST['elenco_argomenti'])
 echo "selected";
 
 echo "> ".$riga['argomento']."</option>\n";
 }
 ?>
</select>
<br />
<input type="submit" name="ok" value="Domande per l'argomento scelto" />

</form>

<?php
 //solo se avevamo già scelto l'argomento crea una form con la lista delle domande
 //abbinabili
 if( isset($_POST['elenco_argomenti']) )
 {
 echo "<form name='scelta_domande' action='registra_dati_questionario.php'".
 " method='post'>";
 
 //descrizione riproposta come campo nascosto ...
 echo "<input type='hidden' value='".$_POST['descrizione']."' />";
 
 echo "Scegli le domande che compongono il questionario ".$nl;
 $comandoSQL = "select * from domande where fkargomento='".
 $_POST['elenco_argomenti']."'";
 
 $risultato = @mysqli_query($conn, $comandoSQL);
 while ($riga = mysqli_fetch_assoc($risultato) )
 {
 echo "<input type='checkbox' name='domande_scelte[]' ".
 "value='".$riga['iddomanda']."'>";
 echo $riga['testo_domanda']."\n".$nl; 
 
 }
 echo $nl."<input type='submit' name='ok' ".
 "value='Registra i dati del questionario' />\n";
 echo "</form>";
 mysqli_close($conn);
 }
 else
 mysqli_close($conn);
?> 

</body>
</html>