Capire i superglobali PHP: $_POST
$_POST è un array associativo PHP che raccoglie i dati inviati con method="post". Impara a leggere, validare e usarlo in sicurezza.
I superglobali PHP sono variabili built-in sempre disponibili in ogni scope di uno script — non è mai necessario dichiararli con global né passarli come argomenti. Espongono informazioni fondamentali come l'input dell'utente, i dettagli del server e le variabili d'ambiente. Uno dei più utilizzati è $_POST, l'array che PHP riempie con i dati inviati nel corpo di una richiesta HTTP POST.
Questo capitolo spiega cos'è $_POST, come leggere i valori in modo sicuro, come si differenzia da $_GET e come gestire un form completo dall'inizio alla fine. Per una panoramica più ampia degli array correlati, consulta PHP superglobals.
Cos'è $_POST?
$_POST è un array associativo che raccoglie i dati del form inviati con method="post". Il browser inserisce ogni campo nel body della richiesta (non nell'URL), e PHP analizza quel body in $_POST prima che lo script venga eseguito. Le chiavi sono gli attributi name dei controlli del form, e i valori sono quelli inseriti dall'utente.
Poiché i dati transitano nel body della richiesta, $_POST è la scelta giusta per payload sensibili o di grandi dimensioni (password, testo lungo, upload di file), per azioni che modificano lo stato del server, e ogni volta che non si vuole che i valori appaiano nell'URL o nella cronologia del browser.
$_POST vs $_GET
Entrambi gli array trasportano l'input dell'utente, ma corrispondono a metodi HTTP diversi e hanno caratteristiche differenti.
$_POST | $_GET | |
|---|---|---|
| Posizione dei dati | Body della richiesta | Query string dell'URL (?key=value) |
| Visibile nell'URL | No | Sì |
| Salvabile come segnalibro / cacheable | No | Sì |
| Uso tipico | Login, creazione/aggiornamento, upload | Ricerca, filtri, paginazione |
| Limite di dimensione | Grande (configurabile dal server) | Limitato dalla lunghezza dell'URL |
Usa POST quando la richiesta modifica dati o contiene informazioni riservate; usa GET per letture sicure e ripetibili. Vedi $_GET per la controparte, o $_REQUEST se hai bisogno di entrambi.
Come Leggere un Valore
Accedi a un valore tramite il nome del campo, esattamente come faresti con qualsiasi chiave di array:
$username = $_POST['username'];$_POST viene popolato solo dopo che un form è stato inviato con POST. Al primo caricamento della pagina è un array vuoto, quindi leggere una chiave mancante genera un avviso. Verifica sempre prima che la chiave esista — usa isset() oppure l'operatore null coalescing di PHP 7+ per fornire un valore predefinito:
<?php
// Safe: never errors, falls back to an empty string
$username = $_POST['username'] ?? '';
if ($username === '') {
echo "Username is required.";
} else {
echo "Hello, " . htmlspecialchars($username);
}
?>L'operatore null coalescing ?? restituisce il valore a destra ogni volta che il lato sinistro è non impostato o null, il che corrisponde esattamente alla situazione prima che il form venga inviato.
Sicurezza: Non Fidarsi Mai dell'Input dell'Utente
Tutto ciò che si trova in $_POST proviene dal client e può essere falsificato. Due regole ti tengono al sicuro:
- Escape in output. Passa ogni valore attraverso
htmlspecialchars()prima di stamparlo in una pagina per prevenire il cross-site scripting (XSS). - Valida e sanifica in input. Usa
filter_var()per verificare i formati (email, integer, URL), e usa prepared statements per le query al database per prevenire SQL injection — non concatenare mai i valori di$_POSTdirettamente nell'SQL.
<?php
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email address.";
}
?>Esempio: Un Form di Contatto Completo
Il form seguente invia tre campi a contact.php usando il metodo POST. Ogni controllo ha un name univoco, che diventa la sua chiave in $_POST.
<form action="contact.php" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" />
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
<label for="message">Message:</label>
<textarea id="message" name="message"></textarea>
<input type="submit" value="Submit" />
</form>In contact.php, prima verifica che la richiesta abbia effettivamente usato POST (così lo stesso file può anche servire il form vuoto), poi leggi, valida ed esegui l'escape di ogni valore:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
$errors = [];
if ($name === '') { $errors[] = "Name is required."; }
if ($email === false) { $errors[] = "A valid email is required."; }
if ($message === '') { $errors[] = "Message cannot be empty."; }
if (!$errors) {
// Safe to use the data — e.g. send an email or save to the database
echo "Thanks, " . htmlspecialchars($name) . "! Your message was received.";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error) . "<br>";
}
}
}
?>Controllare $_SERVER['REQUEST_METHOD'] è il metodo standard per capire se l'utente sta visualizzando il form o lo sta inviando. Per una spiegazione più approfondita, consulta PHP form handling e PHP form validation.
Leggere Valori Multipli
Quando diversi controlli condividono un nome che termina con [] (checkbox, multi-select), PHP li trasforma in un array annidato:
<input type="checkbox" name="colors[]" value="red">
<input type="checkbox" name="colors[]" value="green"><?php
$colors = $_POST['colors'] ?? []; // e.g. ['red', 'green']
foreach ($colors as $color) {
echo htmlspecialchars($color) . "\n";
}
?>Nota che una checkbox non selezionata non invia nulla — quindi colors potrebbe mancare del tutto, ecco perché il valore predefinito ?? [] è importante.
Conclusione
$_POST è lo strumento principale per ricevere dati del form inviati nel body della richiesta. Leggere da esso è semplice come indicizzare un array, ma il codice in produzione deve sempre proteggersi dalle chiavi mancanti con ?? o isset(), validare l'input con filter_var() ed eseguire l'escape dell'output con htmlspecialchars(). Combinati con i prepared statements per qualsiasi operazione sul database, queste abitudini consentono di accettare l'input degli utenti senza esporre l'applicazione a XSS o SQL injection.