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) ESEMPIO Tecnologie di Sviluppo per il WEB 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 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> </BODY> ESEMPIO </HTML Tecnologie di Sviluppo per il WEB 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 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ù"> Ragù <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! ";?> ESEMPIO Tecnologie di Sviluppo per il WEB 35
Esempio: indovina.php <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 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 è %.2fC", $fahr, $celsius); }?> </body> </html> ESEMPIO Tecnologie di Sviluppo per il WEB 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 ESEMPIO Tecnologie di Sviluppo per il WEB 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 ESEMPIO Tecnologie di Sviluppo per il WEB 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? 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)) Tecnologie di Sviluppo per il WEB 56