Appunti Php e MySql per il recupero del debito di lab. informatica
Nozioni base di PHP
OBIETTIVI DELLA LEZIONE
In questa lezione affrontiamo le strutture base del PHP:
- Variabili
- Tipi di dato
- Operatori
- Controllo del flusso di esecuzione
- Scambio dati tra FORM HTML e script PHP
Contestualizzazione della lezione
Secondo quanto visto nella scorsa lezione, il processo di creazione dinamica di una pagina HTML può essere schematizzato nei seguenti passi fondamentali:(1) | Invio dei dati dal client al server | form HTML + richiesta HTTP (GET/POST) | post sulle pagine dinamiche e moduli form |
(2) | Sul server una CGI riceve i dati | Server + Programma PHP | lezione di oggi |
(3) | La CGI interroga il DB MySQL | query MySQL | lezione MySql e Php |
(4) | Con i risultati ottenuti crea la pagina da rimandare all'utente | Programma PHP + Server | lezione di oggi |
Oggi ci occuperemo dei punti (2) e (4), vedremo cioè come scrivere programmi PHP.
PHP
- PHP: acronimo ricorsivo per "PHP: Hypertext Preprocessor". E' un linguaggio (permette il controllo di flusso, ammette l'uso di variabili, etc.) di scripting (non ha bisogno di essere compilato) lato server (l'interpretazione del programma avviene sul server) integrato nell'HTML (PHP ed HTML convivono cordialmente e una pagina PHP è composta sia da tag html, sia da codice PHP).
- Una breve nota sulla storia del linguaggio la si può trovare a questo indirizzo:
www.php.net/history.
PHP ha un sito "ufficiale" all'indirizzo: http://www.php.net con moltissime informazioni utili. -
Ad oggi l'ultima versione PHP stabile è la 4.3.6. A breve verrà rilasciata
la prima versione definitiva della nuova versione 5 che introdurrà un supporto
alla programmazione ad oggetti completo. Per quanto riguarda il corso,
ci si riferirà genericamente alla versione 4 e successive.
ATTENZIONE, informazione da tenere a memoria: le versione 4.2 e successive hanno cambiato in modo significativo il modo in cui si accede da programma alle variabili globali o inoltrate attraverso un form HTML!
Primi passi
- Per inserire il codice PHP all'interno di una pagina
HTML si utilizzano speciali tag:
- <?php codice_php ?> (standard, sempre disponibile, SUGGERITO)
- <? codice_php ?> (short_open_tag, da abilitare in php.ini)
- <% codice_php %> (asp_tags, da abilitare in php.ini)
- <script language="php"> codice_php </script> (sempre disponibile)
- Lo scopo di un programma PHP è, per vocazione, quello di costruire una
pagina HTML. E' quello che abbiamo fatto ad esercitazione con alcuni
programmi C (ad esempio tabelline.c).
In quel caso però preparavamo un file su disco che poi caricavamo manualmente con il browser.
Nel caso del PHP scriveremo la pagina HTML direttamente sullo standard output (stdout in C): il server HTTP (in cui è integrato il modulo PHP) inoltrerà quanto letto dallo stdout nel corpo della risposta HTTP. Attenzione: questo vale per qualunque programma CGI! RIASSUMENDO: scopo naturale di un codice PHP è quello di scrivere una pagina HTML sullo standard output (se fosse C ci aspetteremmo molte printf()) -
Il server HTTP (Apache ad esempio), in cui è integrato il modulo PHP, ha solo due possibilità:
- lavorare in modalità HTML (default)
- lavorare in modalità PHP (vi entra tutte le volte che trova il tag di apertura <?php e ve ne esce qualora incontri il corrispondente tag di chiusura ?>)
Si può uscire ed entrare dalla modalità PHP un numero qualunque di volte all'interno della stessa pagina.
Quando il server è in modalità HTML rispetta ovviamente la sintassi HTML e, corrispondentemente, quando è in modalità PHP rispetta la sintassi PHP. -
ATTENZIONE (questo è fonte di innumerevoli errori):
la sintassi del PHP è quella stringente di un linguaggio di programmazione NON quella accondiscendente dell'HTML!
PHP è sintatticamente simile al C (quanto imparato fino ad ora torna utile):- è, in genere, indifferente a spazi e a capo (introdotti per indentare il codice, ad es.)
- è case-sensitive (funzioni e nomi delle variabili)
- i comandi terminano per punto e virgola
- Commenti:
- /* commenti stile C */
- // commenti stile C++
- # commenti stile shell UNIX
-
Un primo esempio:
<html> <head> <title>Il mio primo file PHP</title> </head> <body> Questo è scritto in modalità HTML <?php print "<br />\n"; print "... e questo in modalità PHP\n"; ?> </body> </html>
produce:<html> <head> <title>Il mio primo file PHP</title> </head> <body> Questo è scritto in modalità HTML <br /> ... e questo in modalità PHP </body> </html>
Variabili
In PHP:- i nomi delle variabili iniziano tutti con il carattere "dollaro" ($).
Esempio:
<?php $nome="Giovanni"; $eta=52; $celibe=FALSE; ?>
- non occorre dichiarare esplicitamente le variabili prima di utilizzarle:
il PHP non è un linguaggio tipizzato.
Il tipo di ciascuna variabile è dato dal rispettivo valore corrente. Una variabile non ha tipo oltre a quello corrente e può cambiarlo con un nuovo assegnamento Esempio:<?php $nome="Giovanni"; // è una stringa $nome=52 // adesso è un intero ?>
Tipi di dato
Tra le variabili che il PHP ammette dalla versione 4 in poi, oggi consideriamo:quattro tipi di variabili scalari:
- valori logici (boolean): i valori ammessi sono solo due TRUE e FALSE.
- numeri interi (integer): sono equivalenti ai long del C.
- numeri a virgola mobile (vengono chiamti float o double indifferentemente):
sono equivalenti ai double del C.
Esempio:
<?php $pi = 3.1415; $a = 1.0e-6; $b = 5.32E10; ?>
- stinghe (string). A differenza del C, una stringa è in PHP un tipo di dato a
se stante (non è un "array" di carattery, infatti viene incluso tra le variabili
scalari). Come abbiamo visto l'obbiettivo naturale del PHP è quello di
costruire una pagina HTML, dunque il tipo di dato stringa è certamente
fondamentale.
Una stringa viene assegnata in tre modi:- TESTO contenuto tra apici DOPPI (come in C):
<?php $a="Questa è una stringa\n"; ?>
Se la stringa è contenuta tra apici DOPPI il contenuto di ogni variabile viene convertito in stringa e sostituito al nome della variabile corrispondente!<?php $a="lezione"; $b=15; $c="Questa è la $a numero $b\n"; print $c; ?>
produce nel file HTML:Questa è la lezione numero 15
E' possibile utilizzare caratteri speciali (sequenze di escape) simili a quelli usati in C:\n a capo (LF) \t tabulazione orizzonatale (HT) \\ backslash \$ dollaro \" virgolette doppie
Attenzione alla sequenza di escape per il simbolo di dollaro! - TESTO contenuto tra apici SINGOLI (diverso dal C!):
<?php $a='Questa è una stringa'; ?>
Se la stringa è contenuta tra apici SINGOLI non viene effettuata nessuna sostituzione e gli unici caratteri speciali utilizzabili sono:\\ backslash \" virgolette singole
- TESTO contenuto tra due etichette + operatore <<< (heredoc)
<?php $nome="Gino"; $s = <<<FINE Mi chiamo $nome.\n Sto provando a costruire stringhe in PHP.\n FINE; print $s; ?>
produce nel file HTML:Mi chiamo Gino. Sto provando a costruire stringhe in PHP.
ATTENZIONE: la riga che contiene l'etichetta finale non deve contenere altro che l'etichetta e un punto e virgola. NON mettere spazi ne indentare l'etichetta!
L'operatore heredoc ha le stesse caratteristiche delle stringhe contenute tra apici doppi: sostituzione delle variabili + caratteri speciali (eccetto \").
Per accedere ad un carattere di una stringa si utilizza l'operatore {} (diverso da quello utilizzato per gli array). I caratteri sono, come in C, numerati a partire dallo 0.<?php $nome="Gino"; $s = $nome{2}; print $s; // stampa la lettera n ?>
- TESTO contenuto tra apici DOPPI (come in C):
- array: sono di tipo associativo,
ovvero memorizzano i valori degli elementi associandoli a
delle chiavi, che possono essere numeri interi o stringhe.
Utilizzando chiavi intere, la manipolazione di un array è pressoché identica al C:<?php $a[0]=1; $a[1]=2; $a[2]=3; $a[3]=4; print_r($a); ?>
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
ma è una struttura dati molto più versatile.
Può contenere dati di tipi diversi:<?php $a[0]=1; $a[1]=2; $a[2]="pino"; $a[3]="abete"; print_r($a); ?>
Array ( [0] => 1 [1] => 2 [2] => pino [3] => abete )
Gli indici possono essere numeri interi o stringhe:<?php $a[0]=1; $a["quantità"]=2; $a["albero"]="pino"; $a[3]="abete"; print_r($a); ?>
Array ( [0] => 1 [quantità] => 2 [albero] => pino [3] => abete )
La sintassi più generale per definire un array è:array( [chiave1 =>] valore1, [chiave2 =>] valore2, [chiave3 =>] valore3, ... )
l'ultimo esempio e infatti equivalente a:<?php $a=array(0=>1, "quantità"=>2, "albero"=>"pino", 3=>"abete"); print_r($a); ?>
mentre il primo è equivalente a:<?php $a=array(1, 2, 3, 4); print_r($a); ?>
Se la chiave non è specificata, viene automaticamente assegnata una chiave numerica crescente. Il modulo PHP verifica quale sia la chiave numerica più alta contenuta in quell'array e- se positiva, assegna alla chiave il valore più alto + 1;
- se negativa, assegna alla chiave il valore 0;
<?php $a[2]=1; $a[]=2; print_r($a); $b[-5]=3; $b[]=4; print_r($b); ?>
Array ( [2] => 1 [3] => 2 ) Array ( [-5] => 3 [0] => 4 )
Non pensiamo all'array PHP come ad una array C: non occupa necessariamente una zona di memoria contigua. - Abbiamo visto che quando creiamo una stringa, se inseriamo
il nome di una variabile tra virgolette doppie (" "), il modulo
PHP sostituisce al nome della variabile il suo contenuto opportunamente
convertito. Se questa variabile è l'elemento di un array dobbiamo
utilizzare le parentesi graffe ({ }):
<?php $a["ditta"] = "pincopallino"; $b = "la ditta {$a["ditta"]} ha pagato la fornitura."; // NON funzionerebbe: $b = "la ditta $a["ditta"] ha pagato la fornitura."; ?>
- Array multidimensionali: ogni elemento di un array può essere di tipo qualunque, anche un altro array. Un array che contiene altri array è di fatto un array multidimensionale.
- NULL (non è case-sensitive)
è un tipo di variabile che non ha valore, può assumere solo il valore NULL stesso.
Una variabile è NULL se- gli è stato espressamente assegnato il valore NULL
<?php $a=NULL; ?>
- è stata distrutta con unset()
<?php $a=3.78; unset($a); ?>
- gli è stato espressamente assegnato il valore NULL
Conversioni di tipo
- E' possibile, come in C, operare il cast tra un tipo e l'altro:
(bool) o (boolean) cast a valore logico (int) o (integer) cast a numero intero (float) o (double) o (real) cast a numero in virgola mobile (string) cast a stringa (array) cast ad array <?php $a=3.84; $b=(int)$a; print $b; // $a viene convertito in intero con il cast e implicitamente a stringa. // Il risultato è la stringa "3" ?>
- Il PHP converte automaticamente tra un tipo e l'altro. Ciò lo rende
molto flessibile.
Dobbiamo però conoscere le principali regole implicite di conversione (usate anche
forzando il cast):
DA tipo A tipo regola conversione implicita integer o float boolean FALSE se il numero è zero (0 o 0.0); TRUE altrimenti string boolean FALSE se la stringa è vuota o è la stringa "0"; TRUE altrimenti array boolean FALSE se l'array non ha alcun elemento; TRUE altrimenti boolean integer o float 1 (o 1.0) se il valore logico è TRUE, 0 (o 0.0) se FALSE float integer intero ottenuto eliminando i decimali (verso lo zero) stringa integer o float il numero ottenuto convertendo la stringa se la stringa rappresenta un numero, 0 altrimenti integer o float stringa una stringa contenente il valore numerico boolean string una stringa vuota se il valore logico è FALSE, "1" se TRUE array string la stringa "Array"
- Le variabili utilizzate prima di venire assegnate,
assumono valore predefiniti:
- se utilizzate come boolean assumono il valore FALSE;
- se utilizzate come integer (o float) assumono il valore 0 (o 0.0);
- se utilizzate come string sono equivalenti alla stringa vuota "".
<?php $n=3; print $n+$m; ?>
funziona perfettamente (a $m viene implicitamente assegnato il valore 0). ATTENZIONE: questo non vuol dire che tutto fili liscio! A seconda del livello di error_reporting impostato potrebbe visualizzarsi un warning sulla pagina HTML, del tipo: Notice: Undefined variable: m in ...
Stampa sullo stdout
Abbiamo visto che, la stampa sullo standard output (che il server HTTP copierà nella risposta al client) è la finalità naturale di ogni GCI. In PHP si utilizza:- print "stringa";: stampa la stringa. Si può usare anche nella forma print("stringa");.
- printf("%s","stringa");: è IDENTICO alla printf C!
Esempio, per stampare un float con 2 cifre decimali:
<?php printf("%12.2f",$rata_mutuo); ?>
- echo: è di fatto identico a print. Esempio
<?php print $n; echo $n; // producono un identico risultato ?>
- Molto utile è l'operatore di congiunzione di due stringhe, il punto
.:
<?php $a="Mario"; $b="Rossi"; print $a . " ". $b // Il risultato è Mario Rossi ?>
- ATTENZIONE: il carattere "\n" produce un ritorno a capo nel file HTML
che il nostro client riceverà. Se vogliamo che il testo mostrato
dal browser vada a capo dobbiamo aggiungere il solito <br />.
Esempio:
<?php print "Prima riga\n"; print "<br />\n"; print "Seconda riga\n"; ?>
produce un file HTML con:Prima riga <br /> Seconda riga
Operatori
Aritmetici
Somma (+), sottrazione (-), moltiplicazione (*), divisione (/) e resto della divisione intera (%). A differenza del C, il risultato dell'operazio è sempre un float, anche se la divisione avviene tra due interi.Assegnamento
L'operatore di assegnamento fondamentale è il segno di uguale (=). Come in C, a+=3; corrisponde a a=a+3;. Questo vale per gli altri operatori aritmetici e per l'operatore di concatenamento di stringhe: $s.=" cognome"; equivale a $s=s . " cognome";.Relazionali
Uguale (==), diverso (!= oppure <>), maggiore (>), maggiore e uguale (>=), minore (<) e minore e uguale (<=).
Restituiscono TRUE se la relazione è verificata, FALSE altrimenti.
E' possibile confrontare variabili di tipo diverso. In questo caso, le variabili oggetto del confronto, vengono prima convertite ad un tipo comune.
Se, oltre al valore della variabile, si vuole verificare che anche il tipo sia coincidente, si deve utilizzare l'operatore identico (===) o non-identico (!==). Questa è una novita rispetto al C. Esempio:<?php $a=1; $b="1"; $c = ($a==$b); var_dump($c); print "<br />\n"; $c = ($a===$b); var_dump($c); ?>
produce nel file HTMLbool(true) <br /> bool(false)
L'operatore === è utile per non confondere stringhe con valori numerici o booleani. Ad esempio le seguenti affermazioni sono tutte false:2 === 2.0 2 === "2" 0 === FALSE
mentre queste sono tutte vere:2 == 2.0 2 == "2" 0 == FALSE
Logici
AND (and oppure &&), OR (or oppure ||), NOT (!) e XOR (xor)Array
Due array possono essere confrontati con gli operatori relazionali visti in precedenza. Una novità è l'operatore di UNIONE (+) tra due array: $c=$a+$b. Come funziona: tutti gli elementi di $b che non hanno chiavi uguali ad elementi in $a vengono aggiunti agli elementi di $a e posti in $c. Esempio:<?php $orto=array("rapanelli"=>"2Kg", "insalata"=>"3Kg", "patate"=>"20Kg"); $frigorifero=array("patate"=>"0.1Kg", "zucchine"=>"1Kg"); print "\$orto unito a \$frigorifero:\n"; $verdure_a_disposizione=$orto+$frigorifero; print_r($verdure_a_disposizione); print "\$frigorifero unito a \$orto:\n"; $verdure_a_disposizione=$frigorifero+$orto; print_r($verdure_a_disposizione); ?>
scrive nel file HTML:$orto unito a $frigorifero: Array ( [rapanelli] => 2Kg [insalata] => 3Kg [patate] => 20Kg [zucchine] => 1Kg ) $frigorifero unito a $orto: Array ( [patate] => 0.1Kg [zucchine] => 1Kg [rapanelli] => 2Kg [insalata] => 3Kg )
Controllo del flusso di esecuzione
Per quanto riguarda il controllo di flusso, il PHP assomiglia molto al linguaggio C (BENE!).Strutture condizionali: if
if( condizione_logica_1 ) { // codice che viene eseguito se condizione_logica_1 è TRUE } else { // codice che viene eseguito se condizione_logica_1 è FALSE }
Come in C, è possibile non utilizzare le parentesi graffe se l'istruzione è solo una (vale per tutti i costrutti di controllo). A differenza del C:if( condizione_logica_1 ) { // codice che viene eseguito se condizione_logica_1 è TRUE } elseif( condizione_logica_2 ) { // codice che viene eseguito se condizione_logica_2 è TRUE } elseif( condizione_logica_3 ) { // codice che viene eseguito se condizione_logica_3 è TRUE } else { // codice che viene eseguito se tutte le condizioni // precedenti sono FALSE }
Strutture condizionali: switch
switch(variabile) { case valore_1: // codice che viene eseguito se variabile==valore_1 break; case valore_2: // codice che viene eseguito se variabile==valore_2 break; case valore_3: case valore_4: // codice che viene eseguito se (variabile==valore_3) o se (variabile==valore_4) break; default: // codice che viene eseguito se nessuna delle condizioni // precedenti è verificata }
Iterazione: for
for($i=1; $i<10; $i++) { // codice da eseguire fino a che la condizione rimane TRUE }
Iterazione: while
$i=1; while($i<10) { // codice da eseguire fino a che la condizione rimane TRUE $i++; }
Iterazione: foreach (NOVITA'!!!)
foreach è un costrutto non presente nel C. Serve per scandire gli array del PHP.foreach($nome_array as $k => $v) { // Codice da eseguire per ogni elemento dell'array. // All'i-esimo ciclo $v conterrà: // $k conterrà il valore della chiave dell'elemento i-esimo // $v conterrà il valore dell'elemento i-esimo }
Esempio:<?php $a=array("Mario" => 2, "Luigi" => 1, "Teresa" => 5); foreach($a as $dipendente => $giorni) { if($giorni == 1) print $dipendente . " ha " . $giorni . " giorno di ferie"; else print $dipendente . " ha " . $giorni . " giorni di ferie"; print "<br />\n"; } ?>
produce:Mario ha 2 giorni di ferie<br /> Luigi ha 1 giorno di ferie<br /> Teresa ha 5 giorni di ferie<br />
Se le chiavi degli elementi non interessano, è possibile utilizzare la forma compatta:foreach($nome_array as $v) { // Codice da eseguire per ogni elemento dell'array. // All'i-esimo ciclo $v conterrà il valore dell'elemento i-esimo }
Le variabili PROVENIENTI dall'ESTERNO
Nell'esempio seguente, l'utente è invitato ad inserire l'età, che (vedi la scorsa lezione) il client invierà nella richiesta HTTP alla CGI controlla_eta.php.<html>
<head>
<title>Che età hai?</title>
</head>
<body>
Inserisci la tua età:
<form action="controlla_eta.php" method="get">
<input type="text" name="eta" \>
<input type="submit" value="Invia">
</form>
</body>
</html>
Come fa la CGI controlla_eta.php ad accedere al valore
dell'età? In generale quali sono le informazioni esterne disponibili ad
uno script PHP?$_GET
$_GET è un array associativo che contiene le variabili inviate allo script corrente attraverso il metodo GET. Esempio:<?php print "Hai " . $_GET["eta"] . " anni!"; ?>
(al posto di $_GET si potrebbe usare anche il nome obsoleto $HTTP_GET_VARS: sconsigliato!)$_POST
$_POST è un array associativo che contiene le variabili inviate allo script corrente attraverso il metodo POST. Esempio:<?php print "Hai " . $_POST["eta"] . " anni!"; ?>
(al posto di $_POST si potrebbe usare anche il nome obsoleto $HTTP_POST_VARS: sconsigliato!)$_COOKIE
$_COOKIE è un array associativo che contiene le variabili inviate allo script corrente attraverso cookies HTTP.
Che cosa è un cookie? Un cookie è un piccolo file creato dal client, sul suo filesystem, su richiesta esplicita del server. Il client si può rifiutare di accettare (creare) il cookie (è una delle impostazioni di ogni browser).
Perché creare cookie? HTTP è stateless cioè ogni pagina è scollegata da ogni altra. Se questo può andare bene per condividere delle informazioni online, di certo è riduttivo per creare applicazioni complesse, come siti di vendita online.
Il cookie è un contenitore per alcune (poche) informazioni, che il server invita il client a rimandargli ogni volta che invia una richiesta. Da queste informazioni il server può riconoscere il client univocamente (circa...). E' l'equivalente del contrassegno della lavanderia ...
(l'obsoleto $HTTP_COOKIE_VARS è pressapoco simile a $_COOKIE: sconsigliato!)
Capiamolo meglio con un esempio (provacookie.php):<?php if( isset($_COOKIE["visite"]) ) $numero_visite=(int)$_COOKIE["visite"]+1; else $numero_visite=1; // Il cookie verrà cancellato dal client dopo 3600 secondi = 1 ora setcookie("visite", $numero_visite, time()+3600); ?> <html> <head> <title>Piccola prova cookie</title> </head> <body> <?php if( $numero_visite==1 ) { print "<h2>Benvenuto!</h2>\n"; print "Nell'ultima ora hai visitato questa pagina 1 volta\n"; } else { print "<h2>Bentornato!</h2>\n"; print "Nell'ultima ora hai visitato questa pagina $numero_visite volte\n"; } ?> </body> </html>
Il server chiede al client di creare il cookie nell'header della risposta HTTP:HTTP/1.x 200 OK Date: Fri, 30 Apr 2004 20:23:34 GMT Server: Apache/1.3.27 (Win32) PHP/4.3.3 X-Powered-By: PHP/4.3.3 Set-Cookie: visite=1; expires=Fri, 30-Apr-2004 21:23:34 GMT Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html
la pagina HTML prodotta (alla prima visita) è:<html> <head> <title>Piccola prova cookie</title> </head> <body> <h2>Benvenuto!</h2> Nell'ultima ora hai visitato questa pagina 1 volta </body> </html>
Il client accetta la proposta del server e crea un file chiamato (Windows 2000 + IE) sassi@saturno[1].txt che contiene:visite 1 saturno/ 1024 1795114496 29634299 155982864 29634291 *
Tutte le volte che il client fa una richiesta ad un server, verifica se ha un cookie di quel server. In caso affermativo, include nella richiesta le variabili contenute nel cookie!GET /provacookie.php HTTP/1.1 Host: saturno User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040206 Firefox/0.8 Accept: */* Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: visite=1 Cache-Control: max-age=0
$_REQUEST
$_REQUEST è un array associativo che contiene tutte le variabili contenute negli array $_GET, $_POST e $_COOKIE.
Va usato con attenzione evitando variabili con lo stesso nome.$_SERVER
$_SERVER è un array associativo che contiene molte informazioni sul server che sta eseguendo il modulo PHP.
Per vederle tutte:<html> <head> <title>Informazioni sul server!</title> </head> <body> <?php foreach($_SERVER as $chiave => $valore) print "$chiave : $valore <br />\n"; ?> </body> </html>
Alcuni ESEMPI
Esempio 1
La somma di due numeri. File somma.htm:<html> <head> <title>Somma di due numeri</title> </head> <body> <h2>SOMMA di 2 NUMERI</h2> <form action="somma.php" method="get"> <table border="0"> <tr> <th>Inserisci il primo addendo</th> <td><input type="text" name="add1" /></td> </tr> <tr> <th>Inserisci il secondo addendo</th> <td><input type="text" name="add2" /></td> </tr> <tr> <th></th> <td><input type="submit" value="Somma!" /></td> </tr> </table> </form> </body> </html>
e "somma.php":<html> <head> <title>Risultato della somma</title> </head> <body> <h2>RISULTATO della SOMMA</h2> <?php $somma=$_GET['add1']+$_GET['add2']; print "Il risultato di {$_GET['add1']} + {$_GET['add2']} è $somma\n"; ?> </body> </html>
Esempio 2
Creiamo lo stesso file HTML prodotto nell'esercizio CreaFileHtml1.c della lezione Lez11e12 (potenze.php).<html> <head> <title>Una tabella scritta da uno script in PHP</title> </head> <body bgcolor="#FFFFFF"> </body> <b>Potenze del 2 e del 3 (da 0 a 10)</b><br /><br /> <table border="3" cellpadding="10"> <td></td> <th>2</th> <th>3</th> </tr> <?php for($i=0; $i<=10; $i++) { print "<tr>\n"; print "<th>$i</th>\n"; print "<td bgcolor=\"#FFFF00\">" . pow(2,$i) . "</td>\n"; print "<td bgcolor=\"#0099AA\">" . pow(3,$i) . "</td>\n"; } ?> </table> </html>
Esempio 3
Un esempio più complesso: FORM HTML e SCRIPT PHP nello stesso file (mutuo.php).<?php if(isset($_REQUEST["importo"]) and isset($_REQUEST["anni"]) and isset($_REQUEST["interesse"])) { $importo=$_REQUEST["importo"]; $anni=$_REQUEST["anni"]; $interesse=$_REQUEST["interesse"]; $interesse_mensile=(double)$interesse/(12.0*100.0); $rata_mensile=(double)$importo*$interesse_mensile/ (1.0-1.0/pow(1.0+$interesse_mensile,12*$anni)); } else { $importo=""; $anni=""; $interesse=""; } ?> <html> <head> <title>:: Calcolo rata mutuo ::</title> </head> <body> <b>CALCOLO DELLA RATA DEL MUTUO</b> <br /><br /> <?php print "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"GET\">\n"; print "<table border=\"0\" cellpadding=\"4\">\n"; print "\t<tr>\n"; print "\t<th align=\"right\">Importo del prestito (€): </th>\n"; print "\t<td align=\"right\"><input name=\"importo\"" . "value=\"$importo\" type=\"text\"></td>\n"; print "\t<td></td>\n"; print "\t</tr>\n"; print "\t<tr>\n"; print "\t<th align=\"right\">Durata del mutuo (anni): </th>\n"; print "\t<td align=\"right\"><input name=\"anni\"" . "value=\"$anni\" type=\"text\"></td>\n"; print "\t<td></td>\n"; print "\t</tr>\n"; print "\t<tr>\n"; print "\t<th align=\"right\">Interesse (%): </th>\n"; print "\t<td align=\"right\"><input name=\"interesse\"" . "value=\"$interesse\" type=\"text\"></td>\n"; print "\t<td align=\"right\">\n" . "\t<input type=\"submit\" value=\"Calcola\">\n" . "\t</td>\n"; print "\t</tr>\n"; if(isset($_REQUEST["importo"]) and isset($_REQUEST["anni"]) and isset($_REQUEST["interesse"])) { print "\t<tr>\n"; print "\t<th align=\"right\">Rata mensile (€): </th>\n"; print "\t<td align=\"right\" bgcolor=\"FFEE00\">" . sprintf("%12.2f",$rata_mensile) . "</td>\n"; print "\t<td></td>\n"; print "\t</tr>\n"; print "\t<tr>\n"; print "\t<th align=\"right\">Totale interessi (€): </th>\n"; print "\t<td align=\"right\" bgcolor=\"FFEE00\">" . sprintf("%12.2f",$rata_mensile*12*$anni-(double)$importo) . "</td>\n"; print "\t<td></td>\n"; print "\t</tr>\n"; print "\t<tr>\n"; print "\t<th align=\"right\">Totale (€): </th>\n"; print "\t<td align=\"right\" bgcolor=\"FFEE00\">\n" . sprintf("%12.2f",$rata_mensile*12*$anni) . "</td>\n"; print "\t<td></td>\n"; print "\t</tr>\n"; } print "</table>\n"; print "</form>\n"; if(isset($_REQUEST["importo"]) and isset($_REQUEST["anni"]) and isset($_REQUEST["interesse"])) { ?> <br /> <br /> <b>La ripartizione mensile del mutuo è la seguente:</b> <br /> <br /> <?php $debito_residuo=(double)$_REQUEST['importo']; $capitale_restituito=0.0; $interesse_pagato=0.0; ?> <table border="1" cellpadding="4"> <tr> <th>Mese</th> <th>Rata interesse</th> <th>Rata capitale</th> <th>Rata totale</th> <th>Capitale restituito</th> <th>Debito residuo</th> <th>Interesse pagato</th> </tr> <tr> <td align="center">-</td> <td align="center">-</td> <td align="center">-</td> <td align="center">-</td> <td align="right"><?php printf("%12.2f",$capitale_restituito); ?></td> <td align="right"><?php printf("%12.2f",$debito_residuo); ?></td> <td align="right"><?php printf("%12.2f",$interesse_pagato); ?></td> </tr> <?php for($i=1;$i<=12*(int)$_REQUEST['anni'];$i++) { $rata_interesse=$debito_residuo*$interesse_mensile; $rata_capitale=$rata_mensile-$rata_interesse; $capitale_restituito+=$rata_capitale; $debito_residuo-=$rata_capitale; $interesse_pagato+=$rata_interesse; if($i%2===0): $bgcolor="\"FFFF00\""; else: $bgcolor="\"0099AA\""; endif; print("\t<tr>\n\t<th>$i</th>\n"); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$rata_interesse); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$rata_capitale); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$rata_interesse+$rata_capitale); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$capitale_restituito); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$debito_residuo); printf("\t<td bgcolor=$bgcolor align=\"right\">%12.2f</td>\n",$interesse_pagato); print("\t</tr>\n"); } ?> </table> <?php } ?> </body> </html>
Esempio 4
Utilizzo (leggermente) più avanzato nell'uso dei cookie (escookie1.php).
L'utente si collega alla pagina www.dti.unimi.it/~sassi/LIA2003/escookie1.php:<html> <head> <title>Gazzetta di Crema</title> </head> <body> <?php if( !isset($_COOKIE['utente']) ) { print "<h2>Benvenuto nella Gazzetta di Crema</h2>\n"; print "Per accedere devi registrarti\n"; print "<br />\n"; print "<br />\n"; print "Per cortesia, inserisci i tuoi dati:\n"; print "<form action=\"escookie2.php\" method=\"get\">\n"; print "Nome: \n"; print "<input type=\"text\" name=\"nome\" />\n"; print "<br />\n"; print "Cognome: \n"; print "<input type=\"text\" name=\"cognome\" />\n"; print "<br />\n"; print "<input type=\"submit\" value=\"Invia\">\n"; print "</form>\n"; } else { ?> <h2>Benvenuto nella Gazzetta di Crema</h2> <p>Utente connesso: <font color="#FF0000"> <?php print $_COOKIE['utente']; ?> </font> (autorizzato a leggere il giornale online per 1 ora) <br /> <br /> NOTIZIE <br /> <br /> BLA, BLA, ... <?php // Qui lo script potrebbe inserire l'informazione che // vi siete collegati al sito in un database da utilizzare // per fini statistici, commerciali ... } ?> </body> </html>
L'action del form punta al file www.dti.unimi.it/~sassi/LIA2003/escookie2.php che provvederà a richiedere il cookie:<?php if( !isset($_COOKIE['utente']) ) { $nome_cognome= $_GET['nome'] . " " . $_GET['cognome']; // Il cookie verrà cancellato dal client dopo 3600 secondi = 1 ora setcookie("utente", $nome_cognome, time()+3600); } // rimanda il browser alla pagina di partenza header("Location: http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/escookie1.php"); ?>
escookie2.php produce la seguente risposta del server (attenzione: è sempre il server a richiedere il cookie):HTTP/1.x 302 Found Date: Fri, 30 Apr 2004 18:16:35 GMT Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.1.2 mod_ssl/2.8.9 OpenSSL/0.9.6g mod_perl/1.26 X-Powered-By: PHP/4.1.2 Set-Cookie: utente=Luigi+Rossi; expires=Fri, 30-Apr-04 19:16:35 GMT Location: http://www.dti.unimi.it/~sassi/LIA2003/escookie1.php Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1
La risposta ha codice 302 (non 200 come nella scorsa lezione) e chiede al client una redirezione temporanea al sito indicato da "Location: ..." (lo avevamo impostato tramite il comando PHP header()).
Nell'header della risposta HTTP, anche in questo caso troviamo la richiesta al client di creare un cookie.
Lab
Un ambiente PHP funzionante è composto da almeno tre componenti:- il server HTTP (Apache, MS Internet Information Services, ...);
- il modulo PHP;
- un database server (MySQL, MS SQL server, Oracle, ...).
- il server HTTP Apache 1.3.27;
- il modulo PHP 4.3.3;
- il database server MySQL 4.0.15;
- il pacchetto PhpMyAdmin 2.5.3 (serve per gestire facilmente i database MySQL).
Mentre sviluppate i vostri script, è essenziale consultare il manuale ufficiale PHP. Fatelo per risolvere ogni dubbio o per scoprire che funzioni sono messe a disposizione. A differenza della libreria standard C, che cambia solo a seguito di modifiche molto lente allo standard ISO/IEC, il PHP evolve molto velocemente e con lui anche il manuale. La versione aggiornata la potete scaricare da http://www.php.net/download-docs.php; una copia locale la trovate qui.
Esercizio 1: Prendiamo confidenza con il PHP/I
Salvate i file somma.htm e somma.php. Quindi copiateli nella vostra cartella sul WEB server. In questa pagina trovate un riassunto della procedura.
Dal vostro browser, caricate la pagina "somma.htm" e verificate che tutto funzioni. Analizzate attentamente i due file. Modificateli opportunamente in modo che utilizzino il metodo POST invece che il GET.
Esercizio 2: Prendiamo confidenza con il PHP/II
Salvate il file iserver.php che visualizza il contenuto dell'array superglobal $_SERVER. Copiatelo sul server. Eseguite lo script e con l'aiuto del file di help PHP analizzate l'output (in particolare HTTP_USER_AGENT, HTTP_HOST e SCRIPT_URL). Guardate anche il file HTML prodotto (con MS Internet Explorer, Visualizza->HTML; con FireFox/Mozilla, View->Page Source).
Esercizio 3:
Rifai in PHP l'esercizio 3 della lezione lez11e12.html: scrivi un tuo programma "tabelline.php" che crei una pagina HTML ("tabelline.html") con la tabella delle "tabelline" da 1 a 10. La tabella deve avere le intestazioni di riga e di colonna (<th> </th>).
Per verificare se lo script funziona caricalo sul server ed eseguilo!
Esercizio 4:
Preparare un form HTML in cui l'utente inserisce i coefficienti di una equazione di secondo grado. I dati vengono inviati tramite il metodo POST ad uno script PHP che produce una pagina HTML con la soluzione.
Commenti
Posta un commento