1. PHP5
seconda parte - interazione con l’HTML
Gianfranco Fedele
Analista programmatore
g.fedele@dinamicadigitale.it
www.linkedin.com/in/gianfrasoft
2. PHP5: Parametri HTML
• Il trasferimento dei dati da una pagina HTML all’altra può avveniere mediante i
metodi:
– GET
– POST
– Altri metodi previsti dal protocollo HTTP sono caduti in disuso
• GET accoda all’URL i valori dei parametri scambiati, separandoli con i
caratteri ? e poi & (in XHTML la & è sostituita da &).
• POST introduce le informazioni nel corpo della richiesta HTTP non
rendendole immediatamente visibili nella barra di indirizzo del browser. In
questo modo non sono posti limiti alla dimensione ed al numero dei parametri
passati.
gianfrasoft.wordpress.com - 2008
3. PHP5: Form HTML / 1
• I form HTML consentono di trasmettere dati ad una pagina PHP. Ciò mediante
il tag form ed i tag che rappresentano componenti di input.
• Nei form è indispensabile indicare gli attributi action e method per segnalare
rispettivamente la pagina dinamica PHP da interrogare ed il metodo (GET o
POST) con cui i dati devono essere trasmessi.
• I principali controlli di input HTML sono i seguenti:
– text
– password
– checkbox
– radio
– hidden
– submit
– file
• I controlli con tag non input HTML possono essere di tipo:
– select - option - multiple
– textarea
gianfrasoft.wordpress.com - 2008
4. PHP5: Form HTML / 2
<form action="elabora.php" method="get">
<h1>Qual’è il tuo nome?</h1>
<input type="text" name="nome"
maxlength="30"/>
<input type="hidden" name=“alias"
value="nome_segreto"/>
<h1>Quali di questi linguaggi conosci?</h1>
<select multiple name="linguaggi[ ]" size="3">
<option>PHP</option>
$nome = $_GET["nome"];
<option>ASP </option>
<option>Java </option> $alias = $_GET["alias"];
<option>C++ </option> $linguaggi = $_REQUEST["linguaggi"];
</select>
<input type="submit" value="Invia“ /> <!-- // meglio non usare $_REQUEST
notazione XHTML --> $registra = $_GET["registra"];
<input type="check" name="registra" /> $registra = $_GET["registra_ml"];
<input type="check" name="registra_ml"
value="rml" />
// Mostro i dati inseriti
</form>
echo "<h1>Ciao $nome</h1>";
foreach($linguaggi as $k=>$v)
echo "<h2>$k - $v</h2>";
echo $registra."<br />"; // notaz. XHTML
gianfrasoft.wordpress.com - 2008
5. PHP5: Variabili superglobali
• Sono immediatamente accessibili negli script PHP alcune variabili speciali
dette superglobali (da verificare in phpinfo())
– $_REQUEST, $_POST, $_GET (da form HTML)
– $_SERVER (sezione Apache Environment)
– $_ENV (sezione Environment)
– $_SESSION (per la gestione delle sessioni)
– $_COOKIE[“nome_cookie"] (per la gestione dei cookies)
– $HTTP_POST_FILES [“nome_file"] (per l’upload dei file)
<?php
// esempio
echo $_SERVER["HTTP_HOST"];
?>
gianfrasoft.wordpress.com - 2008
6. PHP5: Cenni sulla sicurezza
• Esiste nel PHP la direttiva di configurazione register_globals che trasferisce il
contenuto delle variabili superglobali in variabili semplici.
• L’utilizzo di questa funzionalità, come della funzione
import_request_variables(), è pericoloso in termini di sicurezza in quanto
consente agli hacker di introdurre valori di default, mediante accesso ai
parametri HTTP (della GET e della POST), alle variabili presenti nello script
PHP.
• Per questo stesso motivo è indispensabile sempre:
– assegnare un valore di default alle variabili negli script PHP;
– caricare i dati acquisiti dal form in variabili semplici e verificare che i valori in esse
contenuti rispettino le limitazioni imposte dal sistema: la massima lunghezza in
caratteri, il massimo valore numerico consentito, il giusto formato di numero e/o di
data, ecc. In ogni caso mai accontentarsi dei controlli client side;
– prevenire attacchi di tipo sql injection e code injection verificando il contenuto delle
variabili testé descritte, perché non contengano caratteri non consentiti (utilizzare
strlen(), is_int(), htmlspecialchars(), addslashes(), ereg() ecc.)
gianfrasoft.wordpress.com - 2008
7. PHP5: Scoping / 1
• Ambito di visibilità (scope) di una variabile è il contesto in cui è possibile
accedere al suo contenuto.
• In PHP esistono due categorie di variabili:
– le variabili globali, dichiarate nella parte dello script esterna a tutte le funzioni ed a
tutte le classi.
– Le variabili locali sono dichiarate, invece, all'interno di funzioni o classi.
• Le variabili globali non sono visibili all'interno di funzioni o classi. E' possibile,
comunque, rendere visibili le variabili globali all'interno di funzioni e classi ri-
dichiarandole con la parola chiave global.
• Le variabili globali sono, altresì, accessibili tramite l'array associativo
$GLOBALS.
gianfrasoft.wordpress.com - 2008
8. PHP5: Scoping / 2
<?
// Dichiarazione della funzione restituisce_totale()
function restituisce_totale() {
return $totale;
}
// Dichiarazione della funzione restituisce_totale2()
function restituisce_totale2() {
// Cosi' indico che $totale è una variabile globale
global $totale;
return $totale;
}
// Una variabile globale
$totale = 99;
// Questo stampa "è il totale."
echo restituisce_totale()." è il totale.";
// Questo stampa "99 è il totale."
echo restituisce_totale2()." è il totale.";
?>
gianfrasoft.wordpress.com - 2008
9. PHP5: Output nell’ambito dell’HTML
• La funzione echo() è la funzione più utilizzata per la generazione dinamica
dell'output HTML.
echo "<h1>Benvenuto su questo sito!</h1>";
• Del tutto analoga al costrutto echo() è la funzione print().
• Le variabili all’interno dei doppi apici vengono interpolate.
• Le stringhe fra apici singoli vengono inviate (stampate) inalterate.
print "Il valore di a è $a";
print ('Con $a si indica una variabile');
• Infine, un modo stringato di scrivere l’output di PHP nell’ambito della pagina
HTML è quello di utilizzare i tag speciali <?= espressione ?>, senza richiamare
funzioni di output né terminatore di riga “;”.
<?= $variabile + 5 ?>
gianfrasoft.wordpress.com - 2008
10. PHP5: Escaping
• Il carattere viene utilizzato come escape per l’output di caratteri speciali. Ad
esempio: n significa newline (a capo).
Attenzione al fatto che l’output generato nell’ambito delle pagine HTML non
tiene conto del carattere newline come del carattere space (se ripetuto); per
andare a capo utilizzare il tag <BR />, per lo spazio .
<?php
Output HTML:
$nome = “Gianfranco Federe";
$titolo = "Corso di PHP"; Autore: Gianfranco Fedele
/* stampa */ Titolo: Corso di PHP
echo "Autore: $nome<BR />n";
echo "Titolo:nn $titolo<BR />nn";
?>
gianfrasoft.wordpress.com - 2008
11. PHP5: Funzioni di uscita
• Per interrompere l'esecuzione di uno script PHP si possono utilizzare le
funzioni exit() e die().
• die() accetta come parametro un messaggio che verrà riportato nella pagina
HTML prima di uscire.
if ($i == 0) {
// errore...
die(“Il valore del denominatore è zero.
Impossibile procedere.”);
}
$j = 10 / $i;
gianfrasoft.wordpress.com - 2008
12. PHP5: Espressioni / 1
• Espressione booleana:
$a = FALSE;
$b = TRUE;
if ($a and $b) print("a e b sono vere");
• Espressione di confronto:
$a = " 04";
$b = "0003";
if ($a > $b) print("a è maggiore di b");
if (strcmp($a, $b)) print("a è più grande di b");
• Espressione condizionale:
// Un numero e' pari se, diviso per due, non da' resto
echo "n è ".( $n % 2 == O ? "pari" : "dispari" );
gianfrasoft.wordpress.com - 2008
13. PHP5: Espressioni / 2
Attenzione:
• sono equivalenti al valore TRUE:
– i numeri, interi o in virgola mobile, diversi da zero (compresi i negativi);
– le stringhe non vuote;
– gli array con almeno un elemento.
• sono equivalenti al valore FALSE:
– lo zero
– le stringhe vuote
– gli array privi di elementi
gianfrasoft.wordpress.com - 2008
14. PHP5: Flow control / 1
• Il costrutto if-elseif-else non impone l’utilizzo dei delimitatori di blocco delle
istruzioni ({…}) se l’istruzione che segue il confronto si compone di una sola
riga.
if (condizione1)
{
blocco-istruzioni-1;
} if ( $a < $b )
elseif (condizione2) echo '$a è minore di $b';
{ elseif ( $a > $b )
blocco-istruzioni-2; {
} echo '$a è maggiore di $b';
... }
} else
else echo '$a e $b sono uguali';
{
blocco-istruzioni-N;
}
gianfrasoft.wordpress.com - 2008
15. PHP5: Flow control / 2
• Il costrutto switch-case è più compatto ed autoesplicativo del costrutto if-
elseif-else. Può essere usato se la condizione è una soltanto.
• L’istruzione break determina l’uscita immediata dopo l’esecuzione del
blocco di istruzioni relativo al valore dell’espressione.
• Il blocco di default viene eseguito solo se nessuno dei valori descritti nelle
case viene restituito dall’espressione.
switch (espressione) {
case valore-1: switch( $a ) {
blocco-istruzioni-1; case 1:
break; echo("a è uguale a uno");
case valore-2: break;
blocco-istruzioni-1; case 2:
break; echo("a è uguale a due");
... break;
default: default:
blocco-istruzioni-N; echo("a non é uno né due");
} }
gianfrasoft.wordpress.com - 2008
16. PHP5: Flow control / 3
• Il costrutto while antepone il confronto alle istruzioni; do-while lo
postpone determinando che le istruzioni vengano eseguite sempre almeno
una volta.
• il costrutto continue fa saltare le istruzioni restanti nel blocco. Il costrutto
break interrompe il ciclo.
while (condizione) {
blocco-istruzioni;
} $cont = 1;
$max = 10;
while ( $cont <= $max ) {
echo "contatore = $cont <br>";
$cont++;
do { }
blocco-istruzioni
} while (condizione);
gianfrasoft.wordpress.com - 2008
17. PHP5: Flow control / 4
• Il costrutto for espone tre espressioni che determinano:
– Assegnazione del valore iniziale della variabile di controllo.
– Condizione di interruzione del ciclo.
– Espressione di incremento.
• il costrutto continue fa saltare le istruzioni restanti e fa passare
direttamente all’iterazione successiva. il costrutto break invece fa uscire
definitivamente dal ciclo.
for (espr1; espr2; espr3) // ciclo for
{ for ($i = 1; $i <= 5; $i++)
blocco-istruzioni; {
} echo "$i è $i";
}
gianfrasoft.wordpress.com - 2008
18. PHP5: Cicli sugli elementi di un array
• Le istruzioni while e foreach rappresentano il modo standard di accedere agli
elementi di un array:
// dichiaro un array
$a = array(
"Gianfranco" => "portiere",
"Nicola" => "attaccante"
);
// ciclo while
while (list ($key, $val) = each($a))
echo "$key -> $val <br>";
// ciclo foreach
foreach ($a as $valore)
echo "Valore : $valore<br>";
gianfrasoft.wordpress.com - 2008
19. PHP5: Funzioni / 1
• La dichiarazione di funzioni avviene con la parola chiave function e può
essere dichiarata ovunque nello script PHP.
function nome-funzione (lista_degli_argomenti)
{
blocco-istruzioni;
}
• Il risultato della funzione viene restituito utilizzando l'istruzione
return(valore) che provoca l'uscita dalla funzione.
• E’ consentita la definizione di funzioni ricorsive.
function fattoriale($n)
{
if ($n == 0)
return = 1;
else
return ($n * fattoriale($n - 1));
}
// Scriverà 120
echo fattoriale(5);
gianfrasoft.wordpress.com - 2008
20. PHP5: Funzioni / 2
• PHP è tollerante rispetto al numero di parametri passati (in eccesso e in difetto).
• Le variabili all’interno di una funzione sono private alla stessa. Per richiamare
variabili globali si deve utilizzare la parola chiave global.
• Le funzioni possono tenere memoria della loro esecuzione mediante l’utilizzo
della parola chiave static.
• Una funzione definita in uno script è disponibile ovunque in esso.
// Scriverà 120
echo fattoriale(5);
function fattoriale($n)
{
if ($n == 0)
return = 1;
else
return ($n * fattoriale($n - 1));
}
gianfrasoft.wordpress.com - 2008
21. PHP5: Funzioni / 3
• Per passare ad una funzione un argomento per riferimento, dovete anteporre un
ampersand (&) al nome dell'argomento nella definizione della funzione
• Solitamente le funzioni vengono definite in file separati (librerie) da includere
all'occorrenza nel programma:
– include(filename): Ritorna un warning in caso di fallimento
– require(filename): Ritorna un fatal error in caso di fallimento
– require_ones(filename) - include_ones(filename): Come
sopra ma se il file è già stato incluso non lo include nuovamente.
function incrementa_di_5(&$n)
{
$n += 5;
}
$est = 3;
incrementa_di_5($est);
// Scriverà 8
echo $est;
gianfrasoft.wordpress.com - 2008
22. PHP5: Upload di file / 1
• Esiste un metodo standard per effettuare l’upload dei file in PHP5.
• Se fileutente è il nome che abbiamo assegnato al campo della form
contenente il file da caricare, in caso di successo dell’upload nello script di
destinazione troveremo definito l'array associativo $HTTP_POST_FILES con i
seguenti valori:
– $HTTP_POST_FILES["fileutente"]["tmp_name"] - il nome del file temporaneo
(sul server);
– $HTTP_POST_FILES["fileutente"]["name"] - il nome originario del file (sul
client);
– $HTTP_POST_FILES["fileutente"]["size"] - la dimensione (in byte) del file;
– $HTTP_POST_FILES["fileutente"]["type"] - il tipo di file, secondo la codifica
MIME (ad esempio text/html).
• Il form da dove viene caricato il file deve obbligatoriamente utilizzare come
metodo di trasferimento il metodo POST.
gianfrasoft.wordpress.com - 2008
23. PHP5: Upload di file / 2
<? /* A proposito… ecco un modo sicuro di scrivere i commenti in HTML */ ?>
<form enctype="multipart/form-data“ action="<?php echo $_SERVER["PHP_SELF"] ?>“ method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="10000">
<h3>
Fai l'upload di questo file
<p><input name="uploadfile" type="file">
<p><input type="submit" value="Invia File"></p>
</h3>
<p><input type=“reset" value="Cancella!“ /></p>
</form>
$file = $HTTP_POST_FILES["uploadfile"];
if (isset($file[tmp_name])) // notare l’assenza delle " nell’array
{
echo "<h3>Hai caricato il file $file[name], ";
echo "la cui dimensione è $file[size] bytes. ";
copy($file[tmp_name], "./UPLOADS/$file[name]") // copia file
or die("<br>Non posso copiare il file.");
echo "<p>Il nome sul server è <strong>$file[tmp_name]</strong>.";
echo "<p>è stato salvato nella cartella
<strong>UPLOADS/$file[name]</strong></h3>.";
}
24. PHP5
seconda parte - FINE
Gianfranco Fedele
Analista programmatore
g.fedele@dinamicadigitale.it
www.linkedin.com/in/gianfrasoft