PHP – 3

Transcript

PHP – 3
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
PHP – 3
Interazione con il browser
– 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
PHP e EGPCS – 1
PHP e EGPCS – 2
PHP crea sei array globali associativi per
contenere le informazioni EGPCS
$_SERVER
– Conserva informazioni sul server
$_GET
– Conserva i valori passati da un modulo HTML
inviato tramite GET
$_POST
– Conserva i valori passati da un modulo HTML
inviato tramite POST
• $_SERVER['DOCUMENT_ROOT']
$_ENV
$_COOKIE
– 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
2
– Conserva gli eventuali cookie passati tramite una
richiesta HTTP
$_FILES
– Conserva informazioni relative ai file che il
browser invia al server
3
Tecnologie di Sviluppo per il
WEB
4
Nota
Esempio
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
Accesso a pagine protette
Utilizzeremo
– Autenticazione HTTP Basic
– Informazioni che troviamo in $_SERVER[ ]
• Se settate
Si può ottenere lo stesso risultato
configurando opportunamente il server
Apache
– Tutti i documenti presenti in una data
directory saranno protetti da login e
password
Tecnologie di Sviluppo per il
WEB
ESEMPIO
7
<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";
}
?>
ESEMPIO
</table>
(anche con ENV)
Tecnologie di Sviluppo per il
WEB
6
<?php
$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
Codice da inserire in ogni pagina da proteggere
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
<?php
$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');
…..
9
Si può gestire il tutto in un modo migliore con
le sessioni, dettagli in seguito…
Tecnologie di Sviluppo per il
WEB
Moduli HTML e PHP
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
10
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
12
Importante!!!
Accesso ai parametri di un modulo
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
Ogni variabile relativa ad un modulo è
memorizzata in un array associativo
accessibile attraverso il nome del controllo
Tecnologie di Sviluppo per il
WEB
– I punti nel nome di un controllo sono convertiti in
underscore (_) nell’array
13
Parametri a più valori
Tecnologie di Sviluppo per il
WEB
14
Esempio
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 [ ]
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
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
15
<select name=“linguaggi[]”>
<option value=“c”>C</option>
<option value=“cpp”>C++</option>
<option value=“java”>Java</option>
ESEMPIO
</select>
$scelte = $_GET[‘linguaggi’];
$scelte è un array lungo count($scelte)
Tecnologie di Sviluppo per il
WEB
16
Richiesta inviata al server
Esempio: 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!">
Parentesi quadre []
</FORM>
Tecnologie di Sviluppo per il
WEB
17
Risultato
Tecnologie di Sviluppo per il
WEB
18
Codice pasta.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>";
}
?>
ESEMPIO
Tecnologie di Sviluppo per il
WEB
19
Tecnologie di Sviluppo per il
WEB
20
Risultato di stampa.php
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
21
Esempio: verifica.php
22
Esempio: indovina.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
Tecnologie di Sviluppo per il
WEB
ESEMPIO
23
<form METHOD="POST" ACTION="verifica.php">
<h2> Indovina la mia combinazione </h2>
Scegli un numero da 1 a 9:
Radio button generati
<?php
dinamicamente
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
24
Moduli auto-chiamanti
Esempio – 1
È 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
<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>
25
Esempio – 2
Tecnologie di Sviluppo per il
WEB
Moduli appiccicosi – sticky form
Sono script PHP che una volta
terminata l’elaborazione mostrano sia i
risultati sia il modulo
<?php
} else { $celsius = ($fahr - 32) * 5/9;
printf("%.2fF è %.2fC", $fahr, $celsius); }
?>
</body>
</html>
– E.g., dopo una ricerca con Google
otteniamo una serie di link soddisfacenti la
richiesta più una casella di controllo
contenente la richiesta effettuata
ESEMPIO
Tecnologie di Sviluppo per il
WEB
26
27
Il seguente codice per la conversione
di gradi Fahrenheit in gradi Celsius ne
è un esempio
Tecnologie di Sviluppo per il
WEB
28
<html>
<head><title> Conversione di Temperatura </title></head>
<body>
<?php $fahr =$_GET['fahrenheit']; ?>
<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>
In generale
Se lo script è invocato senza parametri,
allora viene visualizzato il modulo con
cui fornire i parametri
<?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
29
Sticky-form per checkbox
ESEMPIO
Tecnologie di Sviluppo per il
WEB
30
Generazione form
Bisogna supporre che tutte le checkbox
hanno lo stesso nome
Si crea un array contenente il valore
della checkbox e quello che deve
comparire vicino ad essa
Si esegue un ciclo foreach per creare
la lista delle checkbox eventualmente
già spuntate
Tecnologie di Sviluppo per il
WEB
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
31
<?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"
value="Ordina la pizza!">
</form>
Tecnologie di Sviluppo per il
WEB
32
Funzione per creare le checkbox
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
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
selezionat. I valori delle checkbox devono essere le
chiavi dell’array $options
– array di value=>label per le checkbox
– tutte le opzioni presenti in $query saranno
marcate come checked
Tecnologie di Sviluppo per il
WEB
33
Upload di file – 1
34
Upload di file – 2
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
Tecnologie di Sviluppo per il
WEB
35
Informazioni sul file inviato si trovano
nell’array associativo $_FILES[‘NomeFile’]
Ogni elemento di $_FILE è esso stesso un
array di cinque elementi con indici:
–
–
–
–
–
name
type
tmp_name
error
size
Tecnologie di Sviluppo per il
WEB
36
Upload di file – 3
Upload di file – 4
Per verificare se il file è stato scaricato
correttamente si usa la funzione
is_uploaded_file
name
– Indica il nome del file originale sulla macchina
dell’utente.
type
– mime-type del file inviato
Esempio
tmp_name
if(is_uploaded_file($_FILE[‘NomeFile’][‘tmp_name’]))
– Nome temporaneo del file sul server WEB
size
– Grandezza del file inviato
error
– Codice di errore associato all’upload del file
Tecnologie di Sviluppo per il
WEB
37
Tecnologie di Sviluppo per il
WEB
Espressioni regolari
38
Espressioni Regolari
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.
Tecnologie di Sviluppo per il
WEB
Per spostare il file scaricato in un’altra
directory
si
usa
la
funzione
move_uploaded_file
Ci sono tre usi
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
39
Array chunk
Tecnologie di Sviluppo per il
WEB
40
Caratteri speciali
Classi di caratteri
ereg('c[aeiou]t', 'I cut my hand')
ereg('c[aeiou]t', 'My own cat ')
^ caret: inizio della stringa
$ : fine della stringa
ereg('^dona', 'Maradona')
– restituisce false
– Entrambi restituiscono true
ereg('c[aeiou]t', 'My certificates')
ereg('c[aeiou]t', 'My cronometer')
ereg('^dona', 'donadoni')
– Restituisce true
– Entrambi false
Simmetrico per il $
. (punto) : rappresenta un singolo carattere
– ereg('.occa', 'bocca')
• Restituisce true
Si può negare (uso di caret differente)
Tecnologie di Sviluppo per il
WEB
– ereg('c[^aeiou]t', 'I cut my hand')
• Viene valutata a false
41
Alternative
Tecnologie di Sviluppo per il
WEB
42
Sequenze di ripetizione
Ereg('cat|dog', 'my cat's name is Remo');
Ereg('cat|dog', 'my dog's name is Romolo');
Ereg('^([a-z]|[0-9])', 'La mia casa');
– False
Ereg('^([a-z]|[0-9])', 'la mia casa');
– True
Ereg('^([a-z]|[0-9])', '1 ragazze per me');
– true
?
*
+
{n}
{n,m}
{n,}
0 oppure 1
0 oppure più
1 oppure più
esattamente n
almeno n, al più m
almeno n
– ereg('(ca)+t', 'cacacacacat')
• True
– ereg('^((55[67]{1})|(087)|(056))/[0-9]{6}$', $Matricola))
Tecnologie di Sviluppo per il
WEB
43
Tecnologie di Sviluppo per il
WEB
44
Subpatterns
Utilizzo di parentesi per creare subpatterns
– ereg('a (very)+ big dog', 'it is a very very big dog')
• true
Tecnologie di Sviluppo per il
WEB
45