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:
  1. Variabili
  2. Tipi di dato
  3. Operatori
  4. Controllo del flusso di esecuzione
  5. 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:
    1. 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!
    2. 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

    3. 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
    ?>
    
un tipo di variabile composta:

  • 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.
e un tipo di variabile speciale

  • NULL (non è case-sensitive)
    è un tipo di variabile che non ha valore, può assumere solo il valore NULL stesso.
    Una variabile è NULL se
    1. gli è stato espressamente assegnato il valore NULL
      <?php
      $a=NULL;
      ?>
      
    2. è stata distrutta con unset()
      <?php
      $a=3.78;
      unset($a);
      ?>
      
    Rendere NULL la variabile $a significa eliminare lo spazio che il contento di $a occupava in memoria. MOLTO utile!

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 "".
    Ad esempio:
    <?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 HTML
    bool(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 (&euro;): </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 (&euro;): </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 (&euro;): </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 (&euro;): </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, ...).
Installarli separatamente è piuttosto brigoso anche se non difficile. Se volete esercitarvi a casa, è molto più conveniente utilizzare la distribuzione EasyPHP. La versione 1.7 contiene:

  • 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).
A prescindere delle versioni di volta in volta disponibili, ad esercitazione utilizzaremo i quattro software appena elencati.
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

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi sulla rappresentazione della virgola mobile IEEE 754 (Floating Point)