Laboratorio di reti II: PHP

Transcript

Laboratorio di reti II: PHP
Laboratorio di reti II: PHP
Stefano Brocchi
[email protected]
2 marzo, 2009
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
1 / 55
Il PHP
Il PHP
Il PHP è un linguaggio di scripting che si può inserire in una pagina
HTML permettendo di creare la pagina web dinamicamente come
definito nel codice PHP
Esistono plugin PHP per numerosi server HTTP che permettono al
codice nelle pagine PHP di essere interpretato ed eseguito
Quando un client farà quindi richiesta di una pagina PHP, il server
eseguirà il codice in essa contenuto ed il suo output, insieme al codice
HTML della pagina, verrà restituito all’utente
PHP è un acronimo ricorsivo per PHP, hypertext preprocessor
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
2 / 55
Il PHP
Il PHP
Il linguaggio PHP è gratuito, può essere utilizzato anche per fini
commerciali senza alcuna spesa ed i plugin e molte librerie sviluppate
dagli autori possono essere ottenute liberamente
Il PHP è il linguaggio per la creazione di pagine dinamiche più usato
nel mondo. La configurazione più classica di un server web è la
cosidetta LAMP: Linux, Apache, MySql, PHP
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
3 / 55
Il PHP
Il PHP
Il codice PHP in una pagina web deve essere delimitato dai simboli
<?php e ?>
Similarmente ad altri linguaggi, ogni istruzione PHP termina con un
punto e virgola
Per creare output da inserire nella pagina web utilizzare il metodo
print()
Analogamente si può utilizzare l’istruzione echo. Questa non è
propriamente un metodo; l’istruzione echo stampa sulla pagina la
stringa specificata.
Messaggi di errore generati da PHP vengono generalmente scritti su
file di log gestiti dal server
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
4 / 55
Il PHP
Hello world in PHP
Vediamo il codice di una semplice pagina PHP:
<html>
<head>
<title>Hello World in PHP<title>
</head>
<body>
<center>
<?php
echo "<h1>Hello World !</h1>";
?>
</center>
</body>
</html>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
5 / 55
Il PHP
Variabili PHP e weak typing
Variabili in PHP
Le variabili in PHP sono identificate da stringhe che iniziano con il
simbolo $
Il linguaggio PHP si dice weak typed: questo vuol dire che non ci
sono controlli statici sulle variabili. Si possono utilizzare variabili non
dichiarate o cambiare tipo ad una variabile senza generare errori
<?php
$a = 10;
$b = "stringa";
$a = $b;
echo $a;
// Stampato nell’HTML: stringa
?>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
6 / 55
Il PHP
Variabili PHP e weak typing
Problemi del weak typing
Il weak typing può essere comodo in quanto ci permette di risparmiare
diverso codice, ma può anche essere causa di numerosi errori piuttosto
insidiosi. Il seguente codice per esempio ciclerebbe all’infinito:
<?php
$mioIndice = 0;
while ($mioIndice < 10) {
...
$mioIdnice = $mioIndice + 1;
}
?>
L’errore è dato dall’errore di battitura $mioIdnice al posto di
$mioIndice; l’interprete PHP in questo caso crea una nuova variabile
$mioIdnice e non aggiorna il contatore del ciclo
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
7 / 55
Il PHP
Variabili PHP e weak typing
Problemi del weak typing
Essendo anche le varie operazioni e funzioni definite per tipi generici, i
risultati per tipi diversi da quelli attesi possono essere piuttosto
insoliti
Per fare un esempio, l’operatore ’+’ se applicato a stringhe, per poter
fare la somma converte queste ad interi scartando i caratteri a partire
dal primo che non rappresenta una cifra
<?php
$var = 8;
$var2 = "12 giorni";
$var3 = "giorni 12";
echo $var + $var2;
// 20
echo "<br>";
echo $var + $var3;
// 8
echo "<br>";
echo $var + $var4;
// 8
?>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
8 / 55
Il PHP
Variabili PHP e weak typing
Funzioni PHP per la gestione di variabili
Per la manipolazione di variabili esistono diverse funzioni tra cui
isset() che restituisce true se la variabile è stata definita
unset() che impone che una determinata variabile risulti indefinita
var dump() che stampa informazioni dettagliate (per variabili
’semplici’ tipo e valore) sulla variabile passata
Tutte le precedenti possono essere applicate ad un qualsiasi numero di
argomenti
Per determinare il tipo di una variabile esistono funzioni come
is int() o is string(). Inoltre il metodo gettype() restituisce il
tipo della variabile come una stringa
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
9 / 55
Il PHP
Costrutti e strutture di base
Operatori
Gli operatori aritmetici PHP hanno sostanzialmente la stessa sintassi
che in Java, e sono +, -, +, /, % (modulo), ++ (incremento) e - (decremento)
Come in altri linguaggi, è possibile usare la notazione per gli
assegnamenti $var op= ...;
Es. $var -= $var2;
Come in Java anche gli operatori logici: && (and), k (or) e ! (not)
Commenti inseribili tramite // se su un’unica riga o con la sintassi /*
commento */
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
10 / 55
Il PHP
Costrutti e strutture di base
If, while e for
Le sintassi degli operatori if, while e for seguono nuovamente la
solita sintassi Java
Un esempio che stampa un conto alla rovescia:
<?php
for ($i = 10; $i >= 0; $i --) {
echo $i;
echo "<br>";
}
?>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
11 / 55
Il PHP
Array in PHP
Vettori
Un vettore in PHP può essere definito con la sintassi
$var = array( elemento0, elemento1, ... )
Grazie al weak typing è possibile mescolare in un unico vettore
elementi di tipo diverso
I vettori in PHP sono inoltre dinamici, ed è possibile aggiungere
elementi anche oltre gli indici di definizione del vettore
Grazie alla sintassi $vettore[] = elemento è possibile aggiungere un
elemento nella prima posizione libera
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
12 / 55
Il PHP
Array in PHP
Vettori
Un esempio di utilizzo di vettori:
<?php
$a = array("zero ", 1, " due ");
echo $a[0];
echo $a[1];
echo $a[2];
$a[3] = "tre ";
echo $a[3];
$a[] = 4;
echo $a[4];
?>
L’output sarà ’zero 1 due tre 4’
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
13 / 55
Il PHP
Array in PHP
Vettori
Un’altra caratteristica utile dei vettori in PHP è la possibilità di
definire degli indici non numerici ma in forma di stringa
Per specificare un vettore con determinati valori associati a
determinate chiavi, utilizzare la sintassi
$array = array(chiave1 => elemento1, chiave2 => elemento2, ...)
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
14 / 55
Il PHP
Array in PHP
Vettori
Un esempio:
<?php
$a = array(0 => "zero ", "uno" => 1);
echo $a[0];
echo $a["uno"];
echo $a[1];
// Nessun output: a[1] non definito
$a["due"] = " due";
echo $a["due"];
?>
L’output sarà ’zero 1 due’
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
15 / 55
Il PHP
Array in PHP
Vettori
Per scorrere comodamente gli elementi di un vettore esiste l’istruzione
foreach
Con foreach si specifica di ciclare una volta per ogni valore nel
vettore
La sintassi è la seguente:
foreach ($array as [$key =>] $value) ...
Array rappresenta l’array da scorrere, value il valore dei suoi
elementi e key, se specificato, il valore delle sue chiavi
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
16 / 55
Il PHP
Array in PHP
Vettori
Un esempio dell’uso di foreach:
<?php
$a = array("key" => "value", 2 => "value2");
foreach ($a as $key => $value) {
echo $key;
echo " = ";
echo $value;
echo "; ";
}
?>
L’output sarà ’key = value; 2 = value2;’
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
17 / 55
Il PHP
Stringhe ed apici
Stringhe ed apici
In PHP le stringhe possono essere limitate dai due tipi di apici: ”
oppure ’
La differenza tra i due è che con i doppi apici le variabili all’interno
della stringa vengono interpretate con il loro valore
$var = ’Valore’;
echo ’$var’;
// Output: $var
echo "$var";
// Output: Valore
All’interno di una stringa delimitata da un tipo di apice si può inserire
l’altro tipo di apice senza caratteri di escape
Questo è comodo quando dobbiamo inserire apici nell’HTML:
echo ’<body bgcolor="green">’;
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
18 / 55
Il PHP
Stringhe ed apici
Stringhe ed apici
L’operatore di concatenazione in PHP è il punto (.)
Es. echo "La variabile a ha valore ".$a."<br>";
Sono a disposizione per le stringhe i soliti caratteri di escape come \n
per newline
E’ utile inserire degli ’a capo’ nella pagina in modo da produrre codice
HTML leggibile dal programmatore, consentendo una più facile
risoluzione dei problemi se ci sono errori nella pagina creata
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
19 / 55
Il PHP
Importazione di file esterni
Importazione di file esterni
In PHP si possono importare file esterni tramite la funzione include
’nomefile’
Es. include ’head.php’;
Quando viene incontrata un’istruzione include, PHP si comporta
come se il codice presente nel file indicato si trovasse al posto
dell’istruzione include
Il file indicato viene trattato come se fosse all’esterno di tag <?php
... ?>. Se in questo file si vuole specificare codice php sarà
necessario riaprire il tag di delimitazione
Utilizzare file esterni per definire funzioni che vengono utilizzate in più
pagine, in modo da mantenere la modularità
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
20 / 55
Il PHP
Importazione di file esterni
Altre funzioni di importazione
Per l’importazione di file si può utilizzare la funzione require
L’effetto è identico a quello di include con l’unica differenza che, in
caso di errore nel caricare il file, require causa la terminazione
dell’esecuzione
Esistono inoltre le funzioni include once e require once che
includono il file specificato solo se questo non è stato incluso
precedentemente
Queste sono utili per file che definiscono delle funzioni o delle variabili,
in quanto si evita cosı̀ di dare più definizioni per la stessa entità
causando potenzialmente dei problemi
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
21 / 55
Il PHP
Definizione di funzioni
Definire funzioni
In PHP possono essere definite delle funzioni tramite la sintassi
function nomefunzione (parametri) { corpo }
Es. function resto($dividendo, $divisore) {...}
Essendo PHP weak-typed, non occorre specificare il tipo di parametri
in ingresso, anche se può essere utile indicare che tipo è atteso nella
documentazione del codice
Ogni funzione può ritornare una variabile, anche se questo non è
specificato nella sua dichiarazione. L’istruzione per la restituzione di
valore è, come in Java, return
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
22 / 55
Il PHP
Definizione di funzioni
Visibilità delle variabili
Normalmente, all’interno di una funzione le variabili definite
esternamente non sono visibili. Un esempio di codice:
$a = 1;
function f() {
echo 3 + $a;
}
f();
Stefano Brocchi
// $a non definito if f()
// Output: ’3’
Laboratorio di reti II: PHP
2 marzo, 2009
23 / 55
Il PHP
Definizione di funzioni
Visibilità delle variabili
Per specificare che una variabile fa riferimento all’ambiente esterno
alla funzione, utilizzare l’istruzione global:
$a = 1;
function f() {
global $a;
echo 3 + $a;
}
f();
Stefano Brocchi
// $a = 1
// Output: ’4’
Laboratorio di reti II: PHP
2 marzo, 2009
24 / 55
Il PHP
Oggetti in PHP
Oggetti in PHP
A partire dal PHP 5 è stato introdotto nel linguaggio il supporto degli
oggetti
Per garantire comunque la retro compatibilità con le versioni
precedenti, gli oggetti risultano essere una funzionalità aggiuntiva e
non l’entità di base come in altri linguaggi
I controlli sulla correttezza dell’uso dei vari oggetti sono molto
limitati, coerentemente alla politica del weak-typing
Ad esempio la chiamata ad un metodo inesistente di un oggetto non
genera alcun tipo di errore a tempo di compilazione
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
25 / 55
Il PHP
Oggetti in PHP
Oggetti in PHP
La definizione di una classe avviene tramite la sintassi
class nomeclasse { corpo }
La creazione di un oggetto viene fatta tramite la parola chiave new:
Es. $a = new obj();
Il costruttore di una classe deve essere definito in un metodo
chiamato construct()
Per richiamare metodi di un oggetto utilizzare il simbolo ->
Es. $a->metodo();
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
26 / 55
Il PHP
Oggetti in PHP
Oggetti in PHP
Il simbolo ::, anche detto Paamayim Nekudotayim, serve per definire
l’accesso a metodi di un oggetto al posto di -> nei seguenti casi:
Quando si vuole accedere ad un metodo staticamente, cioè senza un
riferimento ad un oggetto della classe dove è definito il metodo
In php si può accedere in modo statico anche a metodi non statici; in
questo caso qualsiasi campo dell’oggetto al quale il metodo fa
riferimento risulta indefinito
Per accedere a campi costanti (e quindi statici) di una classe definiti
tramite la parola chiave const
Per accedere a metodi dell’oggetto padre sovrascritti, tramite la
sintassi parent::nomemetodo()
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
27 / 55
Il PHP
Oggetti in PHP
Oggetti in PHP
Altre funzionalità offerte dal php:
Definizione di campi e metodi public, private e protected
funzionanti esattamente come in Java
Variabile $this, rappresentante l’oggetto corrente. Se il metodo che
fa riferimento a $this è stato richiamato in modo statico, la variabile
farà riferimento all’oggetto dal quale è stato chiamato il metodo
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
28 / 55
Il PHP
Oggetti in PHP
Oggetti in PHP
Ancora altre funzionalità offerte dal php per gli oggetti:
Metodo get class() che restituisce il nome della classe di un
oggetto passato come una stringa
Parola chiave static, che specifica che un metodo può essere
richiamato solo in modo statico
Altre keywords per funzionalità del tutto uguali a quelle in Java:
extends per l’estendibilità, abstract per classi astratte e final per
classi e metodi che non possono venir estesi o riscritti
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
29 / 55
Il PHP
Esercizio (1)
Esercizio (1)
Realizzare il sito rappresentante il forum tramite template
Creare delle funzioni PHP che generino automaticamente parti dei
documenti HTML comuni a più pagine
Per esempio, creare funzioni per l’intestazione della pagina, per la
struttura iniziale e per i vari box
Per quanto riguarda le liste di thread o di post in un thread, creare
delle funzioni che generino i vari elementi in funzione di un codice
identificativo. Per ora ignorare il codice nel corpo della funzione, in
seguito questo servirà per ottenere il contenuto richiesto salvato nel
database
Riportare in dei file esterni, da importare dal codice PHP, i frammenti
di codice HTML da utilizzare
Mantenere le informazioni sulle liste di link nei vari box in vettori
associativi
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
30 / 55
Il PHP
Esercizio (1)
Esercizio (1)
Dopo aver cosı̀ modularizzato il sito, in un file PHP rappresentante
una pagina web dovranno essere presenti solo alcune chiamate a
funzioni PHP oltre al contenuto della specifica pagina
In questo modo, per creare una nuova pagina sarà sufficiente
riutilizzare le stesse funzioni e scrivere soltanto il contenuto che
differisce dalle altre pagine
Inoltre tramite questa tecnica si può modificare la struttura di tutte le
pagine presenti nel sito modificando un’unico file HTML
rappresentante il template
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
31 / 55
Il PHP
Esercizio (1)
Esercizio (1)
Dopo questa operazione, il codice che realizza il sito viene suddiviso
in aree di responsabilità:
La grafica rimane nei file CSS
La struttura e la logica della pagina viene impostata nel codice PHP
Il contenuto statico delle varie pagine viene inserito volta per volta nel
codice HTML
Si può cosı̀ lavorare su uno di questi aspetti in modo modulare senza
interferire con gli altri due
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
32 / 55
Il PHP
Gestione parametri in ingresso
Parametri in GET e POST
PHP inserisce il contenuto dei parametri passati alla pagina in GET o
POST nei vettori $ GET e $ POST
In generale le variabili che iniziano con il carattere di underscore ( )
sono variabili riservate da PHP
Nei due vettori troveremo come chiavi i nomi dei parametri passati e
come valori i loro contenuti
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
33 / 55
Il PHP
Gestione parametri in ingresso
Parametri in GET e POST
Il seguente codice per esempio stampa sulla pagina le chiavi ed i
valori dei parametri in GET:
<?php
if (empty($_GET)) {
echo "Nessun parametro in GET.<br>\n";
} else {
echo "Parametri in GET:<br><br>\n";
foreach ($_GET as $key => $val) {
echo $key." = ".$val." <br>\n";
}
}
?>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
34 / 55
Il PHP
Gestione parametri in ingresso
Vettore SERVER
Un’altra variabile predefinita è l’array $ SERVER
Questa contiene numerose informazione a proposito del server sul
quale il codice è in esecuzione e sulla richiesta HTTP inviata.
Vediamo di seguito alcuni dei suoi campi:
’SERVER ADDR’ e ’SERVER NAME’ contengono l’indirizzo ed il
nome del server
’HTTP USER AGENT’, ’HTTP ACCEPT ENCODING’,
’HTTP ACCEPT LANGUAGE’ rappresentano i relativi campi della
richiesta HTTP
’REMOTE ADDR’, ’REMOTE HOST’ e ’REMOTE PORT’
contengono indirizzo, nome e porta del client che ha effettuato la
richiesta
’PHP SELF’ rappresenta il nome della pagina php richiesta,
relativamente al nome dell’host
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
35 / 55
Il PHP
Gestire header HTTP
La funzione header
La funzione header permette di impostare i parametri della risposta
HTTP
Visto che l’intestazione HTTP deve precedere il contenuto della
pagina, la funzione dovrà essere richiamata prima dell’invio di
qualsiasi output HTML
La sintassi della funzione è la seguente:
void header ( string $string [, bool $replace [, int
$http response code ]])
Il primo parametro rapresenta il valore da impostare nella risposta
HTTP nella forma parametro:valore
Es. header(’Content-language:
Stefano Brocchi
it’);
Laboratorio di reti II: PHP
2 marzo, 2009
36 / 55
Il PHP
Gestire header HTTP
La funzione header
Esistono due possibili tipi di valori speciali per il parametro di header
Se il parametro inizia con ’http:/’, allora verrà impostato il codice
di risposta della pagina
Es. header("HTTP/1.0 403 Forbidden");
Se il parametro è nella forma "Location:URL" allora il codice di
risposta sarà impostato in modo da richiedere la redirezione all’url
indicata
Es. header("Location:
http://www.sito destinazione.com/");
In questo caso, è utile accertarsi che altro codice della pagina corrente
non venga eseguito. Usare per esempio l’istruzione exit che causa la
terminazione
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
37 / 55
Il PHP
Gestire header HTTP
La funzione header
Il secondo parametro di header() è un boolean che indica cosa fare
nel caso il parametro HTTP specificato abbia già un valore
Nel caso sia true, il valore viene sostituito, mentre nel caso sia false
il valore viene concatenato a quello già esistente. Questo ha senso in
quanto molti parametri HTTP ammettono più valori
L’ultimo parametro di header() specifica che il codice di risposta
HTTP deve essere l’intero specificato
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
38 / 55
Il PHP
Sessioni
Necessità delle sessioni
Il protocollo HTTP è stateless: chiudendo una connessione dopo
l’esecuzione di ogni richiesta non può associare automaticamente due
richieste allo stesso client
Per poter identificare un utente, viene utilizzato un meccanismo che
fa uso di sessioni
Una sessione è un’astrazione per cui un’utente viene riconosciuto
come se rimanesse sempre connesso rendendo trasparente la sua
disconnessione
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
39 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Una sessione viene realizzata mandando ad un client un codice
identificativo quando questo si connette, e richiedendo che questo sia
riinviato al server alla successiva connessione
In questo modo il server memorizzerà un numero di identificativi di
sessione e ad ogni diverso utente potrà associare variabili persistenti
tra una connessione e l’altra
Per realizzare una sessione e comunicare il codice identificativo si
possono usare due strumenti: i parametri per la pagina (GET o
POST) oppure i cookie
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
40 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Un cookie è un piccolo file di testo di cui il server richiede la
creazione, specificando un determinato contenuto
Quando il client si riconnetterà allo stesso host il browser riinvierà il
suo contenuto al server
Alternativamente, per gestire le sessioni il server può inviare nella
pagina HTML l’identificativo come un parametro GET o POST, in
modo che questo venga riinviato al server alla successiva connessione
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
41 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Se il browser accetta cookie, PHP ne fa utilizzo in modo del tutto
trasparente per la gestione della sessione
Per inizializzare una sessione, sia per la sua creazione che per il
recupero di dati inseriti precedentemente, chiamare la funzione
session start()
Al primo utilizzo di session start() per un determinato utente,
verrà richiesta la creazione di un cookie tramite l’intestazione HTTP
E’ necessario richiamare session start() prima di aver inviato
qualsiasi contenuto della pagina al client, altrimenti l’intestazione
potrebbe essere già stata inviata
Dopo l’inizializzazione, si possono salvare e recuperare dati di una
sessione tramite l’array $ SESSION
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
42 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Vediamo per esempio una pagina php che conteggia il numero di
visite effettuate da ogni utente, nel file count.php
<?php
session_start();
if (empty($_SESSION[’count’])) {
$_SESSION[’count’] = 1;
} else {
$_SESSION[’count’]++;
}
echo "Hai visitato questa pagina ";
echo $_SESSION[’count’]." volte.<br>";
?>
Per continuare, <a href=’count.php’> cliccare qui </a>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
43 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Nel caso il browser rifiuti il cookie, PHP inizializza in una stringa nella
variabile SID una richiesta GET che identifica la sessione
Un esempio di SID potrebbe essere
PHPSESSID=pc09bg7qssti0i1keslnt8l9s5 dove PHPSESSID è di
default il nome della variabile per l’id di sessione.
Se il parametro rappresentante l’identificativo di sessione viene
correttamente passato tramite GET, PHP riconosce automaticamente
la sessione che può venir gestita come al solito tramite
session start() e $ SESSION
Se il browser ha invece accettato il cookie, il SID risulta essere una
stringa vuota
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
44 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Per esempio, il precedente esempio di conteggio delle visite funziona
anche senza cookie sostituendo all’ultima riga il seguente codice:
Per continuare,
<?php
echo "<a href=’count.php?".SID."’>";
?>
cliccare qui </a>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
45 / 55
Il PHP
Sessioni
Realizzazione delle sessioni
Vediamo ora altre funzioni a disposizione per la gestione delle sessioni:
session name()
Ritorna una stringa rappresentante il nome del parametro contenente
l’identificativo di sessione (per default PHPSESSID)
session id()
Restituisce l’identificativo della sessione che deve essere inviato dal
client per la sua identificazione. Questo valore viene generato
casualmente al momento della creazione di una sessione
session destroy()
Distrugge la sessione corrente, eliminando tutti i dati in essa
contenuti. Da usare per esempio dopo un’operazione di logout
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
46 / 55
Il PHP
Upload di file
Upload di file
In HTML è possibile specificare form per l’upload di file
Impostare per quasto caso l’attributo type del tag <input> a file
Il browser visualizzerà questo tag come un’area di testo con un
pulsante per la scelta del file tramite navigazione del filesystem
(opzione ’sfoglia’)
Per l’invio di file sarà necessario specificare il valore
multipart/form-data per l’attributo enctype di <form>
Un esempio di HTML per l’upload:
<form enctype="multipart/form-data" action="upload.php"
method="POST">
<input type="file" name="myfile">
<input type="submit" value="upload">
</form>
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
47 / 55
Il PHP
Upload di file
Upload di file
Si può limitare la dimensione del file inviato in due modi:
Specificando un parametro da inviare al server di nome
MAX FILE SIZE nel form, con la dimensione massima in byte.
Essendo questo parametro riinviato dal client, non è da considerarsi
del tutto affidabile
Specificando una dimensione massima per i file in upload nel file di
configurazione di php php.ini
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
48 / 55
Il PHP
Upload di file
Upload di file
Una volta che viene eseguito con successo un upload, il server avrà
una copia del file caricato in una cartella temporanea
Le informazioni riguardanti il file si trovano nella variabile globale
$ FILES
Nel campo $ FILES[nomefile] si trova un vettore contenete nelle
seguenti chiavi informazioni sul file caricato:
’name’
’type’
’size’
’tmp name’
’error’
Il nome del file sul client
Il tipo di file inviato
La dimensione del file in byte
Il nome del file temporaneo corrispondente sul server
Un codice che descrive un’eventuale errore nel caricamento
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
49 / 55
Il PHP
Upload di file
Upload di file
A questo punto per trasferire il file nella cartella opportuna si può
utilizzare la funzione
move uploaded file(string $filename, string
$destination)
Questa funzione restituisce false se l’operazione è fallita o se il file
indicato non è un file di upload valido
Può essere utile la funzione basename che dato il percorso di un file
ne restituisce la parte relativa al nome del file
Php mette a disposizione numerose altre funzioni per la manipolazione
dei file tra cui copy, delete, readdir e file exists
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
50 / 55
Il PHP
Upload di file
Upload di file: esempio
Vediamo un esempio di gestione dell’upload di un file, chiamato
’myfile’ nel form HTML e da spostare nella cartella
uploadedFiles
echo "Nome: ".$_FILES[’myfile’][’name’]."<br>\n";
echo "Tipo: ".$_FILES[’myfile’][’type’]."<br>\n";
echo "Dimensione: ".$_FILES[’myfile’][’size’].
" byte<br>\n";
$uploadDest = "./uploadedFiles/".
basename($_FILES[’myfile’][’name’]);
if (move_uploaded_file($_FILES[’myfile’][’tmp_name’],
$uploadDest)) {
echo "File caricato correttamente.<br>\n";
} else {
echo "Errore: ".$_FILES[’myfile’][’error’]."<br>\n";
}
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
51 / 55
Il PHP
Download di file
Download di file
Per leggere un file da server ed inviare il suo contenuto in output al
client si può utilizzare la funzione readfile($filename)
E’ cosı̀ possibile inviare ad uno specifico client un file che per gli altri
non risulta pubblicato in rete
Per indicare al client come trattare il file si può specificare il campo
Content-type della risposta http
Un esempio:
header("Content-Type: application/pdf");
readfile ("../downloads/file.pdf");
exit;
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
52 / 55
Il PHP
Download di file
Download di file
Per imporre che il file specificato venga scaricato e non, per esempio,
interpretato dal browser, si può specificare che il campo
Content-type abbia valore application/force-download
Possibile specificare il nome del file da salvare su disco tramite
l’header
Content-Disposition:
Stefano Brocchi
filename= nomefile
Laboratorio di reti II: PHP
2 marzo, 2009
53 / 55
Il PHP
Esercizio (2)
Esercizio (2)
Realizzare il login sul sito del forum
Prima di accedere al sito, un utente dovrà fornire un nome utente ed
una password validi
Per adesso, specificare i dati validi nel codice PHP. La funzione che ne
controlla l’esattezza verrà modificata per eseguire questo controllo via
database
Se il login viene effettuato correttamente, verrà creata una sessione
che permetterà l’accesso al forum
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
54 / 55
Il PHP
Esercizio (2)
Esercizio (2)
All’inizio di ogni pagina quindi una funzione dovrà controllare se
l’utente è autorizzato all’accesso, ed in caso contrario non visualizzare
la pagina
Tramite l’opzione di logout, la sessione corrente deve essere distrutta
in modo che un altro login sia necessario per ulteriori accessi
Stefano Brocchi
Laboratorio di reti II: PHP
2 marzo, 2009
55 / 55