$_REQUEST e perché è comodo ma rischiosoServe un meccanismo per inviare dati dal client al server.
→ Il form HTML è quel meccanismo.
Ogni richiesta HTTP ha:
Il form HTML decide:
actionmethod<form action="ricevi.php" method="POST">
<!-- qui vanno i campi -->
<input type="text" name="nome">
<button type="submit">Invia</button>
</form>
| Attributo | Significato |
|---|---|
action | URL della pagina che riceve i dati |
method | GET o POST |
enctype | codifica (serve per upload file) |
name: la chiave del problemaOgni campo che vogliamo inviare deve avere un name.
<input type="text" name="cognome" value="Rossi">
Il browser al submit crea la coppia:
cognome = Rossi
name il campo NON viene inviato.id serve per label/CSS/JS, name serve per l'invio.
| Tipo | Esempio d'uso |
|---|---|
text | nome, cognome |
email | email (con validazione nativa) |
password | mascherato |
number | età, quantità |
date | data di nascita |
radio | scelta singola |
checkbox | scelta multipla |
hidden | dato invisibile all'utente |
file | upload (richiede enctype) |
<form action="spia.php" method="GET">
<label for="nome">Nome:</label>
<input type="text" id="nome" name="nome" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email">
<label for="nascita">Data di nascita:</label>
<input type="date" id="nascita" name="nascita">
required e type="email" attivano la validazione lato client.
<p>Sesso:</p>
<label><input type="radio" name="sesso" value="M"> M</label>
<label><input type="radio" name="sesso" value="F"> F</label>
<p>Linguaggi:</p>
<label><input type="checkbox" name="linguaggi[]" value="HTML"> HTML</label>
<label><input type="checkbox" name="linguaggi[]" value="CSS"> CSS</label>
<label><input type="checkbox" name="linguaggi[]" value="JS"> JS</label>
<label for="corso">Corso:</label>
<select id="corso" name="corso">
<option value="">-- scegli --</option>
<option value="web">Sviluppo Web</option>
<option value="db">Basi di dati</option>
</select>
<textarea name="note" rows="3" cols="40"></textarea>
<input type="hidden" name="versione" value="1.0">
<button type="submit">Invia</button>
</form>
name="linguaggi[]" (con le parentesi quadre) serve per inviare più valori dallo stesso gruppo.
Il browser appende i dati all'URL:
spia.php?nome=Mario&cognome=Rossi&email=mario@x.it
Il browser mette i dati nel corpo della richiesta:
POST /spia.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
nome=Mario&cognome=Rossi&email=mario@x.it
| GET | POST | |
|---|---|---|
| Dove viaggiano | URL (query string) | Corpo della richiesta |
| Visibili nell'URL | Sì | No |
| Limite dimensione | ~2000 caratteri | Nessuno pratico |
| Bookmarkabile | Sì | No |
| Idempotente | Sì | No |
| Dati sensibili | ❌ | ✅ (con HTTPS) |
| Uso tipico | ricerche, filtri | login, iscrizioni, upload |
$_REQUEST: il raccoglitoreIn PHP, $_REQUEST è un array che contiene GET + POST + COOKIE.
echo $_REQUEST['nome']; // funziona sia con GET sia con POST
Perché è comodo: un solo codice gestisce entrambi i metodi.
Perché è rischioso:
nome arriva sia in GET sia in POST)$_GET o $_POST espliciti.Salva questo file come spia.php. Non serve capirlo: serve a mostrare cosa arriva.
<!DOCTYPE html>
<html lang="it">
<head><meta charset="UTF-8"><title>Dati ricevuti</title></head>
<body>
<h1>Dati ricevuti</h1>
<p>Metodo: <strong><?php echo $_SERVER['REQUEST_METHOD']; ?></strong></p>
<?php
function mostra($titolo, $arr) {
echo "<h2>$titolo</h2>";
if (empty($arr)) { echo "<p><em>nessun dato</em></p>"; return; }
echo "<table border='1' cellpadding='6'>";
foreach ($arr as $k => $v) {
$val = is_array($v) ? implode(', ', $v) : $v;
echo "<tr><td>" . htmlspecialchars($k) . "</td>"
. "<td>" . htmlspecialchars($val) . "</td></tr>";
}
echo "</table>";
}
mostra('$_GET', $_GET);
mostra('$_POST', $_POST);
mostra('$_REQUEST', $_REQUEST);
?>
</body>
</html>
modulo.htmlspia.php?nome=Mario&cognome=Rossi&email=mario@x.it
&sesso=M&linguaggi[]=HTML&linguaggi[]=CSS
$_GET e in $_REQUEST (ma $_POST è vuoto)? che separa URL e query string, e le & che separano i campi.
Cambiamo solo una riga:
<form action="spia.php" method="POST">
Ora:
spia.php)$_POST si popola$_GET è vuotoAlcuni caratteri nell'URL devono essere codificati:
| Carattere | Diventa |
|---|---|
| spazio | + oppure %20 |
à | %C3%A0 |
& | %26 |
? | %3F |
nome=Maria Grazia → nome=Maria+Grazia
Lo fa automaticamente il browser. PHP lo decodifica automaticamente.
<input type="hidden" name="versione" value="1.0">
<input type="hidden" name="id_utente" value="42">
<input type="checkbox" name="linguaggi[]" value="HTML">
<input type="checkbox" name="linguaggi[]" value="CSS">
<input type="checkbox" name="linguaggi[]" value="JS">
Se selezioni HTML e JS, PHP riceve un array. Senza [] riceverebbe solo l'ultimo valore.
<input type="radio" name="sesso" value="M"> M
<input type="radio" name="sesso" value="F"> F
Stesso name → il browser invia un solo valore. Se non selezioni nulla, il campo non viene inviato.
<select name="corso">
<option value="">-- scegli --</option>
<option value="web">Sviluppo Web</option>
<option value="db">Basi di dati</option>
</select>
<textarea name="note" rows="3" cols="40"></textarea>
select: singola scelta (o multipla con multiple)textarea: testo lungo, inviato come stringaHTML5 offre validazione gratis:
<input type="text" name="nome" required>
<input type="email" name="email">
<input type="number" name="eta" min="14" max="99">
<input type="text" name="cf"
pattern="[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]">
Il browser blocca il submit se i dati non sono validi.
Apriamo DevTools (F12) → Network:
spia.phpname<input type="text" id="nome"> <!-- ❌ non viene inviato -->
<input type="text" id="nome" name="nome"> <!-- ✅ -->
Il campo sparisce silenziosamente: nessun errore, semplicemente non arriva.
<form action="login.php" method="GET"> <!-- ❌ -->
<input type="password" name="pwd">
</form>
Risultato nell'URL: login.php?user=mario&pwd=segretissima → visibile in barra, cronologia, log del server.
[] nelle checkbox multipleCon name="linguaggi" arriva solo l'ultimo selezionato. Con name="linguaggi[]" arrivano tutti.
action = dove, method = comename (chiave) e un value (valore)$_REQUEST raccoglie GET + POST + cookie (usare con cautela)Prendi il form della slide 8.
GET. Copia l'URL e incollalo in una nuova scheda. Cosa succede?POST. Ripeti l'esperimento. Cosa cambia?Obiettivo: capire visivamente dove viaggiano i dati.
name da un solo campoDomanda: perché quel campo non compare?
linguaggi[] nella pagina spianame="linguaggi" (senza [])Obiettivo: capire il ruolo delle parentesi quadre.
<input type="hidden" name="token" value="abc123">Riflessione: un campo hidden è davvero "nascosto"?
required a un campotype="email" e inserisci un valore tipo abcpattern="[0-9]{5}" a un campo CAPDomanda: perché questa validazione non sostituisce quella lato server?
Progetta un form di ricerca libri con:
Domande:
required?action?action="spia.php"method="GET", l'altro con method="POST"Obiettivo: capire che action e method sono proprietà del singolo form, non della pagina.
Trova e correggi gli errori:
<form action="ricevi.php" method="POST">
<input type="text" id="nome">
<input type="email" name="email">
<input type="checkbox" name="hobby" value="sport">
<input type="checkbox" name="hobby" value="musica">
<input type="password" name="pwd" method="GET">
<button>Invia</button>
</form>
Errori nascosti: manca name sul nome; checkbox senza []; method sull'input è invalido; button senza type.
$_REQUEST?name="interessi[]"?hidden è sicuro?name · 2) URL vs corpo · 3) GET+POST+cookie · 4) visibile in URL e log · 5) crea un array di valori · 6) no, è modificabile dall'utente
$_GET, $_POST, $_REQUESThtmlspecialchars, filtri)<form>: https://developer.mozilla.org/it/docs/Web/HTML/Element/formGrazie!
Domande?