PHP e il Web
Termini che devi imparare
- Server-side, Client-side
- HyperText Transfer Protocol (http)
- GET, POST request
- Superglobal array
- HTTP header
- Cookie
- Session/Session Identifier
Server-side Vs Client-side
Una delle chiavi per capire il ruolo di PHP nel web è quello di capire come lavora
il WEB nelle sue fondamenta. Questo di solito richiede una conoscenza di base dell'HTTP.
Per esaminare le operazioni di base che possono essere effettuate sul web, consideriamo un client
HTTP: il tuo browser. Quando visiti un url come http://www.demenziale.altervista.org, il
tuo browser invia una richiesta HTTP al server web a altervista.org. L'esempio più semplice
è il seguente:
GET / HTTP/1.1
Host: altervista.org
La responsabilità del server è di rispondere a queste richieste, preferibilmente con la
risorsa richiesta. Un esempio di risposta è il seguente:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Lenght: 419
<html>
<head><title>Esempio</title></head>
<body>
<p>Questa è una pagina html</p>
</body>
</html>
Come avrai notato, la maggior parte di questa risposta è il contenuto della pagina web
che si vuole visitare. Non appena il tuo browser riceve queste informazioni tutto quanto verrà
formato dal browser stesso. Quando una pagina è stata scaricata puoi anche scollegare il
computer da internet perchè il browser non avrà più bisogno di chiedere
ulteriori informazioni al server web.
Ma dove entra in gioco PHP? PHP è come un aiuto per il server nella risposta alla
richiesta HTTP inviatagli dal client. Quando il server web invia la risposta il lavoro di PHP
è bello che terminato. Questo avviene perchè le attività del PHP vengono
svolte sul server.
Ciò che, al contrario, viene processato quando il browser ottiene la pagina viene
definito come client-side. Javascript è un'ottima scelta per lo scripting client-side.
Il contenuto di una pagina html non è altro che il risultato di un HTTP response. Così
come puoi vedere il codice html di una pagina è possibile vedere anche il codice
javascript di una pagina. Dato ciò capiamo che potendo PHP creare pagine html,
PHP può creare anche codice Javascript. Javascript agisce sul client e di conseguenza
interagire con PHP è molto complicato perchè bisogna inviare un'http request.
Se pensi di avere qualche problema nel capire se e in che modo è possibile inviare
informazioni tra PHP e Javascript o tra Javascript e PHP, allora sarebbe saggio se rileggessi
meglio questa parte di guida.
Form HTML
Un task con il quale dovresti avere familiarità è quello dei form. I form sono
un modo molto conveniente di ottenere delle informazioni dagli utenti che navigano le tue pagine
e rende il web molto più interattivo. PHP rende il processamento dei dati di un form molto
semplicetramite superglobal array: $_GET e $_POST, a seconda del metodo utilizzato nel form.
Superglobal array sono accessibili in qualsiasi scope (vista). Non c'è bisogno di passarli
in una funzione o di dichiararli.
In php < 4.1.0 bisogna usare al posto di _GET e $_POST $_HTTP_GET_VARS e $_HTTP_POST_VARS
rispettivamente.
Per illustrare come vengono passate le informazioni consideriamo il seguente esempio:
<form action = "/process.php" method = "post">
<input type = "text" name = "risposta" />
<input type = "submit" />
</form>
Se un utente immette c nel campo input, la request http sarà più o meno
come la seguente:
POST /process.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 10
risposta=c
Come sviluppatore PHP puoi ottenere questo valore semplicemente utilizzando il superglobal
array $_POST['risposta'] perchè il metodo utilizzato dal form è post.
Al contrario, se nel method del form fosse stato specificato come metodo get allora
la request http sarebbe stata come la seguente:
GET /process.php?risposta=c HTTP/1.1
Host: example.org
Per ottenere il valore anche qui, sarà sufficiente utiizzare $_GET['risposta'];
Un punto importante dei form HTML è che ogni suo elemento è una coppia
nome/valore. E questo vale per campi hidden, radio, checkbox e tutti gli altri tipi.
Consideriamo il seguente codice come esempio:
<form action = "/process.php" method = "post">
<input type = "hidden" name = "risposta" value = "c" />
<input type = "submit" />
</form>
Sul browser vedremo solamente il pulsante di submit. Ovviamente il valore di $_POST['risposta']
sarà sempre c. Quindi il request attuale sarà come quello di prima ma con la differenza
che l'utente non potrà cambiare il valore di risposta. Osservando solo la request,
è impossibile trovare la differenza degli elementi della form.
Il comportamento di alcuni elementi del form può confondere molto spesso.
Elementi come checkbox e radio button, per via della loro natura booleana, sono inclusi nella
request solamente se selezionati. Quindi il corrispondente valore nella variabile PHP (quella
richiamata con il $_POST per intenderci) può non essere stata settata perchè
l'utente non ha cliccato sull'elemento attivandolo.
Esiste anche la possibilità che vi siano presenti più input
con lo stesso nome come nell'esempio che segue:
<form action = "/process.php" method = "post">
<input type = "text" name = "risposta" />
<input type = "text" name = "risposta" />
<input type = "submit" />
</form>
Il browser invierà una richiesta di questo tipo (se l'utente inserisce prima "c" e poi "a")
POST /process.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Lenght: 10
risposta=c&risposta=a
Quando vorrai conoscere il valore di risposta con $_POST['risposta'] vedrai che il suo valore
è a. Dove è finita il primo valore? Ovvero la c? Quando php assegna le variabili
queste vengono, eventualmente, come nel nostro caso, sovrascritte. Se non si vuole che
ciò accada basta usare un semplice metodo di
naming:
<form action = "/process.php" method = "post">
<input type = "text" name = "risposta[]" />
<input type = "text" name = "risposta[]" />
<input type = "submit" />
</form>
Aggiungendo [] alla fine del nome dell'elemento, chiedi a PHP di creare un array per quel particolare
elemento. Assumento che le risposte siano uguali alle precedenti, $_POST['risposta'] sarà un array
che conterrà tutti e due i valori. Per visualizzarli basterà utilizzare la funzione
print_r($_POST['risposta']); che darà output come segue:
Array
{
[0] => c
[1] => a
}
In questo modo avremo tutti e due i valori.
Cookies
I cookies sono una estensione del protocollo http. Specificamente, esistono due tipi di Header addizionali:
Set-Cookie e Cookie. Le operazioni di questi cookie sono facilmente spiegabili tramite la seguente
lista:
- Il client invia una richiesta http al server
- Il server risponde con un Set-Cookie: foo=bar al client
- Il client invia una richiesta http al server con un header Cookie: foo=bar al server
- Il server manda la risposta al client
Nel passo 2, il server chiede al client di memorizzare delle informazioni che il client, nel passo 3, invia
al server, sempre che l'utente abbia preventivamente dato il permesso al browser di memorizzare i cookie.
Questa spiegazione potrebbe non aver chiarito il perchè tu NON puoi determinare se un browser
ha o no abilitata la funzionalità del set-cookie durante la prima richiesta. Quando vuoi impostare
un cookie, che sia fatto con il comando set-cookie o header(), ciò che stai facendo è modificare
il response http includendo l'header Set-Cookie.
L'header Set-Cookie, minimo, contiene il nome e il valore del cookie per esempio
Set-Cookie: login=nomeutente
Altri attributi possono essere modificati quando si invia il cookie come per esempio:
- domain - Restringe le richieste al dominio specificato
- expires - Indica la data per la quale può essere cancellato il cookie
- secure - Un attributo senza valore che indica se il cookie debba essere trasmesso o no su una
connessione sicura o meno
Un esempio di Set-Cookie è il seguente:
Set-Cookie: foo=bar; domain=demenziale.altervista.org; expires=Mon, 26 Sep 2006 12:24:56 GMT; secure
L'header cookie incluso nella richiesta del client sarà
Cookie: foo=bar;
Tutti gli attributi contenuti nell'header Set-Cookie vengono utilizzati dal browser semplicemente
per determinare se e quando il cookie deve essere inviato al server.
In php i cookie ricevuti dal server da parte del client, possono essere utilizzati con l'array
superglobal $_COOKIE (per versioni precedenti alla 4.1.0 i cookie i potevano trovare nell'array
$_HTTP_COOKIE_VARS).
Sessions
Un uso comune dei cookie è quello di mantenere lo stato di una connessione. Infatti, i cookie
permettono di associare diverse connessioni ad un'unica connessione identificando lo specifico client.
Se setti il cookie con un identificatore, potresti memorizzare informazioni del client sul server
per poi riutilizzarle alla successiva connessione. Questa tecnica è: meglio conosciuta come
session management è risiede nell'abilità di mantenere lo stato.
PHP rende il tutto molto semplice con l'aiuto delle sessioni (Built-In). Per inizializzare una sessione
puoi semplicemente usare
session_start()
Se stai utilizzando il php.ini di default allora dovrai chiamare session_start(); prima di qualsiasi
altro codice. Dopo aver chiamato questa funzione potrai aggiungere valor per quell'utente semplicemente
usando l'array $_SESSION (super global)
$_SESSION['foo'] = 'bar';
Sarà PHP a fare attenzione a propagare l'identificatore di sessione tramite cookie o a propagarlo
nell'url a seconda di come è configurato il tuo php.ini. PHP pensa anche a memorizzare tutti i dati.
Solamente qualche direttiva del php.ini riguarda le sessioni:
- session.save_path - Indica il percorso in cui PHP salverà le sessioni e tutte le informazioni
collegate ad essa
-
session.use_cookie - Questo è un valore booleano che indica se PHP debba o meno propagare
l'identificatore di sessione tramite i cookie.
-
session.use_only_cookie - Questo è un valore booleano che indica se PHP debba o meno controllare
solamente i Cookie per il session id (e non anche l'url)
Di default PHP memorizza le informazioni sul filesystem. Se tu vuoi, puoi modificare il comportamento di
PHP definendo le tue personali funzioni che maneggiano i dati delle sessioni. Crea le tue
funzioni personalizzate e ordina PHP di usarle tramite il comando
session_set_save_handler( 'myopen', 'myclose', 'myread', 'mywrite','mydelete', 'mygarbage');
Questo ti dà moltissima flessibilità oer quanto concerne le sessioni.
P H P
D E V E L O P M E N T