Registrazione e Login con PHP e MySQL:
- Struttura delle cartelle
- Creazione tabella MySQL per gli utenti
- Form di registrazione
- Script che memorizza i dati nella tabella utenti
- Form di login
- Script che verifica i dati per il login
- Link utili
Struttura delle cartelle
Per migliorare l’ordine del nostro codice dividiamo in quattro cartelle:
public
contiene i formsconfig
contiene i file per connettersi al databasefunctions
il fileutility.php
dove scriviamo le funzioni riutilizzabili nell’applicazionesrc
gli script per registrarsi e per fare il login

Creazione tabella MySQL per gli utenti
Utilizziamo il database News creato nella lezione: Invio e Ricezione dati con PHP e creiamo la tabella per gli utenti con il seguente codice:
CREATE TABLE `users` (
`id` int(11) AUTO_INCREMENT PRIMARY KEY,
`email` varchar(60) NOT NULL,
`password` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Form di registrazione
Nella cartella public creiamo un nuovo file chiamandolo register-form.php
Come trattato nelle scorse lezioni, facciamo una validazione client-side con gli strumenti built-in di HTML 5
<?php
?>
<!DOCTYPE html>
<html>
<head>
<title>Register Form</title>
</head>
<body>
<form action="../src/register.php" method="post">
<label for="email">Email</label>
<input type="email" name="email" maxlength="60" required/><br>
<label for="password">Password</label>
<input type="password" name="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" required/><br>
<small>un numero, una lettera maiuscola, una minuscola e almeno 8 caratteri</small>
<input type="submit"/><br>
</form>
</body>
</html>
entrambi i campi sono required
, la lunghezza massima dell’email è di 60 caratteri in accordo con le specifiche della tabella users creata prima. Per maggiori informazioni sui form in HTML 5 puoi leggere questa lezione HTML: i Form
Script che memorizza i dati nella tabella utenti
Nella cartella src
crea un nuovo file register.php
<?php
require '../config/db_connect.php';
require '../functions/utility.php';
$email=$_POST['email'];
$password=$_POST['password'];
$email=filter_var($email, FILTER_SANITIZE_EMAIL);
$password=sanitizeString($password);
$sql="SELECT * FROM users WHERE email='$email'";
$result=$conn->query($sql);
if($result->num_rows>0){
echo "L'utente con questa email: ".$email." è già registrato";
}else{
$password=md5($password);
$sql="INSERT INTO users(email,password) VALUES('$email','$password')";
if($conn->query($sql)===TRUE){
echo "Registrazione effettuta";
}else{
echo $conn->error;
}
}
$conn->close();
?>
includiamo i file db_connect.php
che stabilisce la connessione con il database news e utility.php
in cui abbiamo la funzione per sanificare le stringhe. Questi files ed il resto della lezione la puoi scaricare dalla mia repository GitHub .
La prima query SELECT * FROM users WHERE email='$email
la utilizzo per verificare se esiste già un utente registrato con quella email, se non produce risultati allora procedo all’inserimento dell’utente previa crittografia della password con la funzione md5
.
L’md5
è una funzione hash crittografica ed è unidirezionale ovvero una volta eseguita non esiste il metodo inverso per riottenere la stringa di partenza. La stringa in output sarà sempre di 32 caratteri (128 bit).
Form di login
Il form per il login è quasi identico a quello per la registrazione, cambia solamente il valore dell’attributo action
del form
, in questo caso invieremo i dati al file login.php
<?php
?>
<!DOCTYPE html>
<html>
<head>
<title>Login Form</title>
</head>
<body>
<form action="../src/login.php" method="post">
<label for="email">Email</label>
<input type="email" name="email" maxlength="60" required/><br>
<label for="password">Password</label>
<input type="password" name="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" required/><br>
<small>un numero, una lettera maiuscola, una minuscola e almeno 8 caratteri</small><br>
<input type="submit"/>
</form>
</body>
</html>
Script che verifica i dati per il login
<?php
require '../config/db_connect.php';
require '../functions/utility.php';
$email=$_POST['email'];
$password=$_POST['password'];
$email=filter_var($email, FILTER_SANITIZE_EMAIL);
$password=sanitizeString($password);
$sql="SELECT * FROM users WHERE email='$email'";
$result=$conn->query($sql);
if($result->num_rows == 0){
echo "L email utilizzata non è registrata ";
}else{
$password=md5($password);
$sql="SELECT * FROM users WHERE email = '$email' AND password = '$password'";
$result=$conn->query($sql);
if($result->num_rows>0){
echo "Benvenuto";
// creazione della sessione
// redirect sulla home page per utenti che hanno fatto il login
}else{
echo "Spiacente le credenziali sono errate ";
}
}
$conn->close();
?>
Anche in questo file includeremo i file per la connessione e per la sanificazione delle stringhe. La prima query SELECT * FROM users WHERE email='$email'
la utilizzo per controllare se la email è presente, se non lo è comunico all’utente che l’account non è registrato in caso contrario controllo la corrispondenza dell’email e della password(a cui riapplico la funzione md5
) con la query SELECT * FROM users WHERE email = '$email' AND password = '$password'
. Nel caso in cui le credenziali corrispondano , stampo una stringa di benvenuto, successivamente implementeremo (con una lezione dedicata) le SESSIONI che ci permettono di avere la persistenza dei dati anche su http che per definizione è stateless.