PHP – 3 · Tecnologie di Sviluppo per il WEB 2 Interazione browser – server Quando un browser...

56
PHP – 3 Interazione con il browser

Transcript of PHP – 3 · Tecnologie di Sviluppo per il WEB 2 Interazione browser – server Quando un browser...

PHP – 3

Interazione con il browser

Tecnologie di Sviluppo per il WEB 2

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 3

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 4

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 5

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 6

Esempio<h2 style="text-align:center; color:red;">

Stampa Variabili $_SERVER</h2><table border cellpadding=2><tr> <th> Variabile </th> <th> Valore </th> </tr><?phpforeach($_SERVER as $indice => $elemento) {

echo "<tr><td>$indice</td> <td>$elemento</td>\n";}?></table>

ESEMPIO

Tecnologie di Sviluppo per il WEB 7

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)

ESEMPIO

Tecnologie di Sviluppo per il WEB 8

<?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 9

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;

elsereturn false;

}

Tecnologie di Sviluppo per il WEB 10

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 11

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 12

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 13

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 14

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 15

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 16

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 17

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 18

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 19

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>

</HTML> ESEMPIO

Tecnologie di Sviluppo per il WEB 20

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 21

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 22

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 23

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>

</BODY>

</HTML

ESEMPIO

Tecnologie di Sviluppo per il WEB 24

Codice PHP<?php

$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');

?>

prima di ogni output !!

Tecnologie di Sviluppo per il WEB 25

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 26

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 27

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 28

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 29

Richiesta inviata al server

Parentesi quadre []

Tecnologie di Sviluppo per il WEB 30

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 31

Risultato

ESEMPIO

Tecnologie di Sviluppo per il WEB 32

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 33

Risultato di stampa.php

Tecnologie di Sviluppo per il WEB 34

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 35

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! ";?>

ESEMPIO

Tecnologie di Sviluppo per il WEB 36

Esempio: indovina.php<form METHOD="POST" ACTION="verifica.php"><h2> Indovina la mia combinazione </h2>Scegli un numero da 1 a 9:<?phpfor($i=1;$i<10;$i++){

echo "<input type=\"radio\" name= \"scelta1\" value=$i >$i "; }?><br> Scegli un secondo numero:<?phpfor($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>

Radio button generati dinamicamente

Tecnologie di Sviluppo per il WEB 37

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 38

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 39

Esempio – 2

<?php} else { $celsius = ($fahr - 32) * 5/9; printf("%.2fF è %.2fC", $fahr, $celsius); }?></body></html>

ESEMPIO

Tecnologie di Sviluppo per il WEB 40

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 41

<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>

ESEMPIO

Tecnologie di Sviluppo per il WEB 42

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 43

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

ESEMPIO

Tecnologie di Sviluppo per il WEB 44

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 45

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 46

Funzione per creare le checkboxfunction 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 47

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 48

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 49

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 50

Upload di file – 4

Per verificare se il file è stato scaricato correttamente si usa la funzione is_uploaded_file(nomeFile)

Esempioif(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 51

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 52

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 53

Caratteri speciali

ESEMPIO

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 54

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 55

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 56

Sequenze di ripetizione ? 0 oppure 1 * 0 oppure più + 1 oppure più {n} esattamente n {n,m} almeno n, al più m {n,} almeno n

– preg_match('(ca)+t', 'cacacacacat')• True

– preg_match('^((55[67]{1})|(087)|(056))/[0-9]{6}$', $Matricola))