PHP – 3
Interazione con il browser
Interazione browser – server


Quando un browser contatta un server gli
invia alcune informazioni (si veda la lezione
su HTTP)
Ci sono sei tipi di informazioni a cui il server
può
accedere.
Alcune
relative
alla
configurazione del server altre sono passate
dal browser al server
– Collettivamente, si fa riferimento a tali informazioni
come EGPCS (Environment, GET, POST, Cookie
e Server)

Gli script PHP possono accedere a tali
informazioni
Tecnologie di Sviluppo per il WEB
2
PHP e EGPCS – 1


PHP crea sei (5+1) array globali associativi
per contenere le informazioni EGPCS
$_SERVER
– Conserva informazioni sul server
• $_SERVER['DOCUMENT_ROOT']

$_ENV
– Conserva i valori delle variabili di ambiente
– Queste variabili sono importate nello spazio
globale PHP dall’ambiente in cui il parser PHP è in
esecuzione ($_ENV['HOME'])
Tecnologie di Sviluppo per il WEB
3
PHP e EGPCS – 2

$_GET
– Conserva i valori inviati tramite GET

$_POST
– Conserva i valori passati da un modulo HTML
inviato tramite POST

$_COOKIE
– Conserva gli eventuali cookie passati tramite una
richiesta HTTP

$_FILES
– Conserva informazioni relative ai file che il
browser invia al server
Tecnologie di Sviluppo per il WEB
4
Nota
 Gli
array associativi precedenti sono
degli alias ai seguenti array associativi
– HTTP_COOKIE_VARS
– HTTP_GET_VARS
– HTTP_POST_VARS
• Sono array del tipo HTTPX_VARS, dove X è
uno degli array analizzati prima
 Dalla
versione PHP 4.1.0 sono in
disuso, ma potreste trovarli in manuali o
codice “vecchio”
 Il loro uso adesso è deprecato
Tecnologie di Sviluppo per il WEB
5
Esempio
<h2 style="text-align:center; color:red;">
Stampa Variabili $_SERVER</h2>
<table border cellpadding=2>
<tr> <th> Variabile </th> <th> Valore </th> </tr>
<?php
foreach($_SERVER as $indice => $elemento) {
echo "<tr><td>$indice</td> <td>$elemento</td>\n";
}
?>
</table>
ESEMPIO
Tecnologie di Sviluppo per il WEB
6
Accesso a pagine protette
 Utilizzeremo
– Autenticazione HTTP Basic
• non è sicura...serve solo a non far rompere il
protocollo http con password avanzate
– si puo' usare in piccole reti private
– Informazioni che troviamo in $_SERVER[ ]
• Se settate (perché sono state utilizzate)
Tecnologie di Sviluppo per il WEB
ESEMPIO
7
<?php // DEVE ESSERE LA PRIMA LINEA DEL DOCUMENTO
$user = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
if (!isset($user) || verifica($user,$password)==false){
header('WWW-Authenticate: Basic realm="Trop Secret" ');
header('HTTP/1.1 401 Unauthorized');
echo 'Qui inseriamo il messaggio che deve comparire';
echo 'se si preme il tasto Annulla';
exit;
} else {
echo 'Qui inseriamo il messaggio che deve comparire';
echo 'se l’autenticazione è andata a buon fine';
} ?>
Tecnologie di Sviluppo per il WEB
8
Funzione di verifica password
function verifica($user, $password) {
//qui possiamo accedere ad un database
// per verificare se ad $user corrisponde
// $password
if($user == "ambrogio" && $password ="pippo")
return true;
else
return false;
}
Tecnologie di Sviluppo per il WEB
9
Codice da inserire in ogni pagina da proteggere
<?php // DEVE ESSERE LA PRIMA LINEA DEL DOCUMENTO
$user = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
if (!isset($user)){
header('WWW-Authenticate: Basic realm="Sezione
Protetta del Sito" ');
header('HTTP/1.1 401 Unauthorized');
} else { …..
}

Si può gestire il tutto in un modo migliore con
le sessioni, dettagli in seguito…
Tecnologie di Sviluppo per il WEB
10
Altro modo per organizzare il codice
<?php
$auth_ok = 0;
$user = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];
if(isset($user) && isset($password) && verifica($user,$password))
{ $auth_ok = 1; }
if(!$auth_ok ) {
header('WWW-Authenticate: Basic realm="Sezione Protetta Sito" ');
header('HTTP/1.1 401 Unauthorized');
}
else {
// PAGINA DA PROTEGGERE
}
?>
Tecnologie di Sviluppo per il WEB
11
First line...da ricordare!!!
 Remember
