PHP, form e validazione: prevenire errori con la conferma dei dati inseriti

by theArchitect
SHARE
PHP, form e validazione: prevenire errori con la conferma dei dati inseriti
© Guida-HTML5.it

Introduzione

Quando si lavora con i form in PHP, la validazione lato server non serve solo a controllare che un campo sia “vuoto” o “non vuoto”. In molti casi il problema reale è più sottile: l’utente ha inserito un dato corretto dal punto di vista sintattico, ma non coerente con ciò che si aspetta il sistema. Un esempio classico è la conferma di un indirizzo email, di una password, di un numero di telefono o di un codice fiscale. Se i due valori non coincidono, il form dovrebbe segnalare subito l’errore prima di procedere con il salvataggio.

In questo tutorial vediamo un sotto-argomento molto utile e pratico: la validazione della conferma dei dati nei form PHP. È una tecnica comune nei form di registrazione, reset password, modifica profilo e checkout. L’obiettivo è semplice: confrontare due campi correlati, intercettare eventuali incongruenze e restituire messaggi chiari all’utente.

Vedremo un esempio completo con un form di registrazione che richiede:

  • email e conferma email
  • password e conferma password
  • controlli di base su formato e lunghezza
  • gestione degli errori in modo ordinato

Codice completo

<?php
// Avvio della sessione per mantenere i dati tra una richiesta e l´altra
session_start();

// Inizializzo variabili
$errors = [];
$success = false;

// Valori di default per ripopolare il form
$email = ´´;
$email_confirm = ´´;
$password = ´´;
$password_confirm = ´´;

// Se il form è stato inviato
if ($_SERVER[´REQUEST_METHOD´] === ´POST´) {
    // Recupero e normalizzo i dati
    $email = trim($_POST[´email´] ?? ´´);
    $email_confirm = trim($_POST[´email_confirm´] ?? ´´);
    $password = $_POST[´password´] ?? ´´;
    $password_confirm = $_POST[´password_confirm´] ?? ´´;

    // Validazione email
    if ($email === ´´) {
        $errors[´email´] = ´L’email è obbligatoria.´;
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[´email´] = ´Inserisci un indirizzo email valido.´;
    }

    if ($email_confirm === ´´) {
        $errors[´email_confirm´] = ´La conferma email è obbligatoria.´;
    } elseif ($email !== ´´ && $email !== $email_confirm) {
        $errors[´email_confirm´] = ´Le email non coincidono.´;
    }

    // Validazione password
    if ($password === ´´) {
        $errors[´password´] = ´La password è obbligatoria.´;
    } elseif (strlen($password) < 8) {
        $errors[´password´] = ´La password deve contenere almeno 8 caratteri.´;
    }

    if ($password_confirm === ´´) {
        $errors[´password_confirm´] = ´La conferma password è obbligatoria.´;
    } elseif ($password !== ´´ && $password !== $password_confirm) {
        $errors[´password_confirm´] = ´Le password non coincidono.´;
    }

    // Se non ci sono errori, il form è valido
    if (empty($errors)) {
        // Esempio: hashing della password prima del salvataggio
        $hashedPassword = password_hash($password, PASSWORD_DEFAULT);

        // Qui potresti salvare i dati nel database
        // Per questo tutorial mostriamo solo un messaggio di successo

        $success = true;

        // Reset dei valori del form dopo l´invio corretto
        $email = ´´;
        $email_confirm = ´´;
        $password = ´´;
        $password_confirm = ´´;
    }
}
?>

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Form con conferma dati</title>
</head>
<body>
    <h1>Registrazione utente</h1>

    <?php if ($success): ?>
        <p>Registrazione completata con successo.</p>
    <?php endif; ?>

    <?php if (!empty($errors)): ?>
        <ul>
            <?php foreach ($errors as $error): ?>
                <li><?= htmlspecialchars($error) ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif; ?>

    <form method="post" action="">
        <p>
            <label for="email">Email:</label><br>
            <input type="email" id="email" name="email" value="<?= htmlspecialchars($email) ?>">
        </p>

        <p>
            <label for="email_confirm">Conferma email:</label><br>
            <input type="email" id="email_confirm" name="email_confirm" value="<?= htmlspecialchars($email_confirm) ?>">
        </p>

        <p>
            <label for="password">Password:</label><br>
            <input type="password" id="password" name="password">
        </p>

        <p>
            <label for="password_confirm">Conferma password:</label><br>
            <input type="password" id="password_confirm" name="password_confirm">
        </p>

        <p>
            <button type="submit">Registrati</button>
        </p>
    </form>
