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