55 – 56 DBMS 3

Riprendendo il nostro form di login ed il nostro database quizmaker andremo ad implementare dei controlli tipo per verificare se al click sul pulsante nuovo utente la mail fosse già presente nella tabella users, se lo è si blocca la procedura, altrimenti inserisce i dati nel database. Con accedi stesso controllo, verifico i dati, altrimenti restituisco errore. I metodi per interfacciarsi col database possono essere o standard o con gli oggetti PDO (php data object). Iniziamo con la procedura standard. Riporto il codice del form. Usiamo il metodo di 2 pagine (anche se in precedenza abbiamo visto che la pagina del form può richiamare se stessa), la prima pagina per l’inserimento dei dati inseriti, la seconda per elaborarli ed inviarli al database.

 <!DOCTYPE html>
<html>
 <body style="background-color: lightgreen; ">
  <center> <h2> QUIZ MAKER LOGIN</h2></center>
   <form name="login" action="elogin1.php" method="POST">
    <table>
     <tr>
      <td>Email: </td>
      <td><input type="email" name="email" value="" /></td>
     </tr>
     <tr>
      <td>Password:</td>
      <td><input type="password" name="password" value="" autocomplete="off" /></td>
     </tr>
   </table>
 
    <input type="submit" name="btnAccedi" value="ACCEDI" />
    <input type="submit" name="btnNuovo" value="NUOVO UTENTE" />
    <input type="reset" />
   </form>
  </body>
</html>

Nella pagina elogin1.php inizio con un controllo sul fatto che la pagina sia stata richiamata dal metodo $_POST, tramite la chiave REQUEST_METHOD che dovrebbe essere presente come POST nell’ array $_SERVER. Se così non fosse vuol dire che la pagina potrebbe essere stata richiamata direttamente dall’url da qualche mal intenzionato e allora blocco la procedura:

 if ($_SERVER['REQUEST_METHOD'] =='POST')

Una volta sicuri che la sezioni POST contenga dati, e quindi abbiamo già eliminato un bel po’ di tentativi fraudolenti, andiamo a verificare quale pulsante è stato premuto, per fare questo ho precedentemente impostato un nome ai bottoni del form e controllo se un’azione arriva da uno di entrambi:

if(isset($_POST['btnAccedi']))
 {
   echo "Hai premuto ACCEDI";
 }
else 
 {
   echo "Hai premuto nuovo utente";
 }

Recupero i dati inseriti nei textbox email e password della form ricordando che la nostra chiave d’accesso da cui recuperiamo i dati inseriti è il name del nostri tag input (email e password) della form.

$email = $_POST['email'];
 // e della textbox password
$psw = $_POST['password'];

Una iterazione con un database server, tipicamente prevede i seguenti passi:

  1. Stabile una (o più) connessione/i con un server
  2.  Inviare il comando
  3. Elaborare il risultato
    ripetere eventualmente i passi 2 e 3
  4. Chiudere la connessione

Ora prepariamo il comando SQL  per recuperare la password dell’utente:

 $comandoSQL = "select psw from users where email ='" . $email ."' ";
 echo $comandoSQL;

la risposta del comando SQL è:

   select psw from users where email =’a@a.a’.

Adesso stabiliamo una connessione col database, per fare questo useremo il modulo mysqli:

 $conn = mysqli_connect("localhost","web_visitor","007","quizMaker");

Come primo parametro di mysqli_connect, specifichiamo l’indirizzo del server, si può inserire direttamente anche l’ ip con eventuale specifica porta. Il nome utente, la password e come ultimo argomento opzionale il nome del database. Non inserendolo, posso selezionare il database successivamente col comando mysqli_select_db, così’:

 mysqli_select_db($conn, "quizMaker");

L’utilità di tale comando, sta nel fatto che se nel mio script dovessi usare un altro database senza chiudere la connessione, potrei farlo con mysql_select_db.

A questo punto inviamo il comando SQL al database con mysqli_query:

 $risultato = mysqli_query($conn, $comandoSQL);

$risultato è un insieme di dati, quindi un array. $comandoSQL restituirà la password associata alla mail inserita nella form.

A questo punto vado a confrontare se la password inserita nel form è uguale a quella presente nel database con un if e il comando mysqli_fetch_assoc:

if ($riga = mysqli_fetch_assoc($risultato) )
{
 echo "Trovato" . $nl;
 $autenticato = ($psw === $riga['psw']);
}
 else 
 $autenticato = false;

mysqli_fetch_assoc è una funzione che normalmente viene usata con un ciclo while per estrarre i dati di una tabella ed inserirli in un array:

while($riga = mysqli_fetch_assoc($risultato) ); Nel nostro specifico caso il risultato dei dati estratti è solo 1 (la psw di quella email), conseguentemente ho usato un if di confronto, senza utilizzare il ciclo di estrazione records.

con mysqli_fetch_assoc ogni riga della tabella viene estratta da $risultato, quindi sarà $riga un array associativo. Tale riga sarà composta dai campi che ho richiesto con $comandoSQL ovvero in questo caso solo il campo psw (select psw from users) della tabella utenti. Poi confronto l’uguaglianza tra $psw (la password inserita nella form ) con $riga[‘psw’] la password trovata nel database. Se la password non è uguale restituisco false.

Inseriamo nel ns database un paio dei dati per prova e testiamo lo script.

 mysqli_close($conn);

abbiamo chiuso la connessione

Ecco il codice completo

<!DOCTYPE html>
<html>
 <head></head>
 <title>ELOGIN</title>
<?php
$nl="<br />";

// Un controllo per sicurezza
if ($_SERVER['REQUEST_METHOD'] =='POST')
{
 // Si la pagina è stata davvero richiamata dalla form

 //recupero il contenuto della textbox email
 $email = $_POST['email'];
 // e della textbox password
 $psw = $_POST['password'];

 //Vediamo se il bottone è premuto
 if(isset($_POST['btnAccedi']))
 {
 $comandoSQL = "select psw from users where email ='" . $email ."'";
 //echo $comandoSQL;

 //connessione
 $conn = mysqli_connect("localhost","web_visitor","007");

 //selezionare il database
 mysqli_select_db($conn, "quizMaker");

 //inviare il comando SQL
 $risultato = mysqli_query($conn, $comandoSQL);

 //confronto le psw
 if ($riga = mysqli_fetch_assoc($risultato) )
 {
 echo "Trovato" . $nl;
 $autenticato = ($psw === $riga['psw']);
 }
 else
 $autenticato = false;
 // chiudere la connessione
 mysqli_close($conn);

 if ($autenticato)
 echo "Ok, superato il check" . $nl ;
 else echo "Autenticazione fallita" . $nl ;

 }
 else
 { echo "Hai premuto nuovo utente"; }
}

?>
</html>