60 DBMS 5 – nuovo utente

rivediamo il codice di elogin1.php per implementare la registrazione di un nuovo utente. Dapprima è necessario un controllo se quella mail non è già presente nel ns database, quindi la connessione.

Ho cambiato il nome a $risultato di mysqli_query, per non avere confusione. ricordo che la @ davanti alla funzione disabilita eventuali warning che potrebbero infastidire.

$risultatoRicercaEmail = @mysqli_query($conn, $comandoSQL);

aggiungiamo exit dopo l’ header per interrompere l’esecuzione del codice, visto che il browser cambia pagina, non voglio che ci sia la possibilità che il codice continui ad andare avanti

 if($autenticato)
 {
  $_SESSION['iduser']=$riga['iduser']; 
  header("Location: main.php");
 }
 else
  header("Location: login.php?errore=1");
 
 exit;

ora andiamo nella parte finale dove c’era

 else
 { echo "Hai premuto nuovo utente"; }

cancellando l’echo che dice che si è premuto il bottone nuovo utente, andiamo a fare il controllo se la mail è inserita è già presente:

if ( mysqli_fetch_assoc($risultatoRicercaEmail) )
 {
 mysqli_close($conn);
 header("Location: login.php?errore=2"); //email gia' presente
 exit;
 }

ora possiamo procedere a generare il comando SQL di inserimento, ricordando che l’iduser del database è un campo che mysql genera automaticamente:

$comandoSQL = "insert into users values (null,'".$email."','".$psw."')";

memorizziamo l’esito della query di inserimento in una variabile. mysqli_query restituisce o true o false .

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

ora faccio il controllo sull’esito

  $_SESSION['iduser'] = mysqli_insert_id( $conn );
  mysqli_close($conn);
  header("Location: main.php");

visto che non posso assegnare a $_SESSION[‘iduser’] un id che ancora non so, uso la funzione mysqli_insert_id, che va a recuperare l’ ultimo id generato dall’ultima query lanciata in quella connessione (quella di $esito). Impostato l’id di sessione si chiude la connessione

 mysqli_close($conn);

e poi si indirizza a main.php

 header("Location: main.php");

interessante anche reindirizzare per esempio a main.php?status=new , così che main.php possa gestire in partenza  il nuovo utente proponendo per esempio la personalizzazione del suo profilo.

Se per qualche motivo il comando di inserimennto fallisse chiudiamo comunque la connessione e reindirizziamo alla form

mysqli_close($conn);
header("Location: login.php?errore=3"); //inserimento fallito

ecco il codice completo del controllo e dell’inserimento

if ($esito)
 {
  $_SESSION['iduser'] = mysqli_insert_id( $conn );
  mysqli_close($conn);
  header("Location: main.php");
 }
 else
 {
  mysqli_close($conn);
  header("Location: login.php?errore=3"); //inserimento fallito
 }
 
 exit;

nella parte finale concludo con un else riferito a

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

che qualcuno in buonafede o no ha richiamato la pagina elogin1.php senza passare dal bottone

else
{
  header("Location: login.php?errore=4"); //non autenticato
 exit;  
}

Interessante notare che si è attribuito un codice di errore con numero arbitrario che potrebbe essere usato per la gestione degli errori, magari con messaggi differenti in base al codice. Per fare questo ho uso javascript o php. Riporto il codice di dbms_form1.php con la gestione degli errori:

<!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>

<?php
 if( isset($_GET['errore']) )
 {
 echo "<p id='box_errore'".
 " style='background-color: red; font-weight: bold; color: yellow; border: 2px solid white;'>";
 
 switch ($_GET['errore'])
 {
 case 1:
 echo "Errore 1: non sei autenticato";
 break;
 
 case 2:
 echo "Errore 2: la mail è giaà presente";
 break;

 case 3:
 echo "Errore 3: non è stato possibile inserire";
 break;
 
 case 4:
 echo "Errore 4: Devi passare da questo login";
 break;
 }
 echo "</p>"; 
 }
 ?>
 </body>
</html>

da notare

 if( isset($_GET['errore']) )

che dice: se è settato nella variabile $_GET dell’url: errore e in caso positivo i vari case in base al numero di errore

