PHP e il Web
Termini che devi imparare
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:
  1. Il client invia una richiesta http al server
  2. Il server risponde con un Set-Cookie: foo=bar al client
  3. Il client invia una richiesta http al server con un header Cookie: foo=bar al server
  4. 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: 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: 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