that header() must be called
before any actual output is sent, either
by normal HTML tags, blank lines in a
file, or from PHP. It is a very common
error to read code with include(), or
require(), functions, or another file
access function, and have spaces or
empty lines that are output before
header() is called. The same problem
exists when using a single PHP/HTML
file.
Tecnologie di Sviluppo per il WEB
12
Autenticazione sicura: DIGEST
 Http
autenticazione DIGEST
– Trasmette i dati cifrati (con md5)
 Usare
con cautela come black-box
 Si può ottenere un simile risultato
configurando opportunamente il server
Apache mediante il file .htaccess
– Tutti i documenti presenti in una data
directory saranno protetti da login e
password
Tecnologie di Sviluppo per il WEB
13
Moduli HTML e PHP
Si possono usare i moduli HTML per
passare dei dati a script PHP
 Gli script PHP possono ricevere i valori di
input passati da un controllo in un modulo
usando un nome di una variabile che
corrisponde a quella specificata attraverso
l’attributo NAME

– Se REGISTER_GLOBALS è settato ad OFF
per ricevere un input da un modulo passato
con METHOD settato a POST bisogna usare
invece $_POST[“NomeVariabile”];
• Vedi slide successiva
Tecnologie di Sviluppo per il WEB
14
Importante!!!

A partire da PHP 4.2.1, per motivi di
sicurezza, PHP richiede di default un
meccanismo differente per ricevere input da
un modulo
– Per ripristinare il vecchio modo di ricevere input da un modulo
bisogna settare ad ON la direttiva REGISTER_GLOBALS nel file di
configurazione php.ini (dalla versione 6 verrà abolita)

Ogni variabile relativa ad un modulo è
memorizzata in un array associativo
accessibile attraverso il nome del controllo
– <input type=”text” name=”pippo”> corrisponde in
PHP a $_GET['pippo']
Tecnologie di Sviluppo per il WEB
15
Accesso ai parametri di un modulo



Per accedere ai parametri di un modulo
(valori associati ai controlli del modulo)
all’interno di uno script PHP usiamo gli array
$_POST, $_GET e $_FILE
Gli indici (chiavi) degli array sono i nomi dei
controlli utilizzati nel modulo
In HTML è legale usare il punto (.) all’interno
di un nome di un controllo, ma in PHP è
vietato
– I punti nel nome di un controllo sono convertiti in
underscore (_) nell’array (slide successiva)
Tecnologie di Sviluppo per il WEB
16
Nota
 In
HTML è legale usare il punto (.)
all’interno di un nome di un controllo, ma
in PHP è vietato
– <input type=”text” name=”pippo.pluto”>
I
punti nel nome di un controllo sono
convertiti in underscore (_) nell’array
– $_GET['pippo_pluto']
esempio
Tecnologie di Sviluppo per il WEB
17
Esempio di get fuori dal modulo
A
proposito di GET, vediamo un suo uso,
senza form, ma con una àncora:
– ESEMPIO
Tecnologie di Sviluppo per il WEB
18
Mappe lato server – HTML
<HTML>
<HEAD><TITLE>Uso di ISMAP </TITLE>
<STYLE> BODY {font-size:14pt;} </STYLE>
</HEAD>
<BODY>
<a href="ismap.php">
<IMG ISMAP SRC="donut.gif" width=200 border=1>
</a>
</BODY>
ESEMPIO
</HTML>
Tecnologie di Sviluppo per il WEB
19
Mappe lato server – PHP
<?php
echo "<p>Valori contenuti nell'array \$_GET</p>\n";
foreach($_GET as $chiave => $elemento)
{ echo "$chiave => $elemento<br>\n"; }
reset($_GET);
echo "<p>Stampa della prima chiave dell'array</p>\n";
echo key($_GET)."<br>\n";
echo "<p>Stampa delle coordinate passate</p>\n";
$valori = explode(",",key($_GET));
$x=$valori[0]; $y=$valori[1];
echo "x=$x &nbsp;&nbsp;&nbsp; y=$y<br>";
?>
Tecnologie di Sviluppo per il WEB
20
Mappe lato server o lato client?
Secondo w3 per HTML4.01


