I form HTML
e l'invio dei dati a PHP

1. Cosa impariamo oggi

Oggi non studieremo PHP: lo useremo come "scatola nera" per vedere dove finiscono i dati che inviamo.

2. Il problema: come fa il browser a parlare col server?

Serve un meccanismo per inviare dati dal client al server.

→ Il form HTML è quel meccanismo.

3. Il protocollo HTTP in 30 secondi

Ogni richiesta HTTP ha:

Il form HTML decide:

4. Anatomia di un form

<form action="ricevi.php" method="POST">
    <!-- qui vanno i campi -->
    <input type="text" name="nome">
    <button type="submit">Invia</button>
</form>
AttributoSignificato
actionURL della pagina che riceve i dati
methodGET o POST
enctypecodifica (serve per upload file)

5. L'attributo name: la chiave del problema

Ogni campo che vogliamo inviare deve avere un name.

<input type="text" name="cognome" value="Rossi">

Il browser al submit crea la coppia:

cognome = Rossi
Senza name il campo NON viene inviato.
È l'errore #1 degli studenti. Attenzione: id serve per label/CSS/JS, name serve per l'invio.

6. I principali tipi di input

TipoEsempio d'uso
textnome, cognome
emailemail (con validazione nativa)
passwordmascherato
numberetà, quantità
datedata di nascita
radioscelta singola
checkboxscelta multipla
hiddendato invisibile all'utente
fileupload (richiede enctype)

7. Un form completo (parte 1)

<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.

8. Un form completo (parte 2)

    <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>
Il name="linguaggi[]" (con le parentesi quadre) serve per inviare più valori dallo stesso gruppo.

9. Metodo GET

Il browser appende i dati all'URL:

spia.php?nome=Mario&cognome=Rossi&email=mario@x.it

10. Metodo POST

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

11. GET vs POST: tabella riassuntiva

GETPOST
Dove viaggianoURL (query string)Corpo della richiesta
Visibili nell'URLSìNo
Limite dimensione~2000 caratteriNessuno pratico
BookmarkabileSìNo
IdempotenteSìNo
Dati sensibili❌✅ (con HTTPS)
Uso tipicoricerche, filtrilogin, iscrizioni, upload

12. $_REQUEST: il raccoglitore

In 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:

Buona pratica: usare $_GET o $_POST espliciti.

13. La pagina "spia" (scatola nera)

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>

14. Demo live: form in GET

  1. Apriamo modulo.html
  2. Compiliamo i campi
  3. Inviamo
  4. Guardiamo l'URL:
spia.php?nome=Mario&cognome=Rossi&email=mario@x.it
   &sesso=M&linguaggi[]=HTML&linguaggi[]=CSS
  1. Nella pagina vediamo i dati in $_GET e in $_REQUEST (ma $_POST è vuoto)
Fai notare il ? che separa URL e query string, e le & che separano i campi.

15. Demo live: form in POST

Cambiamo solo una riga:

<form action="spia.php" method="POST">

Ora:

Apri DevTools → Network → clicca la richiesta → mostra il payload del POST.

16. URL encoding

Alcuni caratteri nell'URL devono essere codificati:

CarattereDiventa
spazio+ oppure %20
à%C3%A0
&%26
?%3F
nome=Maria Grazia   →   nome=Maria+Grazia

Lo fa automaticamente il browser. PHP lo decodifica automaticamente.

17. Campi hidden

<input type="hidden" name="versione" value="1.0">
<input type="hidden" name="id_utente" value="42">
Un campo hidden non è sicuro: l'utente può modificarlo. Serve per passare dati tecnici, non per nascondere segreti.

18. Checkbox multiple e radio

Checkbox multiple → array

<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.

Radio → scelta singola

<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.

19. Select e textarea

<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>

20. Validazione lato client

HTML5 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.

Non basta! La validazione HTML5 si può bypassare. Il server deve sempre rivalidare.

21. Guardiamo la richiesta HTTP

Apriamo DevTools (F12) → Network:

  1. Compila e invia il form
  2. Clicca la richiesta spia.php
  3. Osserva:
    • Headers → metodo, URL, content-type
    • Payload (per POST) → i dati inviati
    • Query String (per GET) → i parametri nell'URL
È il momento "aha!" della lezione. Fai vedere GET e POST a confronto.

22. Errori comuni

Errore #1 — Dimenticare il name

<input type="text" id="nome">            <!-- ❌ non viene inviato -->
<input type="text" id="nome" name="nome"> <!-- ✅ -->

Il campo sparisce silenziosamente: nessun errore, semplicemente non arriva.

Errore #2 — Usare GET per dati sensibili

<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.

Errore #3 — Dimenticare [] nelle checkbox multiple

Con name="linguaggi" arriva solo l'ultimo selezionato. Con name="linguaggi[]" arrivano tutti.

23. Riepilogo concetti

Esercizi — parte 1

1 GET vs POST

Prendi il form della slide 8.

  1. Invia con GET. Copia l'URL e incollalo in una nuova scheda. Cosa succede?
  2. Cambia in POST. Ripeti l'esperimento. Cosa cambia?
  3. Apri DevTools → Network in entrambi i casi e annota le differenze.

Obiettivo: capire visivamente dove viaggiano i dati.

2 Il campo fantasma

  1. Apri il form
  2. Rimuovi l'attributo name da un solo campo
  3. Invia
  4. Osserva la tabella dei dati ricevuti

Domanda: perché quel campo non compare?

3 Checkbox multiple

  1. Nel form, seleziona più linguaggi
  2. Invia e osserva come appare linguaggi[] nella pagina spia
  3. Ora cambia in name="linguaggi" (senza [])
  4. Ripeti: cosa cambia?

Obiettivo: capire il ruolo delle parentesi quadre.

4 Campo hidden

  1. Aggiungi al form: <input type="hidden" name="token" value="abc123">
  2. Invia con GET → il valore è visibile nell'URL?
  3. Invia con POST → è visibile?
  4. In entrambi i casi, arriva al server?

Riflessione: un campo hidden è davvero "nascosto"?

Esercizi — parte 2

5 Validazione nativa

  1. Aggiungi required a un campo
  2. Prova a inviare vuoto → cosa fa il browser?
  3. Aggiungi type="email" e inserisci un valore tipo abc
  4. Aggiungi pattern="[0-9]{5}" a un campo CAP

Domanda: perché questa validazione non sostituisce quella lato server?

6 Progettazione

Progetta un form di ricerca libri con:

Domande:

  1. Quale metodo scegli, GET o POST? Motiva.
  2. Quali campi metti required?
  3. Come chiameresti il file action?

7 Due form, una pagina (avanzato)

  1. Crea due form nella stessa pagina HTML, entrambi con action="spia.php"
  2. Uno con method="GET", l'altro con method="POST"
  3. Invia prima uno, poi l'altro
  4. Osserva cosa cambia nella pagina spia

Obiettivo: capire che action e method sono proprietà del singolo form, non della pagina.

8 Debug

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.

Sicurezza: primi accenni

Quiz di fine lezione

  1. Quale attributo identifica un campo nell'invio?
  2. Differenza principale GET/POST?
  3. Cosa contiene $_REQUEST?
  4. Perché non usare GET per una password?
  5. Cosa fa name="interessi[]"?
  6. Un campo hidden è sicuro?
Risposte: 1) 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

Cosa vedremo la prossima volta

Riferimenti utili

Grazie!
Domande?