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.
Indice dei contenuti
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:
GET
)/
)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:
HTTP/1.1
)200
)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.
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:
$_SERVER
: contiene tutto ciò che viene inviato dal server nella riposta HTTP.$_GET
: contiene i parametri passati tramite il metodo GET
.$_POST
: contiene i parametri passati tramite il metodo POST
.$_REQUEST
: contiene i valori degli array $_GET
, $_POST
e $_COOKIE
.$_COOKIE
: contiene i cookie inviati dal client al server.$_SESSION
: contiene variabili registrate come variabili di sessione.$_FILES
: contiene informazioni sui file inviati tramite il metodo POST
.In questa guida analizziamo le prime 4 variabili superglobali: $_SERVER
, $_GET
, $_POST
e $_REQUEST
.
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
localhost
.::1
in versione IPV6 equivalente a 127.0.0.1
in versione IPV4.GET
.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 |
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.
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".
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. |
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
.