Client-side. When a user activates a region of
a client-side image map with a mouse, the
pixel coordinates are interpreted by the user
agent. The user agent selects a link that was
specified for the activated region and follows it.
Server-side. When a user activates a region of
a server-side image map with a mouse, the
pixel coordinates of the click are sent to the
server-side agent specified by the href attribute
of the A element. The server-side agent
interprets the coordinates and performs some
action.
Tecnologie di Sviluppo per il WEB
21
Mappe lato server o lato client?
Secondo w3 per HTML4.01
 Client-side
image maps are preferred
over server-side image maps for at least
two reasons: they are accessible to
people browsing with non-graphical user
agents and they offer immediate
feedback as to whether or not the pointer
is over an active region.
Tecnologie di Sviluppo per il WEB
22
Esempio di mappa lato server
<HTML>
<HEAD><TITLE>Uso di ISMAP </TITLE>
<STYLE> BODY {font-size:14pt;} </STYLE>
</HEAD>
<BODY>
<a href="http://localhost/mappa-header.php">
<IMG ISMAP src="mappacitta.gif" width= "200"
border= "1" >
</a>
ESEMPIO
</BODY>
Tecnologie di Sviluppo per il WEB
</HTML
23
Codice PHP
<?php
prima di ogni output !!
$valori = explode(",",key($_GET)); $x=$valori[0]; $y=$valori[1];
if (25 <= $x and $x<=175) {
if (35 <= $y and $y<=60)
header('Location: avellino.html');
elseif (90 <= $y and $y<=115)
header('Location: benevento.html');
elseif (140 <= $y and $y<=165)
header('Location: caserta.html');
elseif (195 <= $y and $y<=220)
header('Location: napoli.html');
elseif (245 <= $y and $y<=270)
header('Location: salerno.html');
Else header('Location: fuori-mappa.html');
} else
header('Location: fuori-mappa.html');
?>
Tecnologie di Sviluppo per il WEB
24
Input type=img
esempio (1/2)
<form method="GET"
action="image.php" >
<input type="image" src="donut.gif"
name="cane">
</form>
Nella URL vengono passate le
coordinate cane.x e cane.y
Tecnologie di Sviluppo per il WEB
25
Input type=img
esempio (2/2)
<?php
echo "<p>Valori contenuti nell'array \$_GET</p>\n";
foreach($_GET as $indice => $elemento)
echo "$indice => $elemento<br>\n";
reset($_GET);
echo "<p>Stampa delle coordinate passate</p>\n";
$x=$_GET['cane_x']; $y=$_GET['cane_y'];
echo "x=$x &nbsp;&nbsp;&nbsp; y=$y<br>";
?>
ESEMPIO
Tecnologie di Sviluppo per il WEB
26
Parametri a più valori




