Registrazione e Login con PHP e MySQL

Registrazione e Login con PHP e MySQL:

Struttura delle cartelle

Per migliorare l’ordine del nostro codice dividiamo in quattro cartelle:

  • public contiene i forms
  • config contiene i file per connettersi al database
  • functions il file utility.php dove scriviamo le funzioni riutilizzabili nell’applicazione
  • src gli script per registrarsi e per fare il login
Folder structure dell'applicazione
Folder structure dell’applicazione

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.

Pubblicato da Carlo Contardi

Carlo Contardi, docente di informatica e sviluppatore Full Stack, condivide la sua passione per la programmazione e l’informatica attraverso il suo blog Space Coding. Offre preziosi consigli e soluzioni pratiche a chi vuole imparare a programmare o migliorare le proprie abilità. 🚀👨‍💻

Translate »