</body>
</html>

Spiegazione

Il codice parte con session_start(), utile se in futuro vuoi conservare messaggi o dati tra richieste. In questo esempio non è strettamente indispensabile, ma è una base comune nei form reali.

La variabile $errors raccoglie tutti gli errori di validazione. Questo approccio è preferibile rispetto a interrompere il controllo al primo errore, perché consente all’utente di vedere tutti i problemi insieme e correggerli in un solo passaggio.

1. Recupero e normalizzazione dei dati

Con trim() rimuoviamo gli spazi iniziali e finali dall’email. È una pratica importante perché spesso gli utenti incollano valori con spazi accidentali. Per le password, invece, non applichiamo trim: in generale è meglio non modificare automaticamente il contenuto di una password, perché anche uno spazio può essere intenzionale.

2. Validazione dei campi principali

Per l’email usiamo filter_var($email, FILTER_VALIDATE_EMAIL), una soluzione semplice e affidabile per verificare il formato base. Non basta da sola a garantire che l’email esista davvero, ma è sufficiente per il controllo sintattico.

Per la password verifichiamo che sia presente e che abbia almeno 8 caratteri. In un progetto reale puoi aggiungere ulteriori regole: maiuscole, minuscole, numeri, simboli o controllo contro password troppo comuni.

3. Confronto tra campi correlati

Il cuore del tutorial è la comparazione tra i campi di conferma:

  • $email !== $email_confirm per verificare che le due email coincidano
  • $password !== $password_confirm per verificare che le due password coincidano

Questa logica è semplice ma fondamentale. Il controllo va fatto lato server anche se il frontend mostra già un messaggio in tempo reale: il browser può essere bypassato, quindi la validazione server-side resta obbligatoria.

4. Gestione degli errori

Ogni campo ha una chiave dedicata nell’array $errors. Questo rende il codice più leggibile e permette di mostrare il messaggio vicino al campo corretto, invece di avere un messaggio generico poco utile.

Nel blocco HTML finale, gli errori vengono stampati con htmlspecialchars(). È una protezione importante contro l’iniezione di HTML o JavaScript nei messaggi visualizzati.

5. Sicurezza della password

Quando il form è valido, la password viene trasformata con password_hash(). Non bisogna mai salvare una password in chiaro. Anche se in questo tutorial non facciamo il salvataggio nel database, il passaggio di hashing mostra la direzione corretta da seguire in un’applicazione reale.

Best practice

  • Valida sempre lato server, anche se hai controlli JavaScript nel browser.
  • Mostra errori specifici per ogni campo, così l’utente capisce subito cosa correggere.
  • Non modificare automaticamente le password con funzioni come trim(), a meno che tu non abbia una regola esplicita e condivisa.
  • Ripopola i campi testuali dopo un errore, per evitare di far reinserire tutto da capo.
  • Usa htmlspecialchars() quando ristampi valori o messaggi provenienti dall’utente.
  • Hasha le password prima del salvataggio con password_hash().
  • Separa i controlli: prima verifica la presenza, poi il formato, poi la corrispondenza tra campi.

Una buona regola pratica è pensare alla validazione come a una pipeline: prima controlli il dato singolo, poi il rapporto con gli altri campi del form. Questo rende il codice più ordinato e facile da mantenere.

Riepilogo

La conferma dei dati nei form PHP è una tecnica semplice ma essenziale. Serve a evitare errori di digitazione, a migliorare l’esperienza utente e a ridurre dati incoerenti nel sistema. In questo tutorial abbiamo visto come:

  • validare email e password
  • confrontare i campi di conferma
  • gestire gli errori in modo strutturato
  • proteggere l’output con htmlspecialchars()
  • hashare la password prima di salvarla

Se applichi questo schema ai tuoi form, avrai una base solida per costruire registrazioni, reset password e moduli di aggiornamento dati molto più affidabili.

Approfondisci con risorse ufficiali

  • PHP Manual - filter_var(): documentazione ufficiale per la validazione dei dati.
  • PHP Manual - password_hash(): guida ufficiale per l’hashing sicuro delle password.
  • PHP Manual - htmlspecialchars(): riferimento per l’output escaping.
  • PHP Manual - Sessions: utile per gestire messaggi e stati tra richieste.

Studiare la documentazione ufficiale ti aiuta a capire non solo come funziona una funzione, ma anche i suoi limiti e i casi d’uso corretti. In un progetto PHP ben fatto, la validazione dei form non è un dettaglio: è una parte centrale della qualità del software.

SHARE