gianfrasoft corso di php parte 2

24
PHP 5 seconda parte - interazione con l’HTML Gianfranco Fedele Analista programmatore [email protected] www.linkedin.com/in/gianfrasoft

Upload: gianfranco-fedele

Post on 31-May-2015

650 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Gianfrasoft   Corso Di Php   Parte 2

PHP5seconda parte - interazione con l’HTML

Gianfranco Fedele

Analista programmatore

[email protected]

www.linkedin.com/in/gianfrasoft

Page 2: Gianfrasoft   Corso Di Php   Parte 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

Page 3: Gianfrasoft   Corso Di Php   Parte 2

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

Page 4: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Form HTML / 2

<form action="elabora.php" method="get"><h1>Qual’&egrave; 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><option>ASP </option><option>Java </option><option>C++ </option>

</select>

<input type="submit" value="Invia“ /> <!--

notazione XHTML --><input type="check" name="registra" /><input type="check" name="registra_ml"

value="rml" /></form>

$nome = $_GET["nome"];

$alias = $_GET["alias"];

$linguaggi = $_REQUEST["linguaggi"];

// meglio non usare $_REQUEST

$registra = $_GET["registra"];

$registra = $_GET["registra_ml"];

// Mostro i dati inseriti

echo "<h1>Ciao $nome</h1>";

foreach($linguaggi as $k=>$v)

echo "<h2>$k - $v</h2>";

echo $registra."<br />"; // notaz. XHTML

gianfrasoft.wordpress.com - 2008

Page 5: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Variabili superglobali

• Sono immediatamente accessibili negli script PHP alcune variabili specialidette 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

// esempioecho $_SERVER["HTTP_HOST"];

?>

gianfrasoft.wordpress.com - 2008

Page 6: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Cenni sulla sicurezza

• Esiste nel PHP la direttiva di configurazione register_globals che trasferisce ilcontenuto 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

Page 7: Gianfrasoft   Corso Di Php   Parte 2

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

Page 8: Gianfrasoft   Corso Di Php   Parte 2

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()." &egrave; il totale.";

// Questo stampa "99 è il totale."

echo restituisce_totale2()." &egrave; il totale.";

?>

gianfrasoft.wordpress.com - 2008

Page 9: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Output nell’ambito dell’HTML

• La funzione echo() è la funzione più utilizzata per la generazione dinamica

dell'output HTML.

• 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.

• Infine, un modo stringato di scrivere l’output di PHP nell’ambito della paginaHTML è quello di utilizzare i tag speciali <?= espressione ?>, senza richiamarefunzioni di output né terminatore di riga “;”.

echo "<h1>Benvenuto su questo sito!</h1>";

print "Il valore di a è $a";

print ('Con $a si indica una variabile');

<?= $variabile + 5 ?>

gianfrasoft.wordpress.com - 2008

Page 10: Gianfrasoft   Corso Di Php   Parte 2

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 &nbsp;.

<?php

$nome = “Gianfranco Federe";

$titolo = "Corso di PHP";

/* stampa */

echo "Autore: $nome<BR />\n";

echo "Titolo:\n\n $titolo<BR />\n\n";

?>

Output HTML:

Autore: Gianfranco Fedele

Titolo: Corso di PHP

gianfrasoft.wordpress.com - 2008

Page 11: Gianfrasoft   Corso Di Php   Parte 2

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 &egrave; zero.

Impossibile procedere.”);} $j = 10 / $i;

gianfrasoft.wordpress.com - 2008

Page 12: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Espressioni / 1

// Un numero e' pari se, diviso per due, non da' resto

echo "n è ".( $n % 2 == O ? "pari" : "dispari" );

$a = FALSE;

$b = TRUE;

if ($a and $b) print("a e b sono vere");

$a = " 04";

$b = "0003";

if ($a > $b) print("a è maggiore di b");

if (strcmp($a, $b)) print("a è più grande di b");

• Espressione di confronto:

• Espressione condizionale:

• Espressione booleana:

gianfrasoft.wordpress.com - 2008

Page 13: Gianfrasoft   Corso Di Php   Parte 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

PHP5: Espressioni / 2

gianfrasoft.wordpress.com - 2008

