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>