Ecco invece il codice di main.php

<?php
 session_start();
 if (!isset($_SESSION['iduser']) )
 { header("Location: dbms_form1.php?errore=4"); //user non autenticato
 exit;
 } 
?>
<!DOCTYPE html>
<html>
 <head>
 <title>Untitled</title>
 </head>
<body>
 Benvenuto!
<?php
 session_unset();
 session_destroy();
?>
</body>
</html>

e quello di elogin1.php

<?php
 session_start();

 $nl="<br />";

 //recupero credenziali da file ESTERNO alla cartella pubblica del sito
 $accessData=parse_ini_file('../../../pippo.ini');
 
 //prima di tutto un po' di sicurezza ...
 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 //ok la pagina è stata davvero richiamata dalla form
 
 //recupero il contenuto della textbox email
 $email = $_POST['email'];
 
 //... e quello della textbox password
 $psw = $_POST['password'];
 
 //1 stabilire una (o più) connessione/i con un server
 //NB: con @ si sopprimono i warning/errori del comando
 $conn = @mysqli_connect("localhost",$accessData['username'],$accessData['password']);
 
 if(!$conn)
 {//gestione dell'errore
 
 //echo mysqli_connect_errno() . $nl;
 //echo mysqli_connect_error() . $nl;
 //echo mysqli_sqlstate( $conn ) . $nl;
 echo "Connessione al server fallita. Impossibile procedere. Contattare ...";
 die; 
 }
 
 //2 selezionare il db con cui lavorare
 if ( !@mysqli_select_db($conn, $accessData['dbname']) )
 {
 echo "Non trovo il data base ...".$nl;
 echo mysqli_sqlstate( $conn ) . $nl;
 echo mysqli_errno( $conn ) . $nl;
 echo mysqli_error( $conn ) . $nl;
 die; 
 }
 
 $comandoSQL =
 "select iduser, psw from users where email ='" . mysqli_escape_string($conn, $email) ."'";
 
 //2 inviare il comando
 $risultatoRicercaEmail = @mysqli_query($conn, $comandoSQL);
 
 
 //quale bottone è stato premuto, 'accedi' o 'nuovo utente'?
 if (isset($_POST['btnAccedi']))
 {
 
 if ($risultatoRicercaEmail) //la query ha avuto successo
 {
 //3 elaborare il risultato
 if ($riga = mysqli_fetch_assoc($risultatoRicercaEmail) ) //mail trovata, confrontiamo psw
 {
 //echo "Trovata".$nl;
 $autenticato = ($psw === $riga['psw']); 
 }
 else
 $autenticato = false;
 
 //4 chiudere la/le connessione/i
 mysqli_close($conn);
 
 //redirect
 if($autenticato)
 {
 $_SESSION['iduser']=$riga['iduser']; 
 header("Location: main.php");
 }
 else
 header("Location: dbms_form1.php?errore=1");
 
 exit;
 }
 else //fallita mysqli_query
 {
 echo "Problemi con il server data base ...".$nl;
 echo mysqli_sqlstate( $conn ) . $nl;
 echo mysqli_errno( $conn ) . $nl;
 echo mysqli_error( $conn ) . $nl;
 die; 
 }
 }
 else
 {
 //BOTTONE NUOVO UTENTE
 if ( mysqli_fetch_assoc($risultatoRicercaEmail) )
 {
 mysqli_close($conn);
 header("Location: dbms_form1.php?errore=2"); //email gia' presente
 exit;
 }
 
 //insert into users values (null, 'e@j.com','eee')
 $comandoSQL = "insert into users values (null,'".$email."','".$psw."')";
 $esito = mysqli_query($conn, $comandoSQL);
 
 if ($esito)
 {
 $_SESSION['iduser'] = mysqli_insert_id( $conn );
 mysqli_close($conn);
 header("Location: main.php");
 }
 else
 {
 mysqli_close($conn);
 header("Location: dbms_form1.php?errore=3"); //inserimento fallito
 }
 exit; 
 }
}
else
{
 header("Location: dbms_form1.php?errore=4"); //non autenticato
 exit; 
}
?>
</body>
</html>