HTML form: GET, POST, action e name con un esempio PHP

HTML <form> raggruppa i controlli di input in un modulo inviato a un server. action seleziona l'indirizzo di elaborazione e method seleziona il metodo di invio. GET mette i valori nella query dell'URL e POST li mette nel corpo della richiesta, ma POST di per sé non cripta i dati.

I ruoli di action, method e name

action è l'indirizzo richiesto dal browser. Se omesso, il modulo viene inviato all'indirizzo del documento corrente. Il metodo predefinito è get, adatto per ricerche e recuperi che non modificano lo stato. La creazione e gli aggiornamenti generalmente utilizzano post, con autenticazione lato server, autorizzazione e validazione della richiesta.

id di un controllo lo identifica nel documento e associa la sua etichetta; name è la chiave dei dati inviati. Gli input ordinari senza nome vengono omessi, così come i controlli disabilitati e i pulsanti radio o le caselle di controllo non selezionati. Non nidificare un modulo all'interno di un altro.

Prepara l'intero modulo pratico

Per verificare anche il server ricevente, aprire da solo un file HTML non è sufficiente. Crea una cartella di pratica vuota in un ambiente locale con PHP 8.x installato e salva entrambi i file sottostanti in quella cartella. Questo esempio visualizza i valori ricevuti; non memorizza dati, non invia posta né modifica account.

Il primo file è index.html. Il secondo pulsante di invio utilizza formmethod in modo che gli stessi input possano essere confrontati usando GET e POST.

<!doctype html>
<html lang="it">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Esercizio con moduli GET e POST</title>
</head>
<body>
  <h1>Confrontare i metodi di richiesta</h1>
  <form action="receive.php" method="get">
    <p>
      <label for="query">Termine di ricerca</label>
      <input type="text" id="query" name="q" maxlength="80" required>
    </p>
    <p>
      <label for="note">Nota</label>
      <textarea id="note" name="note" maxlength="300"></textarea>
    </p>
    <button type="submit">Verifica con GET</button>
    <button type="submit" formmethod="post">Verifica con POST</button>
    <button type="reset">Ripristina</button>
  </form>
</body>
</html>

Il secondo file è receive.php. Legge stringhe dalla raccolta di input per il metodo della richiesta e rifiuta array o lunghezze non valide. L’output è sottoposto a escaping per il suo contesto HTML.

<?php
declare(strict_types=1);
header('Content-Type: text/html; charset=UTF-8');
$method = $_SERVER['REQUEST_METHOD'];
if ($method !== 'GET' && $method !== 'POST') {
    header('Allow: GET, POST');
    http_response_code(405);
    exit('Metodo di richiesta non supportato.');
}
$input = $method === 'POST' ? $_POST : $_GET;
$q = $input['q'] ?? '';
$note = $input['note'] ?? '';
if (!is_string($q) || !is_string($note) || trim($q) === '' ||
    strlen($q) > 320 || strlen($note) > 1200) {
    http_response_code(400);
    exit('Controlla le stringhe di ricerca e nota.');
}
function h(string $text): string {
    return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<!doctype html>
<html lang="it">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Risultato ricevuto</title>
</head>
<body>
  <h1>Risultato ricevuto</h1>
  <p>Metodo di richiesta: <?= h($method) ?></p>
  <p>Termine di ricerca: <?= h($q) ?></p>
  <p>Nota: <?= h($note) ?></p>
  <p><a href="index.html">Torna al modulo</a></p>
</body>
</html>

HTML maxlength e il controllo della lunghezza sul server usano misure diverse. Questo esempio di server limita i byte con strlen; non riproduce una politica completa di conteggio dei caratteri. Valida gli input importanti secondo le regole effettive dell’applicazione del server.

Esegui l’esempio e confronta GET con POST

Nella cartella contenente entrambi i file, esegui questo comando e apri http://127.0.0.1:8000/index.html. Se php non viene trovato, verifica il percorso di installazione e l’impostazione PATH. Il server integrato di PHP è per lo sviluppo locale e la pratica, non per la produzione.

php -S 127.0.0.1:8000
  1. L’invio con un termine di ricerca vuoto è bloccato dalla validazione richiesta.
  2. Inserisci HTML come termine di ricerca e Practice come nota, quindi invia con GET. La query dell'URL contiene q e note, e la risposta mostra GET come metodo.
  3. Torna al modulo e inserisci gli stessi valori, quindi invia con POST. I valori di input non vengono aggiunti all'URL, e la risposta mostra POST. Gli strumenti per sviluppatori possono mostrare il corpo nel pannello Network.
  4. Invia <b>Practice</b> nella nota. La risposta mostra i tag come testo, non in grassetto. Al termine, arresta il server con Ctrl+C nel terminale.

Controlla i metodi di invio, la sicurezza e i fallimenti comuni

I contenuti POST rimangono visibili negli strumenti per sviluppatori e sul server; è necessario HTTPS per proteggere i dati in transito. Le query GET possono rimanere negli indirizzi, nella cronologia o nei log, quindi non inserire valori sensibili come password in esse. I controlli HTML required e maxlength aiutano gli utenti ma non sostituiscono la convalida lato server.

I moduli di caricamento file generalmente necessitano di method="post" e enctype="multipart/form-data". La codifica predefinita è application/x-www-form-urlencoded. La gestione reale dei file richiede anche controlli su dimensione, tipo e posizione di archiviazione, oltre a questo esercizio di input stringa.

Per una risposta 404, controlla il percorso relativo dell'azione e il nome del file. Per valori mancanti, verifica il nome e se il server legge la raccolta per il metodo di richiesta corretto. Imposta esplicitamente type="button" per i pulsanti di azione ordinari per evitare invii accidentali. Reset ripristina i valori predefiniti originali invece di rendere sempre vuoti i campi. Consulta il riferimento al modulo MDN form e il tutorial sui moduli PHP.