Le form col PHP e le variabili $_POST e $_GET

Uno degli argomenti introduttivi e più significativi del PHP è quello di poter elaborare i dati, in particolar modo quelli provenienti dall’interazione dell’utente con le pagine web. E’ il caso noto delle form, compilate dagli utenti, i cui dati vengono poi processati ed eventualmente archiviati grazie al PHP e le sue variabili $_POST e $_GET. Vediamo come approcciarci a questa tecnica.

La form che invia dati allo script PHP

Partiamo da una form molto semplice ma allo stesso tempo completa dei principali campi di input che possiamo incontrare nelle nostre esercitazioni. Potete fare un ripasso rapido delle form in questo altro nostro articolo. Creiamo uno script form.php. In realtà non occorrerebbe necessariamente l’estensione php, ma è buona norma cominciare a rinunciare alle paginette html anche se apparentemente contengono solo il classico codice omonimo. Va anche aggiunto che Google premia la dinamicità, gli aggiornamenti continui e un sito in html, presenta diversi limiti in questi termini.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Esempio Form</title>
   </head>
  <body>
    <h1>Le form in PHP</h1>

    <form action="pagina.php" method="post">
        <label>Nome:</label><br>
        <input type="text" id="nome" name="nome" placeholder="Inserisci nome..." required size=70><br><br>
        <label>Cognome:</label><br>
        <input type="text" id="cognome" name="cognome" placeholder="Inserisci cognome..." required size="70"><br><br>
        <label>Anno di Nascita:</label><br>
        <input type="number" min=1900 max=3000 name="anno" id="anno"><br><br>
        <label>Città:</label>
          <select id="citta" name="citta">
              <option value="teramo">Teramo</option>
              <option value="chieti">Chieti</option>
              <option value="pescara">Pescara</option>
              <option value="laquila">L'aquila</option>
          </select><br><br>
          <label>Sesso:</label><br>
            <input type="radio" name=sesso id="sesso" value="M">M <br>
            <input type="radio" name=sesso id="sesso" value="F">F <br>
            <input type="radio" name=sesso id="sesso" value="ND">ND <br><br>
        <input type="submit" value="Invia">
    </form>
    
  </body>
</html>

Ribadiamo per il momento di limitarci a codice graficamente poco accattivante per ottenere un risultato come quello nella foto seguente. Essendo uno script PHP, è il server Apache/NGinx o altro analogo WAPP/XAMPP a processarlo nella loro cartella di lavoro

Del codice visto, ci interessano molto alcuni dettagli. I campi di input hanno tutti un attributo “name” specificato. Questo ci permetterà di reperire i valori della form. In queste pagine ci siamo allenati con gli id fondamentali per JavaScript per la manipolazione dei nodi del DOM. Continua a valere questa importanza e nulla toglie di inserire dentro ad un campo di input sia l’attributo name che id, anche con lo stesso termine!

Il secondo elemento di interesse sono i due attributi nel tag form in apertura: method e action. Il primo può assumere due valori post e get. Il primo trasmette i dati della form in modo nascosto, il secondo in modo visibile/intercettabile. Nella maggioranza dei casi, almeno per i nostri esercizi, sarà sempre post. Nella action inseriamo il nome dello script a cui inviare i dati. Sarà per noi sempre uno script PHP con nome arbitrario. (in generale potrebbe essere qualsiasi altro linguaggio di backend, dal buon vecchio perl al python o java o javascript).

Le variabili $_GET e $_POST per ricevere dati

Prepariamo un file pagina.php e apriamo il tag <?php. Essendo una pagina unicamente con codice PHP, non serve chiudere il tag a ?> a fondo pagina. Come prelevare i valori della form che ha richiamato lo script? Ogni volta che effettuiamo un post, il server apache valorizza delle variabili dette superglobali, ovvero che esistono malgrado qualcuno le abbia dichiarate e che transitano tra le pagine senza che il programmatore faccia alcunché. In realtà sarebbe meglio descriverle come dei vettori associativi, nel nostro caso denominati $_GET [] e $_POST [] rispettivamente valorizzati se la form viene inviata col metodo get o post. All’interno del vettore ci saranno tante voci/posizioni, ognuna che riporta un valore del campo name della form inviata a cui ovviamente è associato il rispettivo valore testuale o numerico del campo input.

Se facciamo riferimento alla form di esempio, nello script pagina.php possiamo scrivere il seguente codice per manipolare i dati della form. Scriviamo un banale messaggio di stampa per visualizzare il contenuto.

<?php 


$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$anno = $_POST['anno'];
$citta = $_POST['citta'];
$sesso = $_POST['sesso'];

echo "Benvenuto $nome $cognome nato nel $anno a $citta di sesso $sesso";

Il risultato atteso è ancora una volta scarno dal punto di vista grafico ma ci da una indicazione importante.

Cosa conviene tenere ben presente? State molto attenti alla coerenza del valore dei campi name della form con quelli delle variabili $_POST. Sarebbe possibile utilizzare i vari elementi di $_POST nel codice ma non conviene, piuttosto creare delle variabili opportune che poi possiamo manipolare con più facilità o immergere negli echo o query sql.

Potrebbe accadere che alcuni campi della form inviata non siano compilati o inviati, perché magari non richiesti. E’ bene allora effettuare un controllo sull’esistenza dell’elemento relativo nel vettore $_POST o $_GET per evitare assegnazioni errate. Esiste una funzione ampiamente usata in PHP e che il lettore dovrebbe utilizzare sempre: isset

if (isset($_POST['nome']))
{
  $nome = $_POST['nome'];
  echo "Ciao $nome!";
}

La variabile $_REQUEST

Altra nota a margine: spesso non è noto a priori se la form PHP invia i dati ad uno script con get o post e quindi non sappiamo quale dei due vettori $_GET o $_POST sia effettivamente valorizzato. Esiste una variabile superglobale analoga a quelle citate che si comporta nello stesso modo e contempla entrambi i vettori $_GET e $_POST ed è $_REQUEST.

Ultima modifica 22 Ottobre 2023