Il tag SELECT permette di scegliere tra una
lista di opzioni
Per essere sicuri che PHP riconosca i valori
multipli che il browser passa ad uno script è
necessario che il valore dell’attributo NAME
finisca con [ ]
– altrimenti le vbl sono sovrascritte
Il valore presente nelle collezioni $_POST o
$_GET sarà un array invece di una semplice
stringa
La stessa cosa vale anche per caselle di
spunta (checkbox) che hanno lo stesso
nome
Tecnologie di Sviluppo per il WEB
27
Esempio
<select name=“linguaggi[ ]” multiple>
<option value=“c”> C
</option>
<option value=“cpp”> C++ </option>
<option value=“java”>Java </option>
</select>
$scelte = $_GET[‘linguaggi’];
$scelte è un array lungo count($scelte)
ESEMPIO
Tecnologie di Sviluppo per il WEB
28
Richiesta inviata al server
Parentesi quadre []
Tecnologie di Sviluppo per il WEB
29
pasta.html: Scegli il condimento
<FORM METHOD="POST"
ACTION="http://localhost/stampa.php">
Scegli il condimento che preferisci: <BR>
<INPUT TYPE="CHECKBOX" NAME="condimento[]"
VALUE="rag&ugrave;"> Rag&ugrave; <BR>
<INPUT TYPE="CHECKBOX" NAME="condimento[]"
VALUE="panna" CHECKED> Panna<BR>
<INPUT TYPE="CHECKBOX" NAME="condimento[]"
VALUE="genovese"> Genovese
<P>
<INPUT TYPE="submit" VALUE="Invia i dati">
<INPUT TYPE="reset" VALUE="Cancella tutto!">
</FORM>
Tecnologie di Sviluppo per il WEB
30
Risultato
ESEMPIO
Tecnologie di Sviluppo per il WEB
31
Codice stampa.php
<?php
$salsa = $_POST['condimento'];
echo "I condimenti che preferisci sono: <br>";
$cnt = count($salsa);
for($i=0; $i < $cnt; $i++) {
echo "Condimento ";
echo $i+1;
echo ": $salsa[$i] <br>";
}
?>
Tecnologie di Sviluppo per il WEB
32
Risultato di stampa.php
Tecnologie di Sviluppo per il WEB
33
Esempio: Indovina i numeri
<form METHOD="POST" ACTION="verifica.php">
<h2> Indovina la mia combinazione </h2>
Scegli un numero da 1 a 9 <br>
<input type="radio" name= "scelta1" value=1 >1
….
<input type="radio" name= "scelta1" value=9 >9<br>
Scegli un secondo numero:
<input type="radio" name= "scelta2" value=1 >1
….
<input type="radio" name= "scelta2" value=9 >9<br>
<input TYPE="submit" VALUE="invia">
<input TYPE="reset " VALUE="resetta"> </form>
Tecnologie di Sviluppo per il WEB
34
Esempio: verifica.php
<?php
$com1=3; $scelta1 = $_POST['scelta1'];
$com2=9; $scelta2 = $_POST['scelta2'];
if (( $scelta1 == $com1 ) && ( $scelta2 == $com2))
print "Hai indovinato i due numeri $com1 $com2!";
elseif (( $scelta1 == $com1 ) || ( $scelta2 == $com2))
print "Hai indovinato solo un numero";
else
print "Hai sbagliato tutto! ";
?>
Tecnologie di Sviluppo per il WEB
ESEMPIO
35
Esempio: indovina.php
<form METHOD="POST" ACTION="verifica.php">
<h2> Indovina la mia combinazione </h2>
Radio button generati
Scegli un numero da 1 a 9:
dinamicamente
<?php
for($i=1;$i<10;$i++){
echo "<input type=\"radio\" name= \"scelta1\" value=$i >$i "; }
?>
<br> Scegli un secondo numero:
<?php
for($i=1;$i<10;$i++){
echo "<input type=\"radio\" name= \"scelta2\" value=$i >$i "; }
?> <br>
<input TYPE="submit" VALUE="invia">
<input TYPE="reset" VALUE="resetta"> </form>
Tecnologie di Sviluppo per il WEB
36
Moduli auto-chiamanti
È
possibile utilizzare lo stesso script
PHP sia per generare un modulo sia
per elaborarlo
 All’interno
dello
script
possiamo
conoscere il nome dello script stesso
– È sufficiente accedere al valore di
$_SERVER['PHP_SELF']
– Questa variabile contiene il nome dello
script corrente
Tecnologie di Sviluppo per il WEB
37
Esempio – 1
<html>
<head><title> Conversione di Temperatura </title></head>
<body>
<?php
$fahr = $_POST['fahrenheit'];
if (is_null($fahr)) {
?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>"
method="POST">
Temperatura Fahrenheit :
<input type="text" name="fahrenheit">
<input type="submit" name="Converti in Celsius!">
</form>
Tecnologie di Sviluppo per il WEB
38
Esempio – 2
<?php
} else { $celsius = ($fahr - 32) * 5/9;
printf("%.2fF è %.2fC", $fahr, $celsius); }
?>
</body>
</html>
ESEMPIO
Tecnologie di Sviluppo per il WEB
39
Moduli appiccicosi – sticky form
 Sono
