Variabili superglobali

Variabili superglobali PHP: cosa sono e come utilizzarle

PHP è un linguaggio utilizzato in coppia con HTML per sviluppare applicazioni web e fornire un'interazione tra l'utente e l'applicazione stessa. Tra le possibili interazioni vi è la possibilità di inviare dati attraverso il modulo (form) HTML di un sito.

In questa guida introduciamo le variabili superglobali, ossia variabili speciali del linguaggio che consentono di gestire i dati inviati tramite un form e di recuperare informazioni sul browser (client) o il sito (server).

Per utilizzare al meglio questi strumenti è necessaria una buona comprensione di ciò che avviene tra il client e il server. Introduciamo quindi alcuni concetti come il protocollo HTTP e il suo funzionamento attraverso una richiesta e la successiva risposta.

Il protocollo HTTP

HTTP è il protocollo utilizzato per le comunicazioni su Internet. Consente a un client e un server di scambiarsi informazioni attraverso la rete.

Quando si visualizza la pagina di un sito, il protocollo HTTP consente di effettuare la richiesta al sito e di ricevere la risposta contenente il contenuto della pagina.

La richiesta HTTP contiene una serie di informazioni che saranno interpretate dal server per preparare la risposta. Di seguito è mostrato un esempio di richiesta verso la home page di questo sito

GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Host: guidaphp.it
User-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)

La prima riga di una richiesta HTTP contiene:

  • il metodo HTTP (GET)
  • il percorso della risorsa richiesta (/)
  • la versione del protocollo (HTTP/1.1).

Le successive righe, nel formato header: valore, si chiamano intestazioni di richiesta e forniscono ulteriori informazioni come ad esempio i formati di risposta accettati dal client (Accept) o il sistema operativo e browser utilizzati (User-agent).

Ricevuta la richiesta, il server prepara la risposta e la invia indietro al browser. Un esempio di risposta HTTP per l'esempio precedente potrebbe essere questa

HTTP/1.1 200 OK
Date: Tue, 13 Aug 2019 21:23:53 GMT
Connection: keep-alive, Keep-Alive
Content-Encoding: br
Server: Apache
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html lang="it">
    <head>
        <title>Guida PHP</title>
    </head>
    <body>
        <h1>Guida PHP</h1>
    </body>
</html>

La prima riga di una risposta HTTP contiene:

  • la versione del protocollo (HTTP/1.1)
  • il codice di stato (200)
  • un messaggio relativo all'esito della risposta (OK).

Seguono le intestazioni di risposta nel formato header: valore, una riga vuota e il messaggio (body) vero e proprio, contenente l'HTML della risorsa richiesta. Il codice di stato 200 indica che la richiesta ha avuto esito positivo.

Ora che sappiamo come vengono scambiati i messaggi tra browser e sito web, vediamo come possiamo recuperare queste informazioni tramite PHP.

Variabili superglobali

PHP consente la gestione dei dati scambiati durante una richiesta HTTP attraverso le variabili superglobali. Si tratta di variabili di tipo array a cui è possibile accedere da qualunque parte di un programma, poiché hanno una visibilità (scope) globale.

Sono anche chiamate autoglobali in quanto disponibili automaticamente all'interno delle applicazioni.

Elenchiamo di seguito tali variabili:

  1. $_SERVER: contiene tutto ciò che viene inviato dal server nella riposta HTTP.
  2. $_GET: contiene i parametri passati tramite il metodo GET.
  3. $_POST: contiene i parametri passati tramite il metodo POST.
  4. $_REQUEST: contiene i valori degli array $_GET, $_POST e $_COOKIE.
  5. $_COOKIE: contiene i cookie inviati dal client al server.
  6. $_SESSION: contiene variabili registrate come variabili di sessione.
  7. $_FILES: contiene informazioni sui file inviati tramite il metodo POST.

In questa guida analizziamo le prime 4 variabili superglobali: $_SERVER, $_GET, $_POST e $_REQUEST.

$_SERVER

La prima variabile che andiamo a vedere è $_SERVER, un array associativo contenente dati sulla richiesta HTTP più altre informazioni come il file PHP utilizzato, l'indirizzo IP, il metodo HTTP, etc...

Copiamo e incolliamo il seguente codice di esempio dentro un file rinominato test-superglobali.php e visualizziamo il contenuto tramite un browser, visitando l'indirizzo localhost/test-superglobali.php (è necessario aver installato PHP in locale).

<?php
echo($_SERVER['HTTP_HOST'])."<br>";
echo($_SERVER['HTTP_USER_AGENT'])."<br>";
echo($_SERVER['REMOTE_ADDR'])."<br>";
echo($_SERVER['SERVER_PROTOCOL'])."<br>";
echo($_SERVER['REQUEST_METHOD'])."<br>";
echo($_SERVER['QUERY_STRING'])."<br>";

L'output del programma nel mio caso è il seguente

