W3docs

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 datiBody della richiestaQuery string dell'URL (?key=value)
Visibile nell'URLNo
Salvabile come segnalibro / cacheableNo
Uso tipicoLogin, creazione/aggiornamento, uploadRicerca, filtri, paginazione
Limite di dimensioneGrande (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 $_POST direttamente 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.

Esercitazione

Pratica
A cosa serve il metodo 'POST' in PHP?
A cosa serve il metodo 'POST' in PHP?
Was this page helpful?