script PHP che una volta
terminata l’elaborazione mostrano sia i
risultati sia il modulo
– E.g., dopo una ricerca con Google
otteniamo una serie di link soddisfacenti la
richiesta più la casella di controllo
contenente la richiesta effettuata prima
 Il
seguente codice per la conversione di
gradi Fahrenheit in gradi Celsius ne è
un esempio
Tecnologie di Sviluppo per il WEB
40
<html>
<head><title> Conversione di Temperatura </title></head>
<body>
<?php $fahr =$_GET['fahrenheit']; ?> /* vedi il sorgente */
<form action="<?php echo $_SERVER['PHP_SELF'] ?>"
method="GET">
Temperatura Fahrenheit :
<input type="text" name="fahrenheit"
value="<?php echo $fahr ?>">
<input type="submit" name="Converti in Celsius!"> </form>
<?php
if (!is_null($fahr)) {
$celsius = ($fahr -32)*5/9;
printf("%.2fF &egrave; %.2fC", $fahr, $celsius);
}
?> </body> </html>
Tecnologie di Sviluppo per il WEB
ESEMPIO
41
In generale
 Se
lo script è invocato senza parametri,
allora viene visualizzato il modulo con
cui fornire i parametri
 Se
lo script è invocato con parametri
allora viene visualizzato il modulo con i
valori dei controlli già settati e il risultato
dell’elaborazione dei parametri forniti
Tecnologie di Sviluppo per il WEB
42
Sticky-form per checkbox
 Non
possiamo ri-mostrarle perché sono
passate solo quelle checked...
• quindi dobbiamo fare altro
 Chiaramente
si suppone che tutte le
checkbox hanno lo stesso nome
 Si crea un array contenente il valore
della checkbox e quello che deve
comparire vicino ad ognuna di esse.
 Si esegue un ciclo foreach per creare la
lista delle checkbox eventualmente già
spuntate
Tecnologie di Sviluppo per il WEB
ESEMPIO
43
Generazione form
<?php $scelte = $_GET['gusti'];
if (! is_array($scelte)) { $scelte = array(); } ?>
<form
action="<?php echo $_SERVER['PHP_SELF'] ?>"
method="GET">
Scegli i gusti della tua pizza:<br>
<?php
make_checkboxes('gusti', $scelte, $tipi_condimento); ?>
<br>
<input type="submit" name="s"
//vedi il sorgente...
value="Ordina la pizza!">
</form>
Tecnologie di Sviluppo per il WEB
44
Parametri di make_checkboxes
 $name
– nome del campo checkbox della form (le
parentesi quadre [] sono aggiunte dalla
funzione)
 $query
– parametri attuali della richiesta GET
 $options
