MODULO 1
PARTE 3
Programmazione (scripting) server-side con PHP
3.a
Goy - a.a. 2009/2010 Programmazione Web 1
3.a
HTTP request e HTTP response (form e link)
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
Gli oggetti HTTP request e HTTP response - I
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
Goy - a.a. 2009/2010 Programmazione Web 2
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)Gli oggetti HTTP request e HTTP response - II
Server client
request response
Gli script server-side possono interagire con vari "oggetti" tra
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 (formHTML); quando clicca sul pulsante di invio del modulo, parte la richiesta al server; l'oggetto
Gli script server-side possono interagire con vari oggetti , tra cui HTTP request e HTTP response
Goy - a.a. 2009/2010 Programmazione Web 3
p , p ; gg
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)
PHP: l’oggetto HTTP response - I
<?php
Web Server browser
HTTP request
HTTP response p p
echo "Hello!";
?>
<?php
print "Ciao!";
?>
echo e print scrivono nel Body dell'oggetto HTTP response
NOTA h i t i l ti l' i diff è
NOTA: echo e print sono equivalenti: l'unica differenza è che echo funziona anche con più stringhe (separate da una virgola: echo "pippo", "pluto", ...)
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:
<?php
if ($ POST["risposta"]=="si") {
if ($_POST[ risposta ] si ) {
?>
<P ALIGN="CENTER">Bravo!</P>
<?php
} else {
?>
<P ALIGN="CENTER">Peccato!</P>
<?php }
?>
oppure (equivalentemente) utilizzare echo per scrivere HTML:
Goy - a.a. 2009/2010 Programmazione Web 5
pp ( q ) p
<?php
if ($_POST["risposta"]=="si") { echo "<P ALIGN='CENTER'>Bravo!</P>"
} else {
echo "<P ALIGN='CENTER'>Peccato!</P>"
}
?>
PHP: l’oggetto HTTP response - III
NOTA: Attenzione agli apici!!!
HTML:
<P ALIGN="CENTER">CONGRATULAZIONI!</P>PHP
PHP:
echo "<P ALIGN='CENTER'>OK!</P>";oppure echo "<P ALIGN=\"CENTER\">OK!</P>";
Goy - a.a. 2009/2010 Programmazione Web 6
Ripasso di HTML : <form...> - I
In HTML, un form o modulo on-line (tag
<form...>) contiene:
1. metodo (attributo
METHODdel tag
<FORM...>) = modo in cui vengono codificati i dati da inviare al g server
2. campi di input (tag
<INPUT...>e altri) = elementi attraverso cui l'utente fornisce dei dati
3. azione (attributo
ACTIONdel 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 il modulo viene
inviato al server... cosa vuol dire?
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)
Ripasso di HTML: <form...> - III
• 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>
Goy - a.a. 2009/2010 Programmazione Web 9
<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
Tipi di campi (tag
<INPUT...>):
• Caselle di testo
<INPUT TYPE="text" NAME="login"/>
• Caselle di testo per password
Ripasso di HTML: <form...> - IV
• Caselle di testo per password
<INPUT TYPE="password" NAME="pwd"/>
• Pulsanti di opzione (radio button)
<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!
NB t !
Goy - a.a. 2009/2010 Programmazione Web 10
• Caselle di controllo (checkbox)
<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[])!!!
NB stesso nome!
• Campi nascosti
<INPUT TYPE="hidden" NAME="utente" value="pippo"/>
non vengono visualizzati nella pagina, ma vengono inclusi in
HTTP request: <utente, pippo>P l t di i i ( b it)
Ripasso di HTML: <form...> - V
• Pulsante di invio (submit)
<INPUT TYPE="submit" value="invia"/>
• Pulsante di reset
<INPUT TYPE="reset" value="reset"/>
NB Il tag
<INPUT...>ha altri attributi opzionali, per esempio:
Goy - a.a. 2009/2010 Programmazione Web 11
<INPUT TYPE="text" NAME="login" value="pippo" size="4"/>
<INPUT TYPE="checkbox" NAME="interessi" value="cinema"
checked/> [NB checked≡checked="true"]
Inoltre, all'interno di un form è possibile usare
• Aree di testo
<TEXTAREA NAME="msg" cols="20" row="5"></textarea>
Ripasso di HTML: <form...> - V
• Caselle combinate (select)
<SELECT NAME="job">
<option value="null"></option>
<option value="imp">impiegato</option>
<option value="ins">insegnante</option>
</select>
PHP: l’oggetto HTTP request – I
All'interno di HTTP request i dati (parametri) possono essere codificati in due modi diversi (attributo
METHODdel tag
<FORM...>):
• GET: i dati (parametri), cioè le coppie <nome, valore>, (p ), pp , 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
i di i ibili ll b d li i di i i d l
Goy - a.a. 2009/2010 Programmazione Web 13
saranno quindi visibili nella barra degli indirizzi del browser
Nell'esempio, HTTP request contiene:
risorsa = identif.php
parametri: <login, admin> <pwd, pippo>
PHP: l’oggetto HTTP request – II
Come faccio (dallo script contenuto nella pagina PHP indicata nell'attributo
ACTIONdel tag
<FORM...>) a leggere i parametri contenuti in HTTP request?
I parametri sono resi disponibili a PHP all'interno di due
i i i I i l
array associativi:
$_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[]admin
login $_GET["login"]→"admin"
$ GET[" d"]→" i "
Goy - a.a. 2009/2010 Programmazione Web 14
admin pippo
...
login pwd
...
chiavi valori
⇒
$_GET["pwd"]→"pippo"
...
oppure
$_POST["login"]→"admin"
$_POST["pwd"]→"pippo"
...
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
NAMEnel 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
trasmettre password o dati sensibili!
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" >
<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"/>
L'array contiene solo le checkbox selezionate!!!
⇒
$_POST["interessi"]→ cinema teatro musica0 1 2
NB senza []!!!
Per leggere i valori selezionati dall'utente devo utilizzare un ciclo sull'array; in PHP, per esempio:
$int = $_POST["interessi"];
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
</FORM>
Quando il server riceve la richiesta, chiede all'interprete PHP di eseguire lo script contenuto nella pagina indicata in HTTP request (
identif1.php)
<?php
$id = $_POST["login"];
$pass = $_POST["pwd"];
if ($id = = "admin" && $pass = = "pippo") {
Goy - a.a. 2009/2010 Programmazione Web 17
($ $p p pp ) {
echo "Benvenuto amministratore!";
} else {
echo "Gentile ".$id.", login e password sono sbagliati...";
}
?>
PHP: l’oggetto HTTP request – VI
…
• 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)
VEDI es-form1.html VEDI identif1.php
esempi scripting server-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…
Goy - a.a. 2009/2010 Programmazione Web (*)A casa, senza :8080 !!!
18
PHP: l’oggetto HTTP request – VII
Esempio2: form di registrazione (
es-form2.html)
<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>
/
VEDI es-form2.html VEDI identif2.php
<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"/>
Goy - a.a. 2009/2010 Programmazione Web 19
Teatro
<INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="musica"/>
Musica
<INPUT TYPE="CHECKBOX" NAME="interessi[]" VALUE="sport"/>
Sport
<INPUT TYPE="Submit" VALUE="OK"/> ...
</FORM>
PHP: l’oggetto HTTP request – VIII
Quando il server riceve la richiesta, chiede all'interprete PHP di eseguire lo script contenuto nella pagina indicata in HTTP request (
identif2.php)
<?php
$n = $ POST["nome"];
VEDI es-form2.html VEDI identif2.php
$n = $_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) { foreach ($int as $i) {
echo $i . ", ";
}
echo "</P>";
PHP: l’oggetto HTTP request – IX
…
• 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)
VEDI es-form2.html VEDI identif2.php
esempi scripting server-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…
Goy - a.a. 2009/2010 Programmazione Web (*)A casa, senza :8080 !!!
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 "id tif3 h " >
VEDI es-form3.html VEDI identif3.php
<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?
Goy - a.a. 2009/2010 Programmazione Web 22
⇒ cosa viene scritto in
$_POST?
<cinema, ON> <teatro, ON> <musica, ON>
(cioè solo le checkbox selezionate, con valore =
ON)
$_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
PHP: l’oggetto HTTP request – XI
VEDI es-form3.html VEDI identif3.phpy_ y ($_ )
p
array_values($_POST)
→ valori
$_POST
≡
array_values($_POST)In
identif3.phpleggiamo le checkbox selezionate (e, in questo esempio, le stampiamo a schermo):
<?php
echo "Interessi = ";
foreach (array_keys($_POST) as $campo) { echo $campo " ";
Goy - a.a. 2009/2010 Programmazione Web 23
echo $campo.", ";
}
?>
NB Non fatelo con i pulsanti di opzione (radio button) altrimenti perdete la mutua esclusione!!!
chiavi
PHP: l’oggetto HTTP request – XII
…
• 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)
VEDI es-form3.html VEDI identif3.php
esempi scripting server-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 !!!
PHP: l’oggetto HTTP request – XIII
Esempio4: accedere ai dati "senza chiamarli per nome"
(
es-form4.html,
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"/>
VEDI es-form4.html VEDI identif4.php
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>
Goy - a.a. 2009/2010 Programmazione Web 25
<?php
foreach (array_keys($_POST) as $campo ) { echo "<P>" . $campo . " = ";
$valore = $_POST[$campo];
echo $valore . "</P>“;
}
?>
chiavi
valori
PHP: l’oggetto HTTP request – XIV
…
• 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)
VEDI es-form4.html VEDI identif4.php
esempi scripting server-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…
Goy - a.a. 2009/2010 Programmazione Web (*)A casa, senza :8080 !!!
26
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
hpiè 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 :
Goy - a.a. 2009/2010 Programmazione Web 27
Per includere un file :
<?php 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
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:
<?php include("quiz html") ?>
VEDI es-param.php VEDI quiz.html
<?php include( quiz.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 d ti i i ti il t d GET ⇒
NB i dati sono inviati con il metodo GET ⇒ saranno
disponibili nell'array associativo
$_GET[]PHP: l’oggetto HTTP request – XVI
Lo script contenuto in
param.phplegge la risposta (il parametro "risposta"): se è sbagliata, ripropone il quiz; se è corretta gli invia un messaggio di congratulazioni...
<?php
VEDI param.php
p 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");
}
Goy - a.a. 2009/2010 Programmazione Web 29
?>
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
$utcontenga l'id dell'utente...)
PHP: l’oggetto HTTP request – XVII
…
• 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 dawww di unito it/~goy/corsoPW 0910 html
VEDI es-param.php VEDI quiz.html VEDI param.php
(oppure li scarichiamo da www.di.unito.it/~goy/corsoPW-0910.html
,
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,
l i hi h il
Goy - a.a. 2009/2010 Programmazione Web
contenente la richiesta per param.php e il parametro…
(*)A casa, senza :8080 !!!
30