MODULO 1 PARTE 3 Programmazione (scripting) server-side con PHP 3.a HTTP request e HTTP response (form e link) Goy - a.a. 2009/2010 Programmazione Web 1 Gli oggetti HTTP request e HTTP response -I Vi ricordate? Un HTTP Server gestisce 2 flussi di informazioni: HTTP request: le richieste in arrivo dai client HTTP response: le risposte del server, inviate ai client In particolare... L'oggetto HTTP request contiene tutte le informazioni relative alla richiesta che il client (browser) fa al server: l'indicazione di un URL (o di una pagina) + eventuali dati L oggetto HTTP response contiene varie informazioni che il server invia, in risposta, al client (codice di stato del server, eventuali metadati,... nello Header e contenuto - per es. la pagina web richiesta -nel Body) Goy - a.a. 2009/2010 Programmazione Web 2 1
Gli oggetti HTTP request e HTTP response -II Server request response client Gliscriptserver-side server-side possono interagire con vari "oggetti", tra cui HTTP request e HTTP response Per esempio, l'oggetto HTTP request contiene tutte le informazioni relative alla richiesta che il client (browser) fa al Web server Per es: l'utente compila un modulo on-line (form HTML); quando clicca sul pulsante di invio del modulo,,p parte la richiesta al server; l'oggetto request conterrà varie informazioni relative alla richiesta del client, tra cui tutti i dati del modulo (per es: i nomi dei campi e i rispettivi valori) L'oggetto response viene utilizzato dal Web server per inviare informazioni al client (browser) Goy - a.a. 2009/2010 Programmazione Web 3 PHP: l oggetto HTTP response -I Web Server HTTP request HTTP response browser p echo "Hello!"; print "Ciao!"; echo e print scrivono nel Body dell'oggetto HTTP response NOTA: echo e print sono equivalenti: l'unica differenza è che echo funziona anche con più stringhe (separate da una virgola: echo "pippo", "pluto",...) NB: Non sono vere e proprie funzioni, per questo le parentesi non sono obbligatorie Goy - a.a. 2009/2010 Programmazione Web 4 2
PHP: l oggetto HTTP response -II Digressione su HTTP response Nelle pagine PHP è possibile intervallare linee di script e linee di codice HTML, per es: if ($_POST[ POST["risposta"]=="si") si { <P ALIGN="CENTER">Bravo!</P> else { <P ALIGN="CENTER">Peccato!</P> oppure (equivalentemente) utilizzare echo per scrivere HTML: if ($_POST["risposta"]=="si") { echo "<P ALIGN='CENTER'>Bravo!</P>" else { echo "<P ALIGN='CENTER'>Peccato!</P>" Goy - a.a. 2009/2010 Programmazione Web 5 PHP: l oggetto HTTP response - III NOTA: Attenzione agli apici!!! HTML: <P ALIGN="CENTER">CONGRATULAZIONI!</P> PHP: echo "<P ALIGN='CENTER'>OK!</P>"; oppure echo "<P ALIGN=\"CENTER\">OK!</P>"; Goy - a.a. 2009/2010 Programmazione Web 6 3
Ripasso di HTML: <form...> -I In HTML, un form o modulo on-line (tag <form...>) contiene: 1. metodo (attributo METHOD del tag <FORM...>) = modo in cui vengono codificati i dati da inviare al server 2. campi di input (tag <INPUT...> e altri) = elementi attraverso cui l'utente fornisce dei dati 3. azione (attributo ACTION del tag <FORM...>) = script (o programma) che "raccoglie" ed "elabora" i dati contenuti nel form Goy - a.a. 2009/2010 Programmazione Web 7 Ripasso di HTML: <form...> -II Come funziona un form? <HTML><BODY> <FORM METHOD="POST" ACTION="identif.php" > Login: <INPUT TYPE="TEXT" NAME="login"/> Password: <INPUT TYPE="PASSWORD" NAME="pwd"/> <INPUT TYPE="Submit" VALUE="OK"/> </FORM> </BODY></HTML> Quando l'utente fa click sul pulsante inviato al server... cosa vuol dire? il modulo viene Goy - a.a. 2009/2010 Programmazione Web 8 4
Ripasso di HTML: <form...> - III Viene costruita una HTTP request che contiene: l'indicazione della risorsa (per es. pagina PHP) che contiene il programma (per es. lo script PHP) che "gestirà" i dati (attributo ACTION) i dati (parametri), nella forma di coppie <nome, valore> (tag <INPUT...> e altri), codificati secondo il metodo prescelto (attributo METHOD) Nell'esempio precedente, HTTP request contiene: risorsa = identif.php parametri: <login, admin> <pwd, pippo> NB nella form, tutti i campi (tag <INPUT...> e altri) sono caratterizzati da: nome = attributo NAME (o ID) del tag valore = ciò che l'utente ha scritto/selezionato Goy - a.a. 2009/2010 Programmazione Web 9 Ripasso di HTML: <form...> -IV Tipi di campi (tag <INPUT...>): Caselle di testo <INPUT TYPE="text" NAME="login"/> Caselle di testo per password <INPUT TYPE="password" NAME="pwd"/> Pulsanti di opzione (radio button) NB stesso nome! <INPUT TYPE="radio" NAME="accetto" value="si"/> <INPUT TYPE="radio" NAME="accetto" value="no"/> NB sono mutuamente esclusivi!!! Caselle di controllo (checkbox) NB stesso nome! <INPUT TYPE="checkbox" NAME="interessi[]" value="cinema"/> <INPUT TYPE="checkbox" NAME="interessi[]" value="teatro"/> NB non sono mutuamente esclusivi!!! devo "raccoglierli" in un array (interessi[])!!! Goy - a.a. 2009/2010 Programmazione Web 10 5
Ripasso di HTML: <form...> -V Campi nascosti <INPUT TYPE="hidden" NAME="utente" value="pippo"/> non vengono visualizzati nella pagina, ma vengono inclusi in HTTP request: <utente, pippo> Pl Pulsante diinvio i (submit) b <INPUT TYPE="submit" value="invia"/> Pulsante di reset <INPUT TYPE="reset" value="reset"/> NB Il tag <INPUT...> ha altri attributi opzionali, per esempio: <INPUT TYPE="text" NAME="login" value="pippo" size="4"/> <INPUT TYPE="checkbox" NAME="interessi" value="cinema" checked/> [NB checked checked="true"] Goy - a.a. 2009/2010 Programmazione Web 11 Ripasso di HTML: <form...> -V Inoltre, all'interno di un form è possibile usare Aree di testo <TEXTAREA NAME="msg" cols="20" row="5"></textarea> Caselle combinate (select) <SELECT NAME="job"> <option value="null"></option> <option value="imp">impiegato</option> <option value="ins">insegnante</option> </select> Goy - a.a. 2009/2010 Programmazione Web 12 6
PHP: l oggetto HTTP request I All'interno di HTTP request i dati (parametri) possono essere codificati in due modi diversi (attributo METHOD del tag <FORM...>): GET: i dati (parametri), cioè le coppie <nome, valore>,, sono scritti in coda alla risorsa saranno quindi visibili nell'url (nella barra degli indirizzi del browser) Nell'esempio, HTTP request contiene: risorsa = identif.php?login=admin&pwd=pippo POST: i dati (parametri), cioè le coppie <nome, valore>, sono scritti all'interno del corpo di HTTP request non saranno quindi visibili ibili nella barra degli indirizzi i i del browser Nell'esempio, HTTP request contiene: risorsa = identif.php parametri: <login, admin> <pwd, pippo> Goy - a.a. 2009/2010 Programmazione Web 13 PHP: l oggetto HTTP request II Come faccio (dallo script contenuto nella pagina PHP indicata nell'attributo ACTION del tag <FORM...>) a leggere i parametri contenuti in HTTP request? I parametri sono resi disponibili a PHP all'interno di due array associativi: i i $_GET[] e $_POST[]. In particolare: se il metodo utilizzato è GET, i parametri sono memorizzati nell'array associativo $_GET[] se il metodo utilizzato è POST, i parametri sono memorizzati nell'array associativo $_POST[] login pwd... chiavi admin pippo... valori $_GET["login"] "admin" $_GET["pwd"] "pippo" "... oppure $_POST["login"] "admin" $_POST["pwd"] "pippo"... Goy - a.a. 2009/2010 Programmazione Web 14 7
PHP: l oggetto HTTP request III NB1 Il nome del parametro in HTTP request, e quindi la chiave all'interno dell'array $_GET[] o $_POST[], è dato dal valore dell'attributo NAME nel tag <INPUT...> (o <TEXTAREA...> o <SELECT...>): ) <FORM METHOD="POST"...> <INPUT TYPE="text" NAME="login"/> $_POST["login"] NB2 Visto che, utilizzando il metodo GET, i dati sono visibili nella barra degli indirizzi del browser, non usate GET per trasmettre password o dati sensibili! Goy - a.a. 2009/2010 Programmazione Web 15 PHP: l oggetto HTTP request IV NB3 Nel caso delle checkbox il parametro non è una semplice coppia <nome, valore>, ma un array che contiene tutti i valori selezionati dall'utente; per es: <FORM METHOD="POST"...> <INPUT TYPE="checkbox" NAME="interessi[]" value="cinema"/> <INPUT TYPE="checkbox" NAME="interessi[]" value="teatro"/> <INPUT TYPE="checkbox" NAME="interessi[]" value="musica"/> <INPUT TYPE="checkbox" NAME="interessi[]" value="sport"/> $_POST["interessi"] cinema teatro musica NB senza []!!! 0 1 2 L'array contiene solo le checkbox selezionate!!! Per leggere i valori selezionati dall'utente devo utilizzare un ciclo sull'array; in PHP, per esempio: $int = $_POST["interessi"]; foreach ($int as $i) { echo $i.", "; Goy - a.a. 2009/2010 Programmazione Web 16 8
PHP: l oggetto HTTP request V Esempio1: form per inviare login e password (es-form1.html) <FORM METHOD="POST" ACTION="identif1.php"> Login: <INPUT TYPE="TEXT" NAME="login"/> Password: <INPUT TYPE="PASSWORD" NAME="pwd"/> <INPUT TYPE="Submit" VALUE="OK"/>... </FORM> VEDI es-form1.html VEDI identif1.php Quando il server riceve la richiesta, chiede all'interprete PHP di eseguire lo script contenuto nella pagina indicata in HTTP request (identif1.php) $id = $_POST["login"]; $pass = $_POST["pwd"]; if ($id = = "admin" && $pass = = "pippo") pp { echo "Benvenuto amministratore!"; else { echo "Gentile ".$id.", login e password sono sbagliati..."; Goy - a.a. 2009/2010 Programmazione Web 17 PHP: l oggetto HTTP request VI VEDI es-form1.html VEDI identif1.php Nella cartella corsopw creiamo due nuovi file es-form1.html e identif1.php in cui inseriamo il form e lo script precedenti (oppure li scarichiamo da www.di.unito.it/~goy/corsopw-0910.html, esempi scripting server-side) side) Avviamo il Web client, cioè il browser, e ci connettiamo al web server, richiedendo la pagina es-form1.html; per fare ciò digitiamo nella barra degli indirizzi l'url (*) : http://localhost:8080/corsopw/es-form1.html Cliccando poi sul pulsante OK, partirà una HTTP request al server, contenente la richiesta per identif1.php e i parametri del form (*) A casa, senza :8080!!! Goy - a.a. 2009/2010 Programmazione Web 18 9
PHP: l oggetto HTTP request VII Esempio2: form di registrazione (es-form2.html) VEDI es-form2.html VEDI identif2.php <FORM METHOD="POST" ACTION="identif2.php" > Nome: <INPUT TYPE="TEXT" NAME="nome"/> Cognome: <INPUT TYPE="TEXT" NAME="cognome"/> Età: <SELECT NAME="eta"> <OPTION VALUE="meno20">meno di 20</OPTION> <OPTION VALUE="tra20e40">tra 20 e 40</OPTION> <OPTION VALUE="tra40e60">tra 40 e 60</OPTION> <OPTION VALUE="piu60">più di 60</OPTION> </SELECT> <INPUT TYPE="RADIO" NAME="sesso" VALUE="m"/> M <INPUT TYPE="RADIO" NAME="sesso" VALUE="f"/> F Interessi: <INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="cinema"/> Cinema <INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="teatro"/> Teatro <INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="musica"/> Musica <INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="sport"/> Sport <INPUT TYPE="Submit" VALUE="OK"/>... </FORM> Goy - a.a. 2009/2010 Programmazione Web 19 PHP: l oggetto HTTP request VIII VEDI es-form2.html VEDI identif2.php Quando il server riceve la richiesta, chiede all'interprete PHP di eseguire lo script contenuto nella pagina indicata in HTTP request (identif2.php) $n = $_POST[ POST["nome"]; $c = $_POST["cognome"]; $s = $_POST["sesso"]; $int = $_POST["interessi"]; echo "<P ALIGN='CENTER'>"; echo "<B>nome</B>: ".$n."<br>"; echo "<B>cognome</B>: ".$c."<br>"; echo "<B>sesso</B>: ".$s."<br>"; echo "<B>interessi</B>: "; foreach ($int as $i) { echo $i. ", "; echo "</P>"; Goy - a.a. 2009/2010 Programmazione Web 20 10
PHP: l oggetto HTTP request IX VEDI es-form2.html VEDI identif2.php Nella cartella corsopw creiamo due nuovi file es-form2.html e identif2.php in cui inseriamo il form e lo script precedenti (oppure li scarichiamo da www.di.unito.it/~goy/corsopw-0910.html, esempi scripting server-side) side) Avviamo il Web client, cioè il browser, e ci connettiamo al web server, richiedendo la pagina es-form2.html; per fare ciò digitiamo nella barra degli indirizzi l'url (*) : http://localhost:8080/corsopw/es-form2.html Cliccando poi sul pulsante OK, partirà una HTTP request al server, contenente la richiesta per identif2.php e i parametri del form (*) A casa, senza :8080!!! Goy - a.a. 2009/2010 Programmazione Web 21 PHP: l oggetto HTTP request X Esempio3: un diverso uso delle caselle di controllo (checkbox) (es-form3.html) Se, nel form, assegno nomi diversi alle caselle di controllo, posso sfruttare i nomi, anziché i valori... <FORM METHOD="POST" ACTION="identif3.php" " > Interessi: <INPUT TYPE="CHECKBOX" NAME="cinema"/> Cinema <INPUT TYPE="CHECKBOX" NAME="teatro"/> Teatro <INPUT TYPE="CHECKBOX" NAME="musica"/> Musica <INPUT TYPE="CHECKBOX" NAME="sport"/> Sport <INPUT TYPE="Submit" VALUE="OK"/>... </FORM> cosa viene scritto in $_POST? <cinema, ON> <teatro, ON> <musica, ON> (cioè solo le checkbox selezionate, con valore = ON) VEDI es-form3.html VEDI identif3.php Goy - a.a. 2009/2010 Programmazione Web 22 11
PHP: l oggetto HTTP request XI $_POST è un array associativo, in cui: chiavi = nomi del campi del modulo (form) valori = valori scritti/selezionati dall'utente array_ keys($ ($_ POST) nomi dei campi array_values($_post) valori $_POST array_values($_post) In identif3.php leggiamo le checkbox selezionate (e, in questo esempio, le stampiamo a schermo): echo "Interessi = "; foreach (array_keys($_post) as $campo) { echo $campo.", "; chiavi VEDI es-form3.html VEDI identif3.php NB Non fatelo con i pulsanti di opzione (radio button) altrimenti perdete la mutua esclusione!!! Goy - a.a. 2009/2010 Programmazione Web 23 PHP: l oggetto HTTP request XII VEDI es-form3.html VEDI identif3.php Nella cartella corsopw creiamo due nuovi file es-form3.html e identif3.php in cui inseriamo il form e lo script precedenti (oppure li scarichiamo da www.di.unito.it/~goy/corsopw-0910.html, esempi scripting server-side) side) Avviamo il Web client, cioè il browser, e ci connettiamo al web server, richiedendo la pagina es-form3.html; per fare ciò digitiamo nella barra degli indirizzi l'url (*) : http://localhost:8080/corsopw/es-form3.html Cliccando poi sul pulsante OK, partirà una HTTP request al server, contenente la richiesta per identif3.php e i parametri del form (*) A casa, senza :8080!!! Goy - a.a. 2009/2010 Programmazione Web 24 12
PHP: l oggetto HTTP request XIII Esempio4: accedere ai dati "senza chiamarli per nome" (es-form4.html, identif4.php) VEDI es-form4.html VEDI identif4.php <FORM METHOD="POST" ACTION="identif4.php" > Nome: <INPUT TYPE="TEXT" NAME="nome"/> Cognome: <INPUT TYPE="TEXT" NAME="cognome"/> Indirizzo: <INPUT TYPE="TEXT" NAME="indirizzo" SIZE="40"/> Telefono: <INPUT TYPE="TEXT" NAME="telefono"/> Professione: <SELECT NAME="prof"> <OPTION VALUE="impiegato">impiegato</OPTION> <OPTION VALUE="lav_aut">lavoratore autonomo</option> <OPTION VALUE="insegnante">insegnante</OPTION> <OPTION VALUE="altro">altro</OPTION> </SELECT> <INPUT TYPE="Submit" VALUE="OK"/>... </FORM> chiavi foreach (array_keys($_post) as $campo ) { echo "<P>". $campo. " = "; $valore = $_POST[$campo]; valori echo $valore. "</P> ; Goy - a.a. 2009/2010 Programmazione Web 25 PHP: l oggetto HTTP request XIV VEDI es-form4.html VEDI identif4.php Nella cartella corsopw creiamo due nuovi file es-form4.html e identif4.php in cui inseriamo il form e lo script precedenti (oppure li scarichiamo da www.di.unito.it/~goy/corsopw-0910.html, esempi scripting server-side) side) Avviamo il Web client, cioè il browser, e ci connettiamo al web server, richiedendo la pagina es-form4.html; per fare ciò digitiamo nella barra degli indirizzi l'url (*) : http://localhost:8080/corsopw/es-form4.html Cliccando poi sul pulsante OK, partirà una HTTP request al server, contenente la richiesta per identif4.php e i parametri del form (*) A casa, senza :8080!!! Goy - a.a. 2009/2010 Programmazione Web 26 13
PHP: include [digressione che ci sarà utile tra poco...] In una pagina PHP è possibile includere file contenenti parte del codice della pagina vengono spesso usati per inserire codice che verrà riutilizzato in altre pagine.php, come per es. intestazioni e piè di pagina, o connessioni a database Possono contenere codice HTML, script client-side (es: JavaScript), script server-side (es: PHP) Hanno generalmente l'estensione.php o.html o.inc Per includere un file : include("percorso/nomefile") nel punto in cui si vuole inserire il codice contenuto nel file esterno; l'interprete farà una specie di "copia&incolla" del contenuto del file incluso all'interno della pagina PHP Goy - a.a. 2009/2010 Programmazione Web 27 PHP: l oggetto HTTP request XV In alternativa ai form, è possibile inviare dati al server accodandoli all'url in un link (in questo caso i valori saranno "fissi"...); per esempio: es-param.php: include("quiz quiz.html html") quiz.html: <P ALIGN="CENTER"> Come si chiama il figlio di Tex? <BR><BR> <A HREF="param.php?risposta=alan">Alan</A> <BR> <A HREF="param.php?risposta=kit">Kit</A> <BR> <A HREF="param.php?risposta=john">John</A> </P> NB i dati sono inviati i con il metodo GET saranno disponibili nell'array associativo $_GET[] VEDI es-param.php VEDI quiz.html Goy - a.a. 2009/2010 Programmazione Web 28 14
PHP: l oggetto HTTP request XVI Lo script contenuto in param.php legge la risposta (il parametro "risposta"): se è sbagliata, ripropone il quiz; se è corretta gli invia un messaggio di congratulazioni... p $risp = $_GET["risposta"]; if ($risp = = "kit") { echo "<P ALIGN='CENTER'>CONGRATULAZIONI!</P>"; else { echo "<P ALIGN='CENTER'>Risposta sbagliata: riprova!</p>"; include("quiz.html"); VEDI param.php NB Se devo inviare più parametri, li separo con &, per es: <A HREF="param.php?utente=".$ut."&risposta=kit">Kit</A> (ipotizzando che la variabile $ut contenga l'id dell'utente...) Goy - a.a. 2009/2010 Programmazione Web 29 PHP: l oggetto HTTP request XVII VEDI es-param.php VEDI quiz.html VEDI param.php Nella cartella corsopw creiamo tre nuovi file es-param.php, quiz.html e param.php in cui inseriamo i link e gli script precedenti (oppure li scarichiamo da www.di.unito.it/~goy/corsopw-0910.html, it/~goy/corsopw esempi scripting server-side) Avviamo il Web client, cioè il browser, e ci connettiamo al web server, richiedendo la pagina es-param.php; per fare ciò digitiamo nella barra degli indirizzi l'url (*) : http://localhost:8080/corsopw/es-param.php Cliccando poi su uno dei link, partirà una HTTP request al server, contenente la richiesta per param.php e il parametro (*) A casa, senza :8080!!! Goy - a.a. 2009/2010 Programmazione Web 30 15