Page 14: Gianfrasoft   Corso Di Php   Parte 2

PHP5: Flow control / 1

if (condizione1) {

blocco-istruzioni-1;

}

elseif (condizione2)

{

blocco-istruzioni-2;

}

...

}

else

{

blocco-istruzioni-N;

}

• Il costrutto if-elseif-else non impone l’utilizzo dei delimitatori di blocco delleistruzioni ({…}) se l’istruzione che segue il confronto si compone di una sola riga.

if ( $a < $b )

echo '$a è minore di $b';

elseif ( $a > $b )

{

echo '$a è maggiore di $b';

}

else

echo '$a e $b sono uguali';

gianfrasoft.wordpress.com - 2008

Page 15: Gianfrasoft   Corso Di Php   Parte 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 nellecase viene restituito dall’espressione.

PHP5: Flow control / 2

switch (espressione) {

case valore-1:

blocco-istruzioni-1;

break;

case valore-2:

blocco-istruzioni-1;

break;

...

default:

blocco-istruzioni-N;

}

switch( $a ) {

case 1:

echo("a è uguale a uno");

break;

case 2:

echo("a è uguale a due");

break;

default:

echo("a non é uno né due");

}

gianfrasoft.wordpress.com - 2008

Page 16: Gianfrasoft   Corso Di Php   Parte 2

• Il costrutto while antepone il confronto alle istruzioni; do-while lo postpone determinando che le istruzioni vengano eseguite sempre almenouna volta.

• il costrutto continue fa saltare le istruzioni restanti nel blocco. Il costrutto break interrompe il ciclo.

PHP5: Flow control / 3

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

Page 17: Gianfrasoft   Corso Di Php   Parte 2

• 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.

PHP5: Flow control / 4

for (espr1; espr2; espr3) {

blocco-istruzioni;

}

// ciclo for

for ($i = 1; $i <= 5; $i++)

{

echo "\$i &egrave; $i";

}

gianfrasoft.wordpress.com - 2008

Page 18: Gianfrasoft   Corso Di Php   Parte 2

• Le istruzioni while e foreach rappresentano il modo standard di accedere aglielementi di un array:

PHP5: Cicli sugli 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

Page 19: Gianfrasoft   Corso Di Php   Parte 2

• La dichiarazione di funzioni avviene con la parola chiave function e puòessere dichiarata ovunque nello script PHP.

• Il risultato della funzione viene restituito utilizzando l'istruzione return(valore) che provoca l'uscita dalla funzione.

• E’ consentita la definizione di funzioni ricorsive.

PHP5: Funzioni / 1

function nome-funzione (lista_degli_argomenti) {

blocco-istruzioni;

}

function fattoriale($n){

if ($n == 0)return = 1;

else return ($n * fattoriale($n - 1));

}

// Scriverà 120

echo fattoriale(5);

gianfrasoft.wordpress.com - 2008

Page 20: Gianfrasoft   Corso Di Php   Parte 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 richiamarevariabili globali si deve utilizzare la parola chiave global.

• Le funzioni possono tenere memoria della loro esecuzione mediante l’utilizzodella parola chiave static.

• Una funzione definita in uno script è disponibile ovunque in esso.

PHP5: Funzioni / 2

// Scriverà 120

echo fattoriale(5);

function fattoriale($n){

if ($n == 0)return = 1;

else return ($n * fattoriale($n - 1));

}

gianfrasoft.wordpress.com - 2008

Page 21: Gianfrasoft   Corso Di Php   Parte 2

• 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.

PHP5: Funzioni / 3

function incrementa_di_5(&$n){

$n += 5;}

$est = 3;incrementa_di_5($est);

// Scriverà 8

echo $est;

gianfrasoft.wordpress.com - 2008

Page 22: Gianfrasoft   Corso Di Php   Parte 2

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

Page 23: Gianfrasoft   Corso Di Php   Parte 2

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>&egrave; stato salvato nella cartella

<strong>UPLOADS/$file[name]</strong></h3>.";

}

Page 24: Gianfrasoft   Corso Di Php   Parte 2

PHP5seconda parte - FINE

Gianfranco Fedele

Analista programmatore

[email protected]

www.linkedin.com/in/gianfrasoft