Diapositiva 1 - Dipartimento di Ingegneria dell`Informazione

PHP
PHP Hypertext Preprocessor
Programmazione lato server
1
Building applications
“… While many sites act as simple repositories,
providing users with a collection of files they can
retrieve and navigate through with hyperlinks,
web sites are capable of much more sophisticated
interactions. Sites can collect informations from
users through forms, customize their appearance
and their content to reflect the interests of
particular users, or let the users interact with a
variety of information sources…”
2
Cosa vediamo…
3
Cosa vediamo…
web server
Comunicazione HTTP
Apache
Logica applicativa
PHP
Data source
MySQL
4
Cosa vediamo…
5
Architettura 3-tier (dal sito Microsoft)
6
Apache

È un web server.
• Parla e capisce il protocollo http.

Primo web server, sviluppato da Tim
Berners-Lee presso il CERN.

Predecessore di Apache: NCSA httpd
server (1995).
7
PHP

Open-source server-side scripting language
sviluppato appositamente per il web.

Il progetto inizia nel 1994 (Rasmus Lerdorf).

Inizialmente PHP = Personal Home Page, poi
diventa PHP Hypertext Preprocessor.

1998: PHP 3.

Versioni correnti: PHP 5.2.11 e PHP 5.3.0.
8
PHP
HTML + JavaScript
PHP
Un file con codice PHP deve
essere salvato in formato solo
testo e con estensione .php.
HTML + JavaScript
PHP
9
Introduzione a PHP

Linguaggio di scripting per realizzare pagine web
dinamiche, il cui contenuto viene generato (dinamicamente)
nel momento in cui queste vengono richieste al web server.

Script PHP: pagina HTML nella quale viene inserito il codice
• PHP viene descritto come “HTML-embedded”.

Il codice PHP viene eseguito sul server prima che la pagina
venga inviata al browser, che vedrà solo il risultato finale.
10
Introduzione a PHP: esempio “Ciao
mondo!”
Script PHP:
<html>
<head><title>Esempio 1</title></head>
<body>
<?php
echo “<h1>Ciao mondo!</h1>”;
?>
</body>
</html>
Pagina inviata al browser:
<html>
<head><title>Esempio 1</title></head>
<body>
<h1>Ciao mondo!</h1>
</body>
</html>
11
Introduzione a PHP: come si
inserisce il codice?

Stile abbreviato
<?
codice PHP qui
?>

Stile classico
<?php
codice PHP qui
?>

Stile Microsoft ASP
<%
codice PHP qui
%>

Alternativa (utile con gli editor HTML visuali, come Front Page, che
potrebbero non tollerare gli altri tipi di sintassi)
<SCRIPT LANGUAGE=“php”>
codice PHP qui
</SCRIPT>
12
Introduzione a PHP: come si
inserisce il codice?

Le istruzioni devono essere separate
tra loro dal ;

Commenti
• // questo è un commento
• /* questo è un commento */
• # questo è un commento
13
Le funzioni fondamentali: sintassi
per le funzioni

La sintassi per richiamare una funzione è la seguente:
nome_funzione(valore1, valore2,…);

È possibile che alcune funzioni non necessitino di alcun
parametro. In questo caso, vanno comunque indicate le
parentesi tonde.
14
Le funzioni fondamentali: phpinfo( )

phpinfo(): genera dinamicamente una pagina contenente
informazioni sulla versione di PHP installata e altre cosette,
quali i nomi delle variabili predefinite.
<html>
<head><title>phpinfo()</title></head>
<body>
<?php
phpinfo( );
?>
</body>
</html>
15
Le funzioni fondamentali: echo

echo: serve per scrivere l’output che viene inviato al browser che
accede allo script.
• Non si tratta propriamente di una funzione, bensì di un costrutto del
linguaggio; per questo non si usano le parentesi tonde.
<html>
<head><title>echo</title></head>
<body>
<?php
echo “<h1>Benvenuto!</h1>”;
?>
</body>
16
</html>
Le funzioni fondamentali: echo

Grazie a echo si può visualizzare il contenuto delle variabili.
<html>
<head><title>echo</title></head>
<body>
<?php
echo “Benvenuto su ” . $_SERVER[“HTTP_HOST”];
?>
</body>
</html>

$_SERVER[“HTTP_HOST”]: variabile contenente il nome di
dominio del sito su cui lo script viene eseguito.
17
Le funzioni fondamentali: exit( ) e
die( )

exit() e die(): arrestano l’esecuzione dello script; die() consente
anche di stampare un messaggio. Tali funzioni possono essere
utilizzate per gestire eventuali situazioni di errore che non
consentono la prosecuzione dello script.
<html>
<head><title>exit</title></head>
<body>
<? exit( ); ?>
<p>Questa frase non si vedrà</p>
</body>
</html>
18
Le funzioni fondamentali: esempi

Nell’esempio seguente controlliamo il valore della variabile $n e
mostriamo un messaggio di errore, bloccando l’esecuzione del
programma, se tale variabile è maggiore di 1.
<html>
<head><title>die</title></head>
<body>
<?
$n=5;
if ($n>1) die(“<h1>$n è maggiore di uno!!!</h1>”);
echo “<h1>$n è minore o uguale a uno!</h1>”;
Vedere cosa succede
?>
sostituendo $n=5 con
</body>
$n=1.
</html>
19
Variabili e tipi di dato: sintassi delle
variabili

I nomi delle variabili sono prefissati dal simbolo $
• Esempio: $a = $b + $c serve per assegnare alla
variabile a la somma dei valori delle variabili b e c. Il
simbolo = è l’operatore di assegnazione.

In PHP, per creare una variabile, è sufficiente
assegnarle un valore. Le variabili, cioè, non
vanno dichiarate esplicitamente.

Per visualizzare il valore di una variabile, come
già visto, si usa echo.
20
Variabili e tipi di dato: sintassi delle
costanti

Il formato per assegnare il valore ad una costante è:
define(“nome_costante”,”il valore che si intende dare”);

Esempio:
define(“FILM”,”Codice d’onore”);
define(“TIPOFILM”,” è un dramma nell’ambito della giustizia
militare.”);

Per visualizzare una costante in uno script si usa echo e
l’operatore di concatenazione:
echo “Il film ”.FILM.TIPOFILM;

L’operatore . è l’operatore di concatenazione.
21
Operatori (I)


Operatori aritmetici
•
+: addizione ($a + $b).
•
-: sottrazione ($a - $b).
•
: moltiplicazione ($a  $b).
•
/: divisione ($a / $b).
•
%: modulo ($a % $b).
Operatori di confronto
•
==: uguale ($a == $b).
•
===: identico ($a === $b) (cioè $a e $b sono anche dello stesso tipo).
•
!=: diverso ($a != $b).
•
<>: diverso ($a <> $b).
•
<: minore di ($a < $b).
•
<=: minore o uguale di ($a <= $b).
22
Operatori (II)

Operatori logici
• !: NON (!$b: rende vero se $b è falso e viceversa).
• &&: E ($a && $b: rende vero se $a e $b sono entrambe vere;
altrimenti falso).
• ||: O ($a || $b: rende vero se $a oppure $b è vera; altrimenti falso).
• xor: O esclusivo ($a xor $b: rende vero se i valori di verità di $a e $b
sono diversi; altrimenti falso).

Operatore ternario
• condition ? “value if true” : “value if false”
($grade > 50 ? “Passed” : “Failed”);
• L’espressione assumerà valore “Passed” o “Failed” a seconda del valore
della variabile $grade.

Operatore di assegnazione: =
23
Operatori (III)

Operatori combinati
• +=: $a += 5: aggiungi 5 ad $a e assegna il risultato ad $a stessa.
• -=: $a -= 5: togli 5 ad $a e assegna il risultato ad $a stessa.
• /=:$a /= 5: dividi $a per 5 e assegna il risultato ad $a stessa.

Operatore di incremento e decremento
• ++$a: aggiunge 1 alla variabile $a poi ne restituisce il valore.
• $a++: restituisce il valore originario quindi vi aggiunge 1.
• Analogamente per gli operatori --$a e $a--.

Questi operatori vengono spesso utilizzati per i contatori
all’interno di cicli ($contatore += 10, $contatore++).
24
Esempi

<?php
$costo_televisore=“500”;
$costo_televisore+=“15”;
echo “Ehi! Grande occasione per le TV, costano solo $costo_televisore, spedizione
inclusa! Ordina subito!”;
?>
Risultato nel browser: Ehi! Grande occasione per le TV, costano solo 515, spedizione
inclusa! Ordina subito!”

$contatore=0;
$contatore=10
echo $contatore++;
echo --$contatore;
echo “<br>”;
echo “<br>”;
echo $contatore;
echo $contatore
Risultato nel browser: 0
Risultato nel browser: 9
1
9
25
Variabili e tipi di dato: variabili
predefinite

Sono variabili il cui valore è preimpostato, che contengono solitamente
informazioni sull’ambiente di esecuzione dello script PHP.

$_SERVER[“PHP_SELF”]: contiene il percorso dello script in esecuzione (ad
es., se lo script è raggiungibile dall’indirizzo http://localhost/index.php3,
$_SERVER[“PHP_SELF”] conterrà il valore /index.php3).

$_SERVER[“HTTP_HOST”]: contiene il nome del server su cui lo script
viene eseguito (nel caso precedente, localhost).

$_SERVER[“REMOTE_PORT”]: fornisce la porta utilizzata sul computer
dell’utente per comunicare con il server web.

$_SERVER[“REMOTE_ADDR”]: fornisce l’indirizzo IP del visitatore.

Usare la funzione phpinfo( ) per visualizzare l’elenco completo delle
variabili predefinite.
26
Variabili e tipi di dato: tipi di dato

I tipi di dato in PHP si suddividono in
tipi scalari e tipi compositi.

Tipi scalari: numeri (interi e in
virgola mobile), stringhe, valori
booleani.

Tipi compositi: array, oggetti.
27
Variabili e tipi di dato: esempi
// $b è una variabile di tipo booleano
$b = TRUE;
// $num è una variabile di tipo intero
$num = 25;
// $pi_greco è un numero in virgola mobile
// si noti il punto (virgola decimale)
$pi_greco = 3.14;
//$messaggio è una stringa
$messaggio = “Ciao a tutti!”;
28
Variabili e tipi di dato: array

In PHP un array può essere tanto un vettore
(struttura dati in cui ogni elemento è individuato
da un valore numerico) quanto un array
associativo (collezione di coppie nome/valore).

array( ): per costruire esplicitamente un array.

È anche possibile costruire un array in modo
implicito.
29
Variabili e tipi di dato: esempi di
array
// array di numeri interi costruito esplicitamente utilizzando array()
$primi = array(2,3,5,7,11);
// array costruito implicitamente
$pari[0] = 2;
$pari[1] = 4;
$pari[2] = 6;
// array associativo
$bookmark[“univ”] = “www.unifi.it”;
$bookmark[“dip”] = “www.dsi.unifi.it”;
30
Variabili e tipi di dato: come
accedere agli elementi di un array

Utilizzare il corrispondente indice numerico,
oppure il nome della componente (se si tratta di
un array associativo)
echo $primi[3];
echo $bookmark[“dip”];

In PHP un array può contenere anche elementi di
tipo diverso
$mix = array(1,”ciao”,3.14,array(1,2,3));
31
Manipolazione delle stringhe

In PHP esistono diverse funzioni predefinite per effettuare
moltissime operazioni sulle stringhe di testo.

substr: consente di estrarre una sottostringa. La sintassi è:
• substr(stringa,inizio,fine); ove stringa indica la stringa di partenza,
inizio è il carattere di partenza per estrarre la sottostringa e fine quello
in cui termina la sottostringa. L’argomento fine è opzionale: se non
indicato, il carattere finale della sottostringa sarà il carattere finale
della stringa stessa.
• <?php
$protagonista=“Bruce Willis”;
$nome=substr($protagonista,0,5);
$cognome=substr($protagonista,6);
echo “Il nome è: $nome, il cognome è: $cognome”;
?>
32
Manipolazione delle stringhe

strlen(stringa): restituisce la lunghezza della
stringa stringa come numero intero.

trim(stringa): elimina gli spazi dalla stringa
stringa.

ucfirst(stringa): rende maiuscola l’iniziale di
stringa.

ucwords(stringa): rende maiuscole tutte le iniziali
delle parole di stringa.
33
Manipolazione delle stringhe

strpos(stringa,pattern): cerca la prima occorrenza di pattern in stringa e
restituisce il carattere in cui compare.

strrpos(stringa,pattern): cerca l’ultima occorrenza di pattern in stringa e
restituisce il carattere in cui compare.

str_replace(stringa da cercare,stringa da inserire,stringa): cerca stringa da
cercare in stringa e la sostituisce con stringa da inserire.

nl2br(stringa): se stringa è un generico testo, converte tutti gli a capo in
<BR> HTML.

urlencode(stringa): converte stringa in modo tale da poterla accodare a
un’interrogazione in uno script.

urldecode(stringa): decodifica completamente la stringa di interrogazione
URL stringa.
34
Manipolazione delle stringhe

strrev(stringa): restituisce stringa invertita.

str_word_count(stringa,modalità): effettua alcuni conteggi (e non solo) su
stringa: se modalità non è specificata, conta le parole di stringa; se
modalità=1, restituisce un array contenente tutte le parole di stringa; se
modalità=2, restituisce un array associativo ove il nome della componente
è la posizione numerica della parola in stringa e il valore è la parola
stessa.

explode(separatore,stringa): crea un array di elementi partendo dalle parti
di stringa divise dal carattere separatore.

implode(separatore,array): crea una stringa partendo dagli elementi di
array divisi da separatore.

Esistono numerose altre funzioni per la manipolazione di stringhe, che
possono essere trovate su ogni buon manuale.
35
Form HTML: sintassi dei form

Un form HTML è una finestra contenente vari elementi di controllo
che consentono al visitatore di inserire informazioni.

Una volta inseriti, i dati vengono inviati ad uno script che li
elabora.

Sintassi:
<form action=“[URL dello script]” method=“[GET o POST]”>
<input type=“[elemento di controllo]” name=“[nome]” …>
<input type=“[elemento di controllo]” name=“[nome]” …>
…
</form>
36
Form HTML: sintassi dei form

L’attributo action serve per specificare l’URL dello script.

L’attributo method serve per specificare la modalità di invio delle
informazioni. Può essere GET o POST. Con GET le informazioni vengono
inserite nell’indirizzo URL, dunque sono visibili nella barra degli indirizzi del
browser, ma sono vincolate dalla lunghezza massima di un URL, che è di
256 caratteri. Con POST i dati vengono scritti sullo “standard input”
dell’applicazione destinataria, dunque non sono visibili ma soprattutto non
ci sono limiti sulla quantità di dati inviata.

Si può accedere alle informazioni inviate anche utilizzando gli array
superglobali $_GET e $_POST (a seconda del metodo usato).
37
Form HTML: elementi di controllo
(I)

Pulsante d’invio: SUBMIT. L’attributo ‘Value’ (opzionale) specifica il testo
personalizzato da visualizzare all’interno del pulsante.

Pulsante per la cancellazione delle informazioni inserite: RESET. L’attributo
‘Value’ è come sopra.

Campi di testo per l’immissione di singole linee di testo all’interno di
appositi riquadri: TEXT. L’attributo ‘Name’ serve per dare il nome al
controllo; ‘Size’ serve per determinare la dimensione del campo in
caratteri (es.: size=“30”). Altri controlli per l’immissione di testo sono
PASSWORD (i caratteri sono rimpiazzati sullo schermo da asterischi) e
HIDDEN (per la creazione di un campo di testo nascosto, a volte utilizzato
per passare informazioni da un form a un altro).

Per l’immissione di testo su più righe, si può utilizzare TEXTAREA:
<TEXTAREA NAME=“miei commenti” ROWS=“10” COLS=“40”>
</TEXTAREA>
38
Form HTML: elementi di controllo
(II)

Caselle di selezione che consentano all’utente selezioni multiple all’interno di un
form: CHECKBOX. L’attributo ‘Name’ serve per dare un nome al singolo elemento di
selezione all’interno del controllo, mentre l’attributo ‘Value’ specifica il valore assunto
dalla variabile relativa quando la casella viene selezionata.

Inserendo alla fine la parola CHECKED, il browser selezionerà inizialmente la casella
in modo automatico.

Esempio:
<INPUT TYPE=“CHECKBOX” NAME=“arancia” VALUE=“Succo d’arancia”>Succo
d’arancia
<INPUT TYPE=“CHECKBOX” NAME=“cola” VALUE=“Coca-Cola”>Coca-Cola
<INPUT TYPE=“CHECKBOX” NAME=“pompelmo” VALUE=“Succo di pompelmo”
CHECKED>Succo di pomplemo
39
Form HTML: elementi di controllo
(III)

Pulsanti radio per la selezione di un solo elemento all’interno di un gruppo: RADIO.

A differenza del controllo CHECKBOX, il nome di tutte le caselle di un controllo RADIO
deve essere sempre lo stesso.

I menu di selezione permettono una o più selezioni a partire da un elenco: SELECT.

Esempio:
<SELECT NAME=“giorno_settimana”>
<OPTION>Lunedì
<OPTION>Martedì
<OPTION>Mercoledì
<OPTION>Giovedì
<OPTION>Venerdì
</SELECT>

Per avere selezioni multiple all’interno di un menu di selezione, si usa la seguente
sintassi:
<SELECT NAME=“giorno_settimana[]” multiple>
40
Form HTML: esempio

Semplice esempio di form HTML:
<form action=“/scripts/elabora.php” method=“get”>
<input type=“text” name=“campione”>
<input type=“submit” name=“Invia” value=“Invia i dati”>
</form>

Scrivendo “Schumacher” nella casella di testo e premendo il
pulsante “Invia i dati”, nella barra degli indirizzi verrà visualizzato:
http://....../scripts/elabora.php?campione=Schumacher

Nello script ‘elabora.php’ viene definita una variabile di nome
$_GET[“campione”] il cui valore è la stringa “Schumacher”.
41
Form HTML: trasmissione dei dati
col metodo GET

Indirizzo URL dello script a cui si vogliono inviare i dati seguito da un
punto interrogativo ? seguito dalla ‘query string’

La struttura della query string consiste di coppie nome/valore separate da
&; i caratteri non ammissibili in un indirizzo URL vengono sostituiti da %
seguito dal corrispondente codice ASCII (in formato esadecimale; ad es.,
‘ì’ diventa ‘%EC’). Gli spazi vengono sostituiti da +.

Il metodo GET si può sfruttare per passare parametri ad uno script PHP.
Supponiamo di avere uno script news.php che estrae informazioni da un
database; possiamo creare una variabile, da chiamare, ad esempio,
$argomento, tramite la quale estrarre il tipo di notizie che più ci
interessano:
http://....../news.php?argomento=Sport
Se l’argomento che ci interessa ha un nome che non sappiamo accodare
ad un URL, possiamo usare la funzione urlencode( ).
42
Un esempio

Creiamo un form contenente un campo di testo, una textarea e due
pulsanti, un pulsante di invio e un pulsante di reset. Supponiamo
inoltre che lo script di destinazione si chiami ‘decode.php’.
43
Un esempio
<html>
<!--form.html-->
<body>
<form action=“decode.php” method=“get”>
Qual è il tuo nome?<input type=“text” name=“nome”>
<br><br>Commenti?<br>
<textarea name=“miei_commenti” rows=“7” cols=“40”>
</textarea>
<br>
<input type=“submit” value=“Voglio saperne di più!”>
<input type=“reset” value=“Cancellami!”>
</form>
</body>
</html>
44
Un altro esempio

Creiamo un altro form, contenente un campo di testo, un menu di
selezione, tre pulsanti radio e i soliti due pulsanti, di invio e di reset.
Supponiamo inoltre che, anche in questo caso, lo script di
destinazione si chiami ‘decode.php’.
45
Un altro esempio
<html>
<!--form2.html-->
<body>
<center><b>Per favore, scegli un giorno per la consegna e il tipo di pagamento</b></center>
<form action=“decode.php” method=“get”>
Qual è il tuo nome?<input type=“text” name=“nome_completo”>
<br>Quale giorno desideri per la consegna?
<select name=“giorno_settimana”>
<option>Lunedì
<option>Martedì
<option>Mercoledì
<option>Giovedì
<option>Venerdì
</select>
<br><br>Come vuoi effettuare il pagamento?<br>
Assegno<input type=“radio” name=“pagamento” value=“assegno” checked>
Carta di credito<input type=“radio” name=“pagamento” value=“carta”>
Contanti<input type=“radio” name=“pagamento” value=“contanti”>
<br><br><br>
<input type=“submit” value=“Inviami ulteriori dettagli!”>
<input type=“reset” value=“Cancella!”>
</form>
</body>
</html>
46
Un altro esempio

Ora costruiamo lo script ‘decode.php’ che elabora il precedente
form, dando come risultato per l’utente la seguente pagina
web:
47
Un altro esempio
<html>
<body>
<?php
#decode.php
echo “Hai inserito le seguenti informazioni…<BR>”;
echo “Il tuo nome è: <b>$_GET[nome_completo]</b>.<br>”;
echo “Vuoi che la consegna avvenga di
<b>$_GET[giorno_settimana]</b>.<br>”;
echo “Il pagamento avverrà tramite $_GET[pagamento]</b>.<br>”;
?>
<br>
<a href=“http://localhost/form2.html”>Torna al form</a>
</body>
</html>
48
Dichiarazione di funzioni: sintassi

Ogni programmatore può creare funzioni personali, che normalmente sono di due
tipi: funzioni in senso “matematico” o funzioni come mezzo per aggiungere nuovi
comandi al linguaggio.

Nella prima accezione, una funzione rappresenta una relazione tra un input e un
output. Nella seconda accezione, una funzione rappresenta un modo per raggruppare
un blocco di istruzioni PHP affinché possano essere richiamate ed eseguite come se
fossero un’unica istruzione.

Sintassi per la dichiarazione di una funzione:
function [nome_funzione]([argomenti]){
[corpo-della-funzione]
}
[nome_funzione]: nome della funzione;
[argomenti]: elenco, eventualmente vuoto, di parametri da fornire alla funzione
separati da virgole;
49
[corpo-della-funzione]: blocco di istruzioni PHP che implementano la funzione stessa.
Dichiarazione di funzioni: esempio

Dichiarazione di una funzione che somma due numeri:
function somma($a,$b){
return $a+$b;
}
Il costrutto ‘return’ viene utilizzato quando una funzione
deve restituire un valore.

Richiamo della funzione ‘somma’:
$risultato=somma(1,1);
Il risultato della funzione somma calcolata sugli argomenti
(1,1) viene assegnato alla variabile $risultato.
50
Dichiarazione di funzioni: variabili
locali e variabili globali

All’interno di una funzione, come si è visto, si possono
naturalmente utilizzare delle variabili.

In questo caso, tuttavia, occorre prestare attenzione alla
distinzione tra variabili locali e variabili globali.

Le variabili locali sono definite all’interno della funzione, e
non sono accessibili al di fuori di essa. Le variabili globali
sono invece definite al suo esterno (nella parte principale
dello script), e si possono utilizzare all’interno di una
funzione premettendo la parola-chiave global.
51
Dichiarazione di funzioni: esempi

Esempio 1:
<?
function prova() {
$numero =3;
……
}
// Qui $numero non è definita!
?>

Esempio 2:
<?
// $numero è una variabile globale
$numero=3;
function prova() {
// Quando dico $numero intendo la variabile globale
global $numero;
echo $numero;
}
?>
52
Dichiarazione di funzioni: il
costrutto ‘global’

Se ci si dimentica di usare il costrutto ‘global’,
l’interprete PHP avrebbe considerato $numero
una variabile locale, e l’avrebbe trovata non
definita.

In alternativa a ‘global’ si può accedere a una
variabile globale tramite l’array associativo
$GLOBALS. La sintassi è la seguente:
$GLOBALS[“numero”]
53
Strutture di controllo

Come in ogni linguaggio di programmazione, le
strutture di controllo servono per controllare il
flusso di esecuzione del programma (o, nel nostro
caso, dello script).

Si possono distinguere due tipologie di strutture
di controllo: quelle condizionali e quelle iterative.
54
Strutture di controllo: strutture
condizionali

Costrutto if: si utilizza quando si vuole che
l’esecuzione di un certo blocco di istruzioni
avvenga o meno in funzione del valore di
un’espressione (la condizione).

Costrutto switch: si utilizza quando ci sono
diversi blocchi di istruzioni e si vuole che, in base
al valore dell’espressione data, venga eseguito
soltanto uno di questi.
55
Strutture di controllo: costrutto ‘if’

Sintassi:
if ([condizione]) {
[blocco istruzioni]
}

Esempio:
if ($b != 0) {
$c = $a / $b;
}

Se si vuole che un altro blocco di istruzioni venga eseguito nel caso in cui la condizione risulti falsa,
si usa il costrutto else. Sintassi:
if ([condizione]) {
[blocco istruzioni 1]
}
else {
[blocco istruzioni 2]
}

Esempio:
if ($colore == “rosso”) {
echo “Il colore è rosso”;
}
else{
echo “Il colore NON è rosso”;
}
56
Strutture di controllo: costrutto
‘switch’

Sintassi:
switch ([espressione] ){
case [valore 1]:
[blocco istruzioni 1];
break;
case [valore 2]:
[blocco istruzioni 2];
break;
……
}

Esempio:
switch($segno){
case 1:
echo “E’ uscito il segno 1!”;
break;
case 2:
echo “E’ uscito il segno 2!”;
break;
default:
echo “E’ uscito il segno X!”;
}

Tramite la parola chiave default si può prevedere un caso che deve essere eseguito se tutti i
controlli precedenti hanno dato esito negativo.
57
Strutture di controllo: strutture
iterative

Costrutto while: si utilizza quando si vuole ripetere l’esecuzione di
un blocco di istruzioni, e il numero di iterazioni dipende dal valore
di una condizione. Dunque ‘while’ è particolarmente utile quando
non si sa a priori quante iterazioni dovranno essere effettuate.


Sintassi:
while([condizione]){
[blocco istruzioni]
}
Esempio:
$contatore=1;
$max=10;
while($contatore <= $max){
echo “Ho contato fino a $contatore <br>”;
$contatore++;
}
58
Strutture di controllo: strutture
iterative

Costrutto for: si utilizza in alternativa a while quando si vuole ripetere
l’esecuzione di un blocco di istruzioni.

Sintassi:
for([espr1]; [espr2]; [espr3]) {
[blocco istruzioni]
}
[espr1]: inizializzazione, espressione da valutare una sola volta;
[espr2]: condizione da valutare;
[espr3]: se espr2 è verificata, si esegue [blocco istruzioni] ed [espr3], per
poi tornare alla valutazione di [espr2].

Esempio:
$max=10;
for ($contatore=1; $contatore<=$max; $contatore++) {
echo “Ho contato fino a $contatore <br>”;
$contatore++;
}
59
Un esempio

Riprendiamo l’esempio che abbiamo chiamato ‘form2’. Per prima cosa, facciamo
una piccola modifica al form html, introducendo la possibilità di scegliere più
giorni della settimana per la consegna (e non uno soltanto). Inoltre chiameremo
‘collect_info.php’ lo script che elaborerà i dati inviati. Chiameremo il nuovo form
‘form_menu.html’.
60
Un esempio
<html>
<!--form_menu.html-->
<body>
<center><b>Per favore, scegli un giorno per la consegna e il tipo di pagamento</b></center>
<form action=“collect_info.php” method=“get”>
Qual è il tuo nome?<input type=“text” name=“nome_completo”>
<br>Quale giorno desideri per la consegna?
<select name=“giorno_settimana[]” multiple>
<option>Lunedì
<option>Martedì
<option>Mercoledì
<option>Giovedì
<option>Venerdì
</select>
<br><br>Come vuoi effettuare il pagamento?<br>
Assegno<input type=“radio” name=“pagamento” value=“assegno” checked>
Carta di credito<input type=“radio” name=“pagamento” value=“carta di credito”>
Contanti<input type=“radio” name=“pagamento” value=“contanti”>
<br><br><br>
<input type=“submit” value=“Inviami ulteriori dettagli!”>
<input type=“reset” value=“Cancella!”>
</form>
</body>
</html>
61
Un esempio

Ora creiamo lo script ‘collect_info.php’ per elaborare i dati inviati col precedente form.
Vogliamo che tale script svolga i seguenti compiti:
•
Se non è stato selezionato alcun giorno di consegna, l’array $_GET[“giorno_settimana”] sarà vuoto
e il browser visualizzerà un messaggio di errore. A tale scopo, si può utilizzare la funzione isset().
•
In caso contrario, il browser mostrerà un messaggio di conferma, come nella figura sottostante. Per
estrarre tutti gli elementi dell’array $_GET[“giorno_settimana”], si userà il costrutto foreach.
62
Un esempio

Funzione isset(): controlla se una variabile è
stata definita (ma non se contiene qualche dato).

Costrutto foreach: foreach($array as
$variabile){…} prende ciascun elemento
dell’array $array e lo inserisce nella variabile
$variabile, mentre qualunque cosa nelle parentesi
graffe è eseguita sull’elemento $variabile.
63
Un esempio
<html>
<body>
<?php
# collect_info.php
$nome_completo = $_GET["nome_completo"];
$pagamento = $_GET["pagamento"];
echo "Grazie $nome_completo.<br>";
echo "Confermiamo i giorni da te indicati per la consegna:";
if (isset($_GET["giorno_settimana"])) {
foreach($_GET["giorno_settimana"] as $valore) {
echo "<br><b>$valore</b>";
}
} else {
echo "<br>Non hai selezionato i giorni per la consegna!";
}
echo "<br>Inoltre, il tuo pagamento sarà tramite $pagamento.";
?>
</body>
</html>
64
Un esempio

Finora abbiamo sempre supposto che l’utente avrebbe inserito le
informazioni richieste negli appositi campi.

Di fatto, spesso l’utente dimentica di inserire qualche dato.

Creiamo allora uno script per la convalida del nostro form. Più
specificamente, vogliamo progettare uno script che controlli che l’utente
abbia inserito il proprio nome e abbia selezionato i giorni per la consegna.
Tale script verrà chiamato ‘check_form.php’: questo nome dovrà essere
sostituito a ‘collect_info.php’ nel form ‘form_menu.html’.

Suggerimenti per lo script:
•
Una stringa vuota si indica con “”.
•
Utilizzare una variabile booleana $errore per gestire le situazioni di errore.
•
Utilizzare la funzione isset(), che ha come unico argomento una variabile e
controlla se tale variabile è stata definita.
65
Un esempio

Questo è ciò che vogliamo ottenere se, ad esempio, l‘utente ha
regolarmente inserito il nome ma non ha selezionato alcun giorno
per la consegna.
66
Un esempio
<html>
<body>
<?php
# check_form.php
$nome_completo = $_GET["nome_completo"];
$pagamento = $_GET["pagamento"];
$errore=false;
if($nome_completo=="") {
$errore=true;
echo "<br>Spiacente, devi inserire il tuo nome.";
} else {
echo "Grazie $nome_completo.<br>";
}
if(!isset($_GET["giorno_settimana"])) {
$errore=true;
echo "<br>Spiacente, devi selezionare almeno un giorno per la consegna.";
} else {
echo "<br>Confermiamo i giorni da te indicati per la consegna:";
foreach($_GET["giorno_settimana"] as $valore) {
echo "<br><b>$valore</b>";
}
}
echo "<br>Il tuo pagamento sarà tramite $pagamento.";
if ($errore) {
echo "<br>Non hai compilato tutti i campi, devi tornare al <a
href=\"form_menu.html\">modulo<a> per la consegna.";
}
?>
</body>
</html>
67
Inclusione di file esterni

A volte c’è la necessità di includere (ed
eseguire) in uno script PHP dei file esterni,
che possono essere tanto semplici
frammenti di codice HTML quanto altri
scripts PHP.

I costrutti che si usano in questi casi sono
require e include.
68
Inclusione di file esterni: costrutti
‘require’ e ‘include’

Per entrambi questi costrutti la sintassi è la seguente:
require “[file]”
include “[file]”

Ad esempio, per inserire in un certo punto del proprio script un’altro script
denominato ‘libreria.php’, si scriverà require “libreria.php” oppure include
“libreria.php”.

Si noti che la sintassi non prevede l’utilizzo di parentesi tonde (non sono funzioni di
PHP, ma più propriamente costrutti del linguaggio).

IMPORTANTE: con ‘require’ e ‘include’, l’interprete PHP analizza il file incluso
ponendosi in modalità HTML. Pertanto, eventuali frammenti di codice PHP, per essere
correttamente riconosciuti ed eseguiti, vanno specificati utilizzando le consuete
marcature per l’inserimento del codice PHP. Una volta terminata l’analisi del file
esterno, l’interprete torna regolarmente in modalità PHP.

Noi useremo i due costrutti ‘require’ e ‘include’ indifferentemente. Per conoscere le
differenze tra i due costrutti, si può consultare un buon manuale di PHP.
69
Inclusione di file esterni: esempio

Supponiamo di voler realizzare un sito in cui in
tutte le pagine compare una barra di navigazione
coi link alle varie sezioni del sito. È improbabile
pensare di inserire manualmente in ogni pagina
un appropriato frammento HTML, se non altro per
evidenti problemi di manutenzione.

Usiamo allora PHP, procedendo come segue.
70
Inclusione di file esterni: esempio
1.
Isoliamo il frammento di HTML corrispondente alla barra
di navigazione, e salviamolo in un file, denominato, ad
esempio, ‘intestazione.html’.
<!-- file intestazione.html === INIZIO -->
<body color=“black” bgcolor=“white”>
<a href=“index.php”>Home page</a>
<a href=“pagina2.php”>Pagina 2</a>
<hr size=“1”>
<!-- file intestazione.html === FINE -->
71
Inclusione di file esterni: esempio
2.
Realizziamo ora le varie pagine del sito. Una volta completata ciascuna pagina, includeremo il
file contenente la barra di navigazione.
<!-- file index.php -->
<html>
<head>
<title>Pagina che include un file esterno</title>
</head>
<? require “intestazione.html” ?>
<h1>Pagina che include un file esterno</h1>
[…contenuto della pagina…]
</body>
</html>
Si noti che nella pagina ‘index.php’ è stato omesso il tag <body>, in quanto già presente nel file
‘intestazione.html’.
72
Una barra di navigazione
“intelligente”

Riprendiamo il precedente esempio della barra di
navigazione per svilupparlo ulteriormente.

Ciò che vogliamo fare ora è costruire una barra di
navigazione in grado di evidenziare automaticamente la
voce corrispondente alla pagina corrente.

Genereremo la nostra barra di navigazione utilizzando uno
script apposito, denominato ‘barra.php’; tale script verrà
richiamato in tutte le pagine in cui vorremo visualizzare la
barra.
73
Una barra di navigazione
“intelligente”

Il primo passo consiste nel costruire una struttura dati
appropriata, nel nostro caso un array associativo, che chiameremo
$links, contenente come elementi i link che vogliamo inserire nella
barra di navigazione. Più specificamente, nell’array associativo
$links, la chiave di un elemento sarà l’indirizzo della pagina web
corrispondente, e il valore una sua breve descrizione.
$links = array( “index.php” => “Home page”,
“pagina2.php” => “Pagina 2”,
“pagina3.php” => “Pagina 3”
);
74
Una barra di navigazione
“intelligente”

Per far sì che venga evidenziata la voce corrispondente alla
pagina corrente, ci sono sostanzialmente due modi:
stabilire di volta in volta quale voce evidenziare, oppure
fare in modo che ciò avvenga in modo automatico.
Quest’ultimo approccio sarà quello che useremo noi.

Confronteremo il nome del file della pagina corrente con
quelli contenuti in $links. Per fare ciò, useremo la variabile
$_SERVER[“PHP_SELF”], che contiene il percorso dello
script PHP corrente. Poiché a noi interessa solo il nome del
file e non l’intero percorso, utilizziamo la funzione
basename() per estrarlo.
75
Una barra di navigazione
“intelligente”

Qui sotto viene specificato il codice PHP per visualizzare una tale barra di
navigazione; come si vede, racchiuderemo ogni link della barra di navigazione tra
parentesi quadre, ad eccezione di quello della pagina corrente, visualizzato in
grassetto e senza collegamento ipertestuale.
<?php
// Nome del file dello script corrente
$pagina_corrente = basename($_SERVER[“PHP_SELF”]);
// Riga orizzontale prima dei links
echo “<hr>\n”;
// Iniziamo a scorrere l’array
foreach ($links as $url=>$desc) {
if ($url == $pagina_corrente) {
echo “<b>$desc</b>”;
} else {
echo “[<a href=\”$url\”>$desc</a>]”;
}
}
// Riga orizzontale dopo i links
echo “<hr>\n”;
?>
76
Una barra di navigazione
“intelligente”

Ora vediamo come inserire la nostra barra di navigazione nelle pagine del sito.
<!-- file index.php -->
<html>
<head>
<title>Barra di navigazione intelligente</title>
</head>
<body>
<? require “barra.php” ?>
<h1>Barra di navigazione intelligente</h1>
<h2>Prima pagina</h2>
<p>Questa è la home page; in alto dovrebbe essere visibile la barra di
navigazione…
</body>
</html>
77
I cookies

I cookies sono un meccanismo tramite il quale delle
applicazioni lato server possono memorizzare e recuperare
informazioni sul client.

In tal modo, ad ogni visitatore viene associato uno ‘stato’.

In PHP, tutte le operazioni di scrittura, modifica o
cancellazione relative ai cookies sono gestite dalla funzione
setcookie().

La funzione setcookie() va necessariamente invocata prima
di inviare alcunché al browser, in quanto i cookies vengono
trasmessi sotto forma di headers HTTP.
78
I cookies: sintassi

La funzione setcookie() ha due argomenti principali, entrambi obbligatori:
il nome da assegnare al cookie e il suo valore.

Es.: per memorizzare nel browser di un utente un cookie di nome
$nomeutente e avente come contenuto la stringa “miosito”, l’istruzione da
utilizzare sarebbe:
setcookie(“nomeutente” , “miosito”);

Ci sono poi altri argomenti opzionali per setcookie(), quali la scadenza del
cookie, il percorso e altri ancora.

Per modificare un cookie occorre richiamare la funzione setcookie() e
modificarne il valore. Per cancellare un cookie si può assegnare ad esso un
valore nullo oppure impostarne la scadenza ad una data passata.

I cookies e il loro contenuto sono disponibili nell’array superglobale
$_COOKIE.
79
I cookies: esempio

Realizziamo una pagina PHP che ci dice la data e l’ora dell’ultimo
accesso del visitatore corrente al nostro sito.

Per fare ciò, definiamo un cookie, denominato “ultimavisita”.

In generale, se vogliamo che rimanga memoria delle informazioni
contenute nel cookie, dobbiamo impostare una scadenza al cookie
stesso. Nel nostro caso, non impostando alcuna scadenza, il
cookie scompare alla chiusura del browser.

Al nostro cookie “ultimavisita” assegneremo il valore ottenuto
invocando la funzione time(), che consiste nel numero di secondi
trascorsi dalla cosiddetta ‘Unix epoch’ (che è il 1 gennaio 1970).
80
I cookies: esempio
<?php
// saluto predefinito
$saluto = “Benvenuto”;
//innanzitutto vediamo se esiste il cookie
if (isset($_COOKIE[“ultimavisita”])) {
$saluto = “Bentornato!”;
}
setcookie(“ultimavisita”, time());
?>
<html>
<head>
<title><? echo $saluto ?></title>
</head>
<body>
<h1><? echo $saluto ?></h1>
<?php
if (isset($_COOKIE[“ultimavisita”])) {
echo “L’ultima volta sei stato qui il “ . date(“d/m/Y”);
echo “alle ore ” . date(“H:i:s”, $_COOKIE[“ultimavisita”]);
//link per cancellare il cookie
echo “<p><a href=\”cancella.php\”>Cancella il cookie</a>”;
} else {
echo “Non sei mai stato qui prima?”;
}
?>
</body>
</html>
81
Le date in PHP

In PHP le date si rappresentano sotto forma di timestamp, vale a dire numeri interi
corrispondenti al numero di secondi trascorsi dalla ‘Unix epoch’. Es.: le ore 0:00:00
del 1 gennaio 2001 corrispondono al timestamp 978303600.

Per passare dalla data al timestamp corrispondente si usa la funzione mktime(). I
parametri vanno passati in quest’ordine: ore minuti secondi mese giorno anno. Es.:
per determinare e visualizzare il precedente timestamp l’istruzione è:
echo mktime(0,0,0,1,1,2001);

Per passare dal timestamp alla data corrispondente si usa la funzione date(). Essa
prevede due argomenti: il primo, obbligatorio, è una stringa che determina come
formattare la data; il secondo, opzionale, è il timestamp da formattare. Se manca il
secondo argomento, date() considererà automaticamente il timestamp corrente.

Alcuni esempi di stringhe per i formati di data:
•
formato gg/mm/aaaa: date(“d/m/Y”);
•
come sopra, ma senza zero davanti a giorni e mesi di una sola cifra: date(“j/n/Y”);
•
se vogliamo visualizzare i giorni trascorsi dall’inizio dell’anno: echo date(“z”);
82
Le date in PHP: funzione
checkdate()

Se vogliamo validare una data (cioè controllare che quella data
effettivamente esista) possiamo usare la funzione checkdate().

Esempio:
//verifichiamo la data 31 aprile 2001
$giorno=31;
$mese=4;
$anno=2001;
echo “La data $giorno/$mese/$anno”;
if (checkdate($mese,$giorno,$anno)) {
echo “è corretta.”;
} else {
echo “non è valida!”;
83
}
Le date in PHP: ancora sui
timestamp

A volte è utile conoscere il timestamp relativo a certe date, ad esempio per poter
confrontare due date o effettuare calcoli aritmetici coinvolgenti due o più date. I due
esempi seguenti dovrebbero rendere più chiara la precedente affermazione.

Esempio 1:
//confronto fra due date
$data1=mktime(0,0,0,1,1,2001);
$data2=mktime(0,0,0,7,29,2001);
echo “La prima data è”;
if ($data1 < $data2) {
echo “precedente”;
} else {
echo “successiva”;
}
echo “alla seconda”;

Esempio 2:
//numero di giorni tra due date arbitrarie
$data1=mktime(0,0,0,1,1,2001);
$data2=mktime(0,0,0,7,29,2001);
echo “Tra le due date ci sono”;
echo ($data2 - $data1)/60*60*24;
echo “giorni”;
84
Un esempio

In questo esempio vogliamo creare un cookie che saluti un visitatore
frequente di una pagina web. Tipicamente, il contenuto di tale cookie sarà
un saluto personalizzato relativo all’utente connesso.

Il primo passo consisterà nella creazione della pagina principale,
denominata ‘main_page.php’, in cui viene mostrato il contenuto del cookie
se questo già esiste (insieme alla possibilità di cambiare il contenuto),
altrimenti viene proposto un link per la sua creazione (e dunque per la
personalizzazione della pagina).

Il secondo passo consisterà invece nella creazione dello script
‘add_user.php’, tramite il quale l’utente può effettivamente inserire i propri
dati per personalizzare la pagina.

Il terzo e ultimo passo consisterà infine nella scrittura dello script
‘set_cookie.php’, tramite il quale i dati inseriti dall’utente verranno gestiti.
85
Un esempio

Risultato di ‘main_page.php’.
86
Un esempio

Risultato di ‘add_user.php’.
87
Un esempio

Risultato di ‘set_cookie.php’.
88
Un esempio: main_page.php
<html>
<body>
<center><h2>La mia pagina</h2></center>
<?php
if (isset($_COOKIE["personale"])) {
echo "Ciao <b>$_COOKIE[personale]</b>";
echo "<br>modifica/cancella le <a
href=\"add_user.php\">impostazioni</a>";
} else {
echo "Vuoi personalizzare la <a href=\"add_user.php\">pagina</a>
di benvenuto?";
}
?>
<h3><center>La pagina web più bella</center></h3>
</body>
89
</html>
Un esempio: add_user.php
<html>
<body>
<center><h2>La mia pagina</h2></center>
<?php
if (isset($_COOKIE["personale"])) {
echo "Elimina il cookie che contiene
<a href=\"set_cookie.php\">$_COOKIE[personale]</a><br>";
echo "o inserisci un nuovo messaggio per sostituire quello
precedente<br><br>";
}
?>
Inserisci il tuo nome o un messaggio per personalizzare la pagina
principale di benvenuto
<form action="set_cookie.php" method=GET>
<br><b>Nome/Messaggio:</b> <input type="text" name="nome">
<br><br>
<input type="submit" value="Imposta il cookie!">
<input type="reset" value="Cancella!">
</form>
</body>
</html>
90
Un esempio: set_cookie.php
<?php
if (!isset($_GET["nome"])) {
setcookie("personale","",time()-5184000);
} else {
setcookie("personale",$_GET["nome"],time(
)+5184000);
}
echo "Grazie, puoi tornare alla <a
href=\"main_page.php\">pagina</a>
principale";
?>
91
PHP e MySQL: cos’è MySQL

MySQL è un Data Base Management System, cioè un
software per la gestione di basi di dati. Si tratta di un
sistema molto diffuso e utilizzato, viste le ottime prestazioni
e nonostante non possieda molte caratteristiche avanzate.

Noi cercheremo di imparare come si fa, a partire da uno
script PHP, a collegarsi a un server MySQL e quindi ad
eseguire operazioni sui database usando il linguaggio SQL.

Non impareremo in questo corso a usare MySQL, anche
perché dovrebbe essere già noto… Dunque si assumerà una
conoscenza di base di MySQL, nonché che il programma sia
92
correttamente installato.
PHP e MySQL: accesso a un
database MySQL

L’accesso a un database MySQL avviene tramite autenticazione.

Ciò che serve sono le informazioni seguenti:
• nome dell’host su cui è in esecuzione MySQL;
• nome del nostro database;
• nostro nome utente;
• password relativa, fornita dall’amministratore di sistema.

Tali parametri possono essere salvati in apposite variabili.
Esempio:
• $dbhost=“localhost”;
• $dbname=“dbprova”;
• $dbuser=“luca”;
• $dbpass=“secret”;
93
PHP e MySQL: funzione
mysql_connect()

Per instaurare la connessione col server MySQL si usa la funzione
mysql_connect(). I parametri necessari a tale funzione sono,
nell’ordine, nome dell’host, nome utente e password.

Esempio:
$conn=mysql_connect($dbhost,$dbuser,$dbpass)
or die(“Impossibile collegarsi al server MySQL.”);

La funzione mysql_connect() restituisce un valore, memorizzato
nella variabile $conn, che serve da identificativo della connessione
stabilita. Se la connessione non è possibile, la funzione restituisce
un valore nullo e viene visualizzato un messaggio di errore che
comunica all’utente l’impossibilità della connessione.
94
PHP e MySQL: funzione
mysql_select_db()

Successivamente occorre scegliere il database con cui lavorare;
ciò si può fare con la funzione mysql_select_db(). A tale funzione
va fornito obbligatoriamente il nome del database, e
opzionalmente l’identificativo della connessione (nel senso che, se
tale identificativo non viene indicato, viene utilizzata di default
l’ultima connessione aperta).

Esempio:
mysql_select_db($dbname,$conn)
or die(“Impossibile selezionare il database $dbname.”);

Come prima, se la funzione restituisce un valore nullo, viene
visualizzato un messaggio di errore per l’utente.
95
PHP e MySQL: comandi SQL

Ora è il momento di capire come funziona l’interazione con
MySQL. Siccome tale interazione avviene tramite il
linguaggio SQL, ripassiamo alcuni dei comandi di tale
linguaggio.

Naturalmente, questo non è un corso di MySQL, dunque
l’unica cosa che faremo in questo ripasso sarà di rivedere
alcune delle cose già a voi note. In particolare, vedremo
unicamente come accedere e utilizzare MySQL su una
piattaforma Linux.
96
PHP e MySQL: comandi SQL

Per accedere a MySQL da Linux è sufficiente digitare ‘mysql’
nella riga di comando.

Da questo momento, la riga di comando avrà l’aspetto
seguente:
mysql >

Eventualmente, si può accedere direttamente a un
database (se già ne abbiamo creato almeno uno) digitando
‘mysql nome_database’.

Per uscire da MySQL, basta digitare ‘exit’.
97
PHP e MySQL: comandi SQL

Una volta entrati in MySQL, per creare un database si usa il
costrutto CREATE DATABASE. Esempio:
msyql > CREATE DATABASE test_db;

Per entrare in un database già creato, come appena visto, si può
agire direttamente dalla linea di comando al momento dell’accesso
a MySQL.

O, invece, dopo l’accesso, si utilizza USE:
mysql > USE test_db;

Nota: in MySQL si possono usare indifferentemente maiuscole e
minuscole, ma è considerato buona norma usare le lettere
maiuscole per i comandi di MySQL e quelle minuscole per i nomi
definiti dall’utente.
98
PHP e MySQL: comandi SQL

Una volta entrati in un database, per creare una tabella si utilizza l’espressione
CREATE TABLE. Dopodichè, racchiusa tra parentesi tonde, si inserisce la struttura
della tabella che si intende definire, inserendo i nomi delle colonne e i tipi di dati da
inserire in ciascuna colonna. Nell’esempio che segue è specificata l’esatta sintassi da
usare:
mysql > CREATE TABLE personale (
->
->
->
->
->
->

nome VARCHAR(20),
indirizzo VARCHAR(30),
città VARCHAR(20),
nazione VARCHAR(20),
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID));
Per visualizzare la struttura di una tabella già creata si usa DESCRIBE. Esempio:
mysql > DESCRIBE personale;
99
PHP e MySQL: comandi SQL

Per inserire informazioni in una tabella ci sono due possibilità:
•
Se si vogliono inserire parecchi dati in una volta sola, conviene scrivere i dati da
inserire in un file di testo, ad esempio nome_file.txt, separando i contenuti da
immettere nei vari campi con dei caratteri di tabulazione; fatto questo, si
possono trasferire i contenuti del file nella tabella con l’espressione LOAD DATA
nel modo seguente:
mysql > LOAD DATA INFILE nome_file.txt INTO TABLE nome_tabella;
•
Se invece si intende inserire un singolo record, conviene usare l’espressione
INSERT. Ad esempio, nel caso della tabella ‘personale’ definita precedentemente,
si potrebbe procedere come segue:
mysql >INSERT INTO personale [(nome,indirizzo, città, paese)]
->
->
->
->
VALUES (‘nome_1’,
‘indirizzo_1’,
‘città_1’,
‘nazione_1’, ‘ ’);
100
PHP e MySQL: comandi SQL

Per cercare dati all’interno di una tabella, si usa l’espressione SELECT. Il
formato di base di tale espressione è il seguente:
SELECT colonna_1, colonna_2, …
FROM nome_tabella;

Nella scelta delle colonne si può usare anche il carattere jolly *.
L’espressione ‘SELECT * FROM personale’ estrae tutte le colonne dalla
tabella ‘personale’.

Per scegliere all’interno delle colonne che si desiderano investigare
soltanto alcuni record, si utilizza l’espressione WHERE, eventualmente in
combinazione con gli operatori booleani, quali AND, OR. Esempio:
mysql > SELECT nome, nazione FROM personale
-> WHERE nome=“nome_scelto” AND nazione=“nazione_scelta”;
101
PHP e MySQL: funzione
mysql_query()

Dopo questo breve ripasso possiamo tornare ad occuparci di PHP. Come già preannunciato,
vogliamo vedere ora come funziona l’interazione fra PHP e MySQL.

Innanzitutto, vediamo come fare a creare una tabella di un database all’interno di uno script PHP.
Più precisamente, nell’esempio che segue costruiremo una semplice rubrica telefonica.

La prima cosa da fare è definire una variabile contenente l’espressione scritta in sql per impostare
la nostra tabella:
$sql=“CREATE TABLE rubrica (”
. “nome VARCHAR(40), cognome VARCHAR(40), telefono VARCHAR(20),”
. “ID INT NOT NULL AUTO_INCREMENT,”
. “PRIMARY KEY (ID))”;

Successivamente, per eseguire effettivamente il comando sql, occorre utilizzare la funzione
mysql_query():
$res=mysql_query($sql,$conn)
or die(“Errore:” . mysql_error());

In caso di errori relativi alla query, viene restituito un messaggio di errore, nel quale la funzione
mysql_error() inserisce anche una descrizione del tipo di errore che si è verificato.

In maniera del tutto analoga si procede per inserire dati in una tabella. Per esercizio, provate ora a
102
scrivere il codice PHP per inserire i nominativi che preferite nella rubrica appena definita.
PHP e MySQL: funzione
mysql_fetch_row()

È invece lievemente diverso il caso di un’interrogazione del database. In
questa situazione, infatti, c’è un risultato da prelevare e visualizzare. Una
possibile funzione PHP da utilizzare a tale scopo è mysql_fetch_row():
$sql=“SELECT telefono FROM rubrica”
. “WHERE nome=‘Luca’ AND cognome=‘Ferrari’ ”;
$res=mysql_query($sql,$conn)
or die(“Errore:” . mysql_error());
$info=mysql_fetch_row($res);
echo “Il mio numero di telefono è ” . $info[0];

Come si vede bene dall’esempio, la funzione mysql_fetch_row recupera i
risultati dell’espressione sql in oggetto (nel nostro caso quella contenuta in
$res) e li inserisce in un array.

L’ultima riga di comando visualizza il numero di telefono dei record
recuperati, che è l’elemento di posto 0 (l’unico!) dell’array $info.
103
PHP e MySQL: funzione
mysql_close()

Per chiudere la connessione col server MySQL si
può utilizzare la funzione mysql_close() con la
sintassi ‘mysql_close($conn)’. Non è comunque
un passo necessario, in quanto tutte le
connessioni rimaste aperte al termine dello script
vengono chiuse automaticamente.
104
Le sessioni: oltre i cookies

Come abbiamo visto in precedenza, i cookies servono per
mantenere uno stato, memorizzando e recuperando informazioni
sul client.

Tuttavia, il meccanismo dei cookies presenta diverse limitazioni
intrinseche.

Ad esempio, il client ha la possibilità di disabilitare i cookies,
mentre noi vorremmo poter mantenere uno stato anche in questo
caso.

Le sessioni servono anche a questo scopo. Le sessioni sono state
introdotte a partire dalla versione 4 di PHP. Se si utilizzano
versioni precedenti, è necessario ricorrere ad apposite librerie.
105
Le sessioni: cos’è una sessione

Una sessione è molto simile a un cookie, con la differenza
che nelle sessioni tutto il lavoro di gestione è svolto
internamente da PHP.

Quando un utente visita una pagina, gli viene
automaticamente assegnato un identificatore univoco che
permette l’associazione fra client e relativa sessione.

Le sessioni sono comunque un sistema ancora abbastanza
recente, e in effetti molte persone si affidano ancora al
metodo dei cookies per la memorizzazione degli stati.
106
Le sessioni: funzione
session_start( )

Per dare inizio ad una sessione in PHP si usa la funzione session_start( ). La stessa
funzione viene anche usata per ripristinare una sessione creata in precedenza.

Come nel caso della funzione setcookie(), questa funzione va invocata all’inizio degli
script. Essa di fatto crea un cookie, sostituendo il lavoro del programmatore, e
assegna un identificatore univoco al browser chiamante. Tale identificatore può
essere reperito utilizzando la funzione session_id().

Alla chiusura del browser la sessione scade.

Esempio:
<?php
session_start();
echo “<html>”;
echo “<body>”;
echo “Ecco l’ID della tua sessione:”.session_id();
echo “</body>”;
echo “</html>”;
?>
107
Le sessioni: l’array associativo
$_SESSION

Le variabili delle sessioni sono registrate con l’array associativo
$_SESSION.

Se, ad esempio, dopo aver iniziato una sessione col comando
session_start(), si inseriscono le righe
‘$_SESSION[“nome”]=“Luca”;’ e
‘$_SESSION[“cognome”]=“Ferrari”;’, vengono create le due
variabili di sessione ‘nome’ e ‘cognome’ e vengono loro assegnati i
valori, rispettivamente, ‘Luca’ e ‘Ferrari’.

Quando si esegue lo script, nella cartella dei file temporanei c’è il
file creato dalla sessione, il quale contiene, fra le altre cose, le
informazioni ‘nome=“Luca”’ e ‘cognome=“Ferrari”’.
108
Le sessioni: funzione
session_destroy( )

Se, al termine di uno script, si desidera distruggere tutti i
dati relativi alla sessione impostata all’inizio, è sufficiente
usare la funzione session_destroy( ), che non necessita di
alcun parametro.

Se invece si vuole semplicemente eliminare una ben precisa
variabile di sessione, la funzione da utilizzare è
session_unregister( ), con la sintassi
‘session_unregister(nome_variabile)’. Invece, con
session_unset( ) potete eliminare tutte le variabili di
sessione.
109
Il carrello della spesa

A conclusione di quanto fatto in questa parte del corso su PHP, cercheremo
di progettare un applicazione del tipo “Carrello della spesa”, grazie alla
quale potremo acquistare materiale on-line. Questo esempio è tratto dal
libro di Tansley.

I requisiti dell’applicazione che vogliamo creare sono i seguenti:
•
Possibilità di connessione tra utente (browser) e un database, all’interno del
quale l’utente può scegliere i prodotti che gli interessano;
•
l’utente deve poter selezionare i prodotti e successivamente poter decidere di
acquistarli; dev’essere possibile anche tracciare quali prodotti sono stati inseriti
nel carrello;
•
terminato lo shopping, l’utente deve poter decidere alcuni aspetti quali il tipo di
pagamento.
110
Il carrello della spesa

Idealmente, quest’ultimo argomento dovrebbe avere il carattere
dell’esercitazione. Dunque, sarebbe bello che foste voi a scrivere tutti gli
script che realizzano il carrello della spesa in base alle indicazioni che vi
darò io.

In effetti, tenteremo di fare proprio così! Nei prossimi lucidi cercherò di
spiegarvi dettagliatamente come dev’essere fatta l’applicazione, quali sono
gli script di cui c’è bisogno e cosa deve fare ogni script. Vi mostrerò anche
l’aspetto finale delle pagine web prodotte, e voi cercherete di progettare il
carrello in modo che l’output sia esattamente così.

Questo verrà fatto in laboratorio: vi lascerò un po’ di tempo per ciascuno
script, poi vi farò vedere una possibile soluzione. È chiaro che i vostri
scripts potranno essere diversi da quelli che vi mostrerò io, e tuttavia
funzionare ugualmente bene (anzi, forse meglio…!).
111
Il carrello della spesa

La prima cosa da fare è costruire una tabella (usando naturalmente
MySQL) che contenga le informazioni sugli articoli ordinati.

La tabella che creeremo conterrà le seguenti colonne:
•
articolo: contiene l’articolo inserito nel carrello;
•
qta: contiene la quantità inserita nel carrello;
•
ID_ordine: contiene un ID d’ordine/transazione (chiamato $ID_trans) che
identifica univocamente gli articoli ordinati da un singolo utente;
•

ID: ID auto-incrementante.
Il valore contenuto nella colonna ID_ordine viene ottenuto utilizzando un
generatore casuale all’inizio della sessione principale e viene assegnato
alla variabile $ID_trans durante l’intera sessione. A ogni registrazione di
sessione questo valore sarà univoco: se un altro utente utilizza
l’applicazione, possiederà un diverso ID di sessione, dunque $ID_trans
conterrà un valore differente.
112
Il carrello della spesa

La tabella la creiamo assieme. Innanzitutto creiamo il database test_ordini:
mysql> CREATE DATABASE ordini;

Dopodichè selezioniamo il database appena creato:
mysql> USE ordini;

Infine creiamo la tabella righe_ordini per memorizzare gli articoli ordinati dagli
utenti:
mysql> CREATE TABLE righe_ordini (
articolo VARCHAR(100),
qta SMALLINT,
ID_ordine VARCHAR(10),
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)
113
Il carrello della spesa

L’insieme degli script che costituiscono l’applicazione è elencato di
seguito:
• c_order.php: la schermata principale dalla quale l’utente può
aggiungere articoli al carrello;
• c_process.php: memorizza l’articolo selezionato in MySQL;
• c_basket.php: mostra il contenuto corrente del carrello dell’utente;
• c_delete.php: elimina dal carrello l’elemento selezionato;
• c_checkout.php: conferma il contenuto del carrello prima di inviare
l’ordine;
• c_mailit.php: una volta confermato l’ordine, questo viene inviato
tramite email;
• c_conn_inc.php: connessioni iniziali a MySQL.
114
Il carrello della spesa:
c_conn_inc.php
<?php
# c_conn_inc.php
$connessione=mysql_pconnect("localhost","root","");
if (!$connessione) {
echo "Impossibile collegarsi al server MySQL!";
exit;
}
$db=mysql_select_db("ordini",$connessione);
if (!$db) {
echo "Impossibile selezionare il database ordini";
exit;
}
?>
115
Il carrello della spesa: c_order.php
<?php
# c_order.php
function generate_tran_ID(){
srand((double)microtime()*1000000);
$numero=rand(1,9999);
return $numero;
}
session_start();
if(!isset($_SESSION["ID_trans"])){
$_SESSION["ID_trans"]=generate_tran_ID();
}
?>
116
Il carrello della spesa: c_order.php
(continua…)
<HTML>
<BODY>
<CENTER><B>Consegne Spa - Ordini cancelleria</B></CENTER>
<CENTER><B>Per favore, imposta il tuo ordine di cancelleria</B></CENTER>
<FORM ACTION="c_process.php" METHOD=GET>
<B>Seleziona un tipo di penna</B><BR>
<SELECT NAME="articolo">
<OPTION>Conf. 10 Penne Blu
<OPTION>Conf. 10 Penne Nere
<OPTION>Conf. 10 Penne Rosse
<OPTION>Conf. 20 Penne Blu
<OPTION>Conf. 20 Penne Nere
</SELECT>
Quantità
<SELECT NAME="qta">
<OPTION>1
<OPTION>2
<OPTION>3
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Aggiungi al carrello">
<INPUT TYPE="RESET" VALUE="Cancella!">
</FORM>
<HR>
117
Il carrello della spesa: c_order.php
(continua…)
<FORM ACTION="c_process.php" METHOD=GET >
<B>Seleziona un tipo di blocco appunti</B><BR>
<SELECT NAME="articolo">
<OPTION>Conf 10 Blocchi Appunti Reporter
<OPTION>Conf 10 Blocchi Appunti A4 Righe
<OPTION>Conf 20 Blocchi Appunti A4 Righe
<OPTION>Conf 10 Blocchi Appunti A4
</SELECT>
Quantità
<SELECT NAME="qta">
<OPTION>1
<OPTION>2
<OPTION>3
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Aggiungi al carrello">
<INPUT TYPE="RESET" VALUE="Cancella!">
</FORM>
<HR>
118
Il carrello della spesa: c_order.php
(continua…)
<FORM ACTION="c_process.php" METHOD=GET>
<B>Seleziona un tipo di busta</B><BR>
<SELECT NAME="articolo">
<OPTION>Conf. 20 Buste A2 Marroni
<OPTION>Conf. 10 Buste A4 Marroni
<OPTION>Conf. 10 Buste A4 Bianche
<OPTION>Conf. 10 Buste A4 Bianche Finestra
</SELECT>
Quantità
<SELECT NAME="qta">
<OPTION>1
<OPTION>2
<OPTION>3
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Aggiungi al carrello">
<INPUT TYPE="RESET" VALUE="Cancella!">
</FORM>
<HR>
<FORM ACTION="c_basket.php" METHOD=GET>
<INPUT TYPE="SUBMIT" VALUE="Visualizza il carrello">
</FORM>
<FORM ACTION="c_checkout.php" METHOD=GET>
<INPUT TYPE="SUBMIT" VALUE="Procedi con l'ordine">
</FORM>
</BODY>
</HTML>
119
Il carrello della spesa:
c_process.php
<?php
# c_process.php
# include file
include ("c_conn_inc.php");
if (( $_GET["qta"] == "" ) || (
$_GET["articolo"] == "" )) {
header( "Location: c_order.php" );
exit;
}
session_start();
120
Il carrello della spesa:
c_process.php (continua…)
echo "<HTML>";
echo "<BODY>";
echo "<CENTER><B>Consegne Spa - Ordini cancelleria</B></CENTER>";
$sql="INSERT INTO righe_ordini (ID_ordine,articolo,qta) VALUES
('$_SESSION[ID_trans]','$_GET[articolo]','$_GET[qta]')";
if (!mysql_query($sql,$connessione)) {
echo "Errore, impossibile aggiungere l'articolo... Controlla MySQL";
echo "<BR>Ritorna agli <A HREF=\"c_order.php\"> ordini cancelleria</A>";
exit;
} else {
echo "Tabella aggiornata [".mysql_affected_rows()."] articolo/i aggiunto/i<BR>";
echo "<B>Articoli inseriti nel carrello...</B><BR>";
echo "$_GET[articolo] in quantità $_GET[qta]";
echo "<BR>Ritorna agli <A HREF=\"c_order.php\"> ordini cancelleria</A>";
echo "<BR>Controlla il tuo <A HREF=\"c_basket.php\"> carrello della spesa</A>";
# recupera il numero di articoli ordinati
$sql="SELECT * FROM righe_ordini WHERE ID_ordine='$_SESSION[ID_trans]'";
$risultati_mysql=mysql_query($sql,$connessione);
$articoli_ordinati=@mysql_num_rows($risultati_mysql);
echo "<CENTER><B>Numero totale di articoli nel carrello: $articoli_ordinati</B><CENTER>";
}
mysql_close($connessione)
?>
</BODY>
</HTML>
121
Il carrello della spesa:
c_basket.php
<?php
# c_basket.php
# include file
include ("c_conn_inc.php");
session_start();
echo "<HTML>";
echo "<BODY>";
echo "<CENTER><B>Consegne Spa - Ordini cancelleria</B></CENTER>";
$sql="SELECT * FROM righe_ordini WHERE ID_ordine='$_SESSION[ID_trans]'";
# recupera il numero totale di articoli ordinati
$risultati_mysql=mysql_query($sql,$connessione);
$num_righe=@mysql_num_rows($risultati_mysql);
if ( $num_righe == 0 ) {
echo "Il carrello della spesa è vuoto al momento.";
echo "Non hai inserito alcun articolo";
echo "<BR>Ritorna alla pagina degli <A HREF=\"c_order.php\"> ordini</A>";
exit;
} else {
# abbiamo dei record
echo "<B>Ecco il tuo carrello della spesa</B><BR>";
122
Il carrello della spesa:
c_basket.php (continua…)
echo "<TABLE ALIGN=\"CENTER\" BORDER=\"2\">";
echo "<TR><TH>ID
Ordine/Transazione</TH><TH>Articolo</TH><TH>Quantità</TH><TH>ID</TH></TR>";
while ($riga=mysql_fetch_array($risultati_mysql))
{
# mostra i risultati
$ID=$riga["ID"];
$ID_trans=$riga["ID_ordine"];
$articolo=$riga["articolo"];
$qta=$riga["qta"];
echo
"<TR><TD>$ID_trans</TD></TD><TD><B>$articolo</B></TD><TD><B>$qta</B></TD><T
D><A HREF=\"c_delete.php?elimina_tutto=no&id_riga=$ID\">$ID</A></TD></TR>";
}
} # fine dell'else
?>
</TABLE>
Ritorna alla pagina degli <A HREF="c_order.php"> ordini</A><BR>
Fai clic su di un articolo per eliminarlo
<?php
echo "<CENTER><B>Numero totale articoli ordinati: $num_righe</B><CENTER>";
mysql_close($connessione);
echo "Elimina l'intero <A HREF=\"c_delete.php?elimina_tutto=si\">ordine </A><BR>";
?>
</BODY>
</HTML>
123
Il carrello della spesa: c_delete.php
<?php
# c_delete.php
# include file
include ("c_conn_inc.php");
session_start();
echo "<HTML>";
echo "<BODY>";
echo "<CENTER><B>Consegne Spa - Eliminazione di un articolo dal
carrello</B></CENTER>";
if ($_GET["elimina_tutto"]=="si") {
echo "Tutti i record con ID Ordine/Transazione $_SESSION[ID_trans] verranno eliminati";
session_unset();
session_destroy();
echo "<BR>Il tuo ordine è stato annullato!<br>";
echo "Torna alla <a href=\"c_order.php\">pagina principale</a>.";
mysql_close($connessione);
exit;
} # fine elimina_tutto
if(isset($_GET["id_riga"])){
echo "Il record con ID $_GET[id_riga] verrà eliminato!<BR>";
124
Il carrello della spesa: c_delete.php
(continua…)
$sql="DELETE FROM righe_ordini WHERE ID='$_GET[id_riga]'";
if (!mysql_query($sql,$connessione)) {
echo "Errore, impossibile eliminare il record con ID
$_GET[id_riga]<BR>";
echo "Ritorna alla pagina degli <A HREF=\"c_order.php\">
ordini</A>";
exit;
} else {
# eliminazione OK, informa l'utente
echo "Tabella aggiornata [".mysql_affected_rows()."] record
eliminati<BR>";
echo "L'articolo è stato eliminato dal tuo carrello<BR>";
echo "Ritorna al <A HREF=\"c_basket.php\"> carrello</A>";
} # query di eliminazione OK
}
mysql_close($connessione);
?>
</BODY>
</HTML>
125
Il carrello della spesa:
c_checkout.php
<?php
# c_checkout.php
# include file
include ("c_conn_inc.php");
session_start();
echo "<HTML>";
echo "<BODY>";
echo "<CENTER><B>Consegne Spa - Ordini cancelleria</B></CENTER>";
echo "<FORM ACTION=\"c_mailit.php\" METHOD=GET>";
echo "<B>Per favore, seleziona il tuo dipartimento</B><BR>";
echo "<SELECT NAME=\"dipartimento\">";
echo "<OPTION>Paghe";
echo "<OPTION>Trasporti";
echo "<OPTION>Information Technology";
echo "<OPTION>Business";
echo "<OPTION>Vendite";
echo "<OPTION>Percorsi";
echo "<OPTION>Conducenti";
echo "</SELECT>";
126
Il carrello della spesa:
c_checkout.php (continua…)
$sql="SELECT * FROM righe_ordini WHERE ID_ordine='$_SESSION[ID_trans]'";
$risultati_mysql=mysql_query($sql,$connessione);
$num_righe=@mysql_num_rows($risultati_mysql);
if ( $num_righe == 0 ) {
echo "<BR>Il carrello della spesa è vuoto al momento.";
echo "Non hai inserito alcun articolo. Non puoi procedere con l'ordine!";
echo "Ritorna alla pagina degli <A HREF=\"c_order.php\"> ordini</A>";
exit;
} else {
# abbiamo dei record
echo "<BR><B>Ecco il tuo carrello della spesa....</B><BR>";
echo "<TABLE ALIGN=\"CENTER\" BORDER=\"2\">";
echo "<TR><TH>Articolo</TH><TH>Quantità</TH></TR>";
while ($riga=mysql_fetch_array($risultati_mysql))
{
# mostra i risultati
$ID=$riga["ID"];
$ID_trans=$riga["ID_ordine"];
$articolo=$riga["articolo"];
$qta=$riga["qta"];
echo "<TR><TD><B>$articolo</B></TD><TD><B>$qta</B></TD></TR>";
}
} # fine dell'else
?>
</TABLE>
127
Il carrello della spesa:
c_checkout.php (continua…)
<CENTER><INPUT TYPE="SUBMIT"
VALUE="Invia!"></CENTER>
</FORM>
<?php
echo "Se sei soddisfatto di questo ordine, fai clic sul
pulsante d'invio in maniera tale da
inoltrarlo.<BR>Per modificare l'ordine, ritorna
alla pagina degli <A HREF=\"c_order.php\">
ordini</A>";
mysql_close($connessione);
?>
</BODY>
</HTML>
128
Il carrello della spesa: c_mailit.php
<?php
# c_mailit.php
session_start();
$destinatario="[email protected]";
$email_mittente="admin@localhost";
$oggetto="Ordine cancelleria interno";
$info="E' stato inviato un ordine. Gli articoli sono stati ordinati dal
dipartimento $_GET[dipartimento].
L'ID ordine/transazione è $_SESSION[ID_trans]. La tabella è righe_ordini.";
mail($destinatario,$oggetto,$info);
echo "Grazie per il tuo ordine. L'addebito verrà caricato sul tuo dipartimento!
Per tua informazione, l'ID ordine/transazione è
$_SESSION[ID_trans].<BR>Spero tu abbia concordato quest'ordine con il
tuo capo.";
session_unset();
session_destroy();
?>
129