– array di (value=>label) per le checkbox
– tutte le opzioni presenti in $query saranno
marcate come checked
Tecnologie di Sviluppo per il WEB
45
Funzione per creare le checkbox
function make_checkboxes ($name, $query, $options ) {
foreach ($options as $value => $label) {
printf('<input type="checkbox" name="%s[]"
value="%s" ', $name, $value);
if (in_array($value, $query)) { echo "checked "; }
echo "> $label <br>\n";
}
}
 $value rappresenta il valore della checkbox che sarà
contenuto nell’array $query se quella checkbox viene
selezionata.
 I valori delle checkbox devono essere le chiavi
dell’array $options
Tecnologie di Sviluppo per il WEB
46
Upload di file – 1


Attraverso il tag
<input type=“file” name=“NomeFile”>
possiamo inviare un file al server WEB
Ricordarsi di settare l’attributo ENCTYPE
del tag FORM
– enctype="multipart/form-data"

Si può settare nel file php.ini anche la
directory dove scaricare temporaneamente i
file
– Settare la direttiva upload_tmp_dir
Tecnologie di Sviluppo per il WEB
47
Upload di file – 2

Informazioni sul file inviato si trovano
nell’array associativo $_FILES[‘NomeFile’]
<input type=“file” name=“NomeFile”>

Ogni elemento di $_FILES è esso stesso un
array di cinque elementi con indici:
–
–
–
–
–
name
type
tmp_name
error
size
Tecnologie di Sviluppo per il WEB
48
Upload di file – 3

name
– Indica il nome del file originale sulla macchina
dell’utente.

type
– mime-type del file inviato

tmp_name
– Nome temporaneo del file sul server WEB

size
– Grandezza del file inviato

error
– Codice di errore associato all’upload del file
ESEMPIO
Tecnologie di Sviluppo per il WEB
49
Upload di file – 4
 Per
verificare se il file è stato scaricato
correttamente si usa la funzione
is_uploaded_file(nomeFile)
 Esempio
if(is_uploaded_file($_FILE[‘NomeFile’][‘tmp_name’]))
 Per
spostare il file scaricato in un’altra
directory
si
usa
la
funzione
move_uploaded_file
– att.ne ai permessi!!!
Tecnologie di Sviluppo per il WEB
50
Espressioni regolari (compatibili Perl)
 Si
utilizzano quando si ha bisogno di
funzionalità più spinte per ricerca di
stringhe o meglio in stringhe.
 Expr. Reg. = Stringa che rappresenta un
pattern (insieme, possibilmente infinito)
di stringhe.
 Confrontare una stringa s con
l'espressione regolare ER, consiste nel
verificare se ER contiene s.
– In gergo non pulito... “ER matcha s”
Tecnologie di Sviluppo per il WEB
51
Espressioni Regolari
 Ci
sono vari usi (ne vediamo solo uno)
1) Matching
•
Estrazione di info da una stringa
2) Sostituzione
•
Sostituire sottostringhe nuove con quelle trovate
(matchate...)
3) Split di stringhe in pezzi di array
4) ...
ESEMPIO
Tecnologie di Sviluppo per il WEB
52
Caratteri speciali








Obbligatori i delimitatori: /, [, (, {,<,#,+,%,',...
^ : inizio della stringa, $ : fine della stringa
int preg_match (string $pattern , string $subject [,
array &$matches])
preg_match('/indi/', 'gnati', $matches)
– restituisce false e l'array $matches vuoto
preg_match('/gnati/', 'indignati') : TRUE
preg_match('/^gnati/', 'indignati') : FALSE
preg_match('/gnati$/', 'indignati') :TRUE
. (punto) : rappresenta un singolo carattere
– preg_match('/.occa/', 'bocca') : TRUE
Tecnologie di Sviluppo per il WEB
ESEMPIO
53
Classi di caratteri
 preg_match('c[aeiou]t',
'I cut my hand')
 preg_match('c[aeiou]t', 'My own cat ')
 preg_match('c[aeiou]t', 'My certificates')
– Restituiscono tutte e tre true
 preg_match('c[aeiou]t',
'My cronometer')
– Restituisce false
 Si
può negare (uso di caret differente)
– preg('c[^aeiou]t', 'I cut my hand')
• Viene valutata a false
Tecnologie di Sviluppo per il WEB
54
Alternative (OR)





preg_match('cat|dog', 'my cat's name is
Remo');
preg_match('cat|dog', 'my dog's name is
Romolo');
preg_match('^([a-z]|[0-9])', 'La mia casa');
– False
preg_match('^([a-z]|[0-9])', 'la mia casa');
– True
preg_match('^([a-z]|[0-9])', '1 ragazze per me');
– true
Tecnologie di Sviluppo per il WEB
55
Sequenze di ripetizione
?
*
+
 {n}
 {n,m}
 {n,}
0 oppure 1
0 oppure più
1 oppure più
esattamente n
almeno n, al più m
almeno n
– preg_match('(ca)+t', 'cacacacacat')
• True
– preg_match('^((55[67]{1})|(087)|(056))/[0-9]{6}$',
$Matricola))
Tecnologie di Sviluppo per il WEB
56
Scarica

Interazione con il browser