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