localhost
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
::1
HTTP/1.1
GET

Dove

  • La riga 1 mostra il sito da dove è partita la richiesta. Essendo in locale viene mostrato localhost.
  • La riga 2 mostra il tipo di dispositivo utilizzato (sistema operativo + browser).
  • La riga 3 mostra l'indirizzo IP di chi ha effettuato la richiesta. In questo caso è mostrato l'indirizzo ::1 in versione IPV6 equivalente a 127.0.0.1 in versione IPV4.
  • La riga 4 mostra la versione del protocollo utilizzato.
  • La riga 5 mostra il metodo utilizzato, in questo caso GET.
  • La riga 6 è vuota, in quanto non abbiamo passato nessun parametro nell'URL. Tra un pò vedremo come visualizzare questo valore.

La seguente tabella mostra l'elenco delle informazioni disponibili nell'array $_SERVER

Variabile Valore
$_SERVER['DOCUMENT_ROOT'] La cartella radice dello script definita nel file di configurazione del server.
$_SERVER['HTTP_ACCEPT'] Il valore dell'intestazione Accept. Es. text/html
$_SERVER['HTTP_ACCEPT_CHARSET'] Il set di caratteri accettato. Es. utf-8
$_SERVER['HTTP_ACCEPT_ENCODING'] il tipo di encoding accettato. Es. gzip, deflate
$_SERVER['HTTP_ACCEPT_LANGUAGE'] La lingua accettata dal browser. Es. it-IT
$_SERVER[HTTP_CONNECTION'] Il valore dell'intestazione Connection. Es. keep-alive
$_SERVER['HTTP_HOST'] Il sito da dove è stata effettuata la richiesta.
$_SERVER['HTTP_REFERER'] L'indirizzo della pagina di provenienza, se esiste. Utile per sapere da dove proviene chi visita un sito.
$_SERVER['HTTP_USER_AGENT'] Informazioni sul sistema operativo e il browser web di chi ha effettuato la richiesta.
$_SERVER['HTTPS'] Impostato ad un valore non vuoto se la richiesta viene fatta tramite il protocollo HTTPS.
$_SERVER['QUERY_STRING'] La query string, se presente, contenente eventuali parametri passati alla pagina tramite GET.
$_SERVER['REMOTE_ADDR'] L'indirizzo IP del client che effettua la richiesta. Es. 127.0.0.1
$_SERVER['REMOTE_HOST'] L'indirizzo host del client che effettua la richiesta. Es. localhost
$_SERVER['REMOTE_PORT] La porta usata dal client per la connessione. Es. 80
$_SERVER['SCRIPT_FILENAME'] Il percorso assoluto dello script in esecuzione.
$_SERVER['SCRIPT_NAME'] Il percorso relativo dello script in esecuzione.
$_SERVER['SERVER_PORT'] La porta sulla quale il server ha accettato la richiesta.
$_SERVER['SERVER_SOFTWARE'] Informazioni sul server web e la versione di PHP in uso. Es. Apache/2.4.39 (Win64) OpenSSL/1.1.1b PHP/7.3.5
$_SERVER['REQUEST_METHOD'] Il metodo HTTP della richiesta. Es. GET o POST.
$_SERVER['REQUEST_URI'] L'URI associato alla richiesta HTTP. Es. /index.php
$_SERVER['REQUEST_TIME'] La data/ora in cui è stata effettuata la richiesta. Es. Tue, 13 Aug 2019 20:35:00 GMT

$_GET

Nell'esempio precedente abbiamo utilizzato la variabile $_SERVER['QUERY_STRING'] per recuperare i parametri passati tramite il metodo GET e che verranno resi disponibili nell'array $_GET, la seconda variabile superglobale che andiamo ad analizzare.

Riprendiamo il nostro script test-superglobali.php e visualizziamone il contenuto digitando nella barra degli indirizzi del browser il seguente URL

localhost/test-superglobali.php?name=Mario&lastname=Rossi

Questa volta la riga con la variabile $_SERVER['QUERY_STRING'] non sarà vuota e conterrà il seguente valore

name=Mario&lastname=Rossi

Come è possibile recuperare singolarmente tali valori per poterli utilizzare nel programma? Risposta: attraverso l'array $_GET.

Creiamo un nuovo file e incolliamo il seguente codice

<?php
if (isset($_GET['name'])) {
    echo $_GET['name']."<br>";
}

if (isset($_GET['lastname'])) {
    echo $_GET['lastname']."<br>";
}

In questo esempio abbiamo utilizzato la funzione isset() del linguaggio. Questa funzione consente di verificare l'esistenza di una variabile (e che non sia uguale a NULL), infatti se proviamo a stampare direttamente i valori dell'array $_GET senza passare nessun parametro, otteniamo un avviso simile a questo

Notice: Undefined index: name in C:\xampp\htdocs\test-superglobali.php on line 2

Dunque la funzione isset() risulta fondamentale per scrivere codice più robusto.

$_POST

A differenza di GET, col metodo POST i dati sono inviati al server in maniera separata e non sono visibili nell'URL. In questo caso, PHP fornisce la variabile superglobale $ _POST per accedere a tutte le informazioni inviate tramite il metodo POST, oppure tramite un modulo HTML che utilizza POST come metodo.

Vediamo un esempio di codice (salviamo il seguente programma in un file con estensione .php e visualizziamo l'output nel browser).

<?php
if (isset($_POST['submit'])) {
    if (isset($_POST['name'])) {
        echo "Nome: ".$_POST['name']."<br>";
    }
    
    if (isset($_POST['lastname'])) {
        echo "Cognome: ".$_POST['lastname'];
    }
} else {
?>
<form action="phpinfo.php" method="post">
    <input type="text" name="name" value="Mario">
    <input type="text" name="lastname" value="Rossi">
    <input type="submit" name="submit" value="submit">
</form>
<?php 
}
?>

Una volta cliccato sul pulsante "submit", lo script stampa a video, se esistono, i valori delle variabili $_POST['name'] e $_POST['lastname'].

Nell'esempio appena visto abbiamo usato il metodo POST, ma è possibile utilizzare GET al suo posto per recuperare le variabili dopo il submit. È sufficiente sostituire

method="post"

con

method="get"

e recuperare le variabili al submit con la superglobale $_GET.

Tuttavia GET ha delle limitazioni e risulta meno sicuro rispetto a POST, in quanto i parametri passati vengono accodati nell'URL e dunque sono visibili a tutti. Questo caso particolare non rappresenta un problema perché non stiamo passando dati sensibili (password), ma nel caso di un login ad un'area riservata va usato POST per effettuare l'autenticazione.

Nota: il metodo POST mette al sicuro i dati inviati al server solamente per una questione di visibilità, in quanto non visibili nell'URL. Tuttavia questi dati possono essere intercettati da un malintenzionato, in quanto col protocollo HTTP i dati sono trasferiti dal browser al server su connessione non sicura. Per avere quindi una maggiore sicurezza è necessario utilizzare POST con la versione sicura di HTTP, ossia HTTPS, che utilizza un certificato SSL/TLS e la crittografia per proteggere i dati scambiati tra client e server. Un utente che compila un modulo di un sito web che utilizza HTTP (le URL iniziano per http://) verrà notificato dal browser tramite l'avviso "Non sicuro".

GET vs POST

Di seguito elenchiamo alcune importanti differenze tra i metodi GET e POST

GET POST
Clic sul pulsante back del browser Non causa nessun effetto. Il browser avvisa l'utente che i dati saranno reinviati se si aggiorna la pagina.
Preferiti browser La risorsa può essere inserita tra i preferiti. La risorsa non può essere inclusa tra i preferiti.
Copia cache La risorsa può essere messa in cache. La risorsa non può essere messa in cache.
Tipo di codifica application/x-www-form-urlencoded application/x-www-form-urlencoded oppure multipart/form-data per l'upload di file.
Restrizione sulla lunghezza dei dati inviati 2048 caratteri per un URL contenente i parametri. Nessuna
Restrizione sui tipi di dati inviati Sono ammessi solo caratteri ASCII. Nessuna restrizione. Sono ammessi anche dati binari.
Sicurezza I parametri vengono accodati nell'URL e sono visibili a chiunque. È un po più sicuro di GET perché i parametri non sono visibili nell'URL e non vengono memorizzati nella cronologia del browser.

$_REQUEST

La variabile $ _REQUEST contiene i valori degli array $ _GET, $ _POST e $ _COOKIE. Parleremo della variabile $ _COOKIE quando analizzeremo i cookie.

La variabile $ _REQUEST può essere utilizzata per recupeare i dati inviati tramite GET e POST. Vediamo un esempio di utilizzo

<?php
if (isset($_POST['submit'])) {
    var_dump($_REQUEST);
} else {
?>
<form action="phpinfo.php?action=save" method="post">
    <input type="text" name="name" value="Mario">
    <input type="text" name="lastname" value="Rossi">
    <input type="submit" name="submit" value="submit">
</form>
<?php 
}
?>

Dopo aver cliccato sul pulsante "submit" del modulo otteniamo il seguente output

array(4) {
  ["action"]=>
  string(4) "save"
  ["name"]=>
  string(5) "Mario"
  ["lastname"]=>
  string(5) "Rossi"
  ["submit"]=>
  string(6) "submit"
}

Come possiamo notare, l'array $_REQUEST contiene sia i valori salvati dell'array $_GET ('action'), sia quelli dell'array $_POST ('name', 'lastname' e 'submit').

Nelle prossime guide vedremo altre variabili molto utilizzate nelle applicazioni: $_COOKIE, $_SESSION e $_FILES.