| Tratto dal sito http://www.manuali.it
Scritto da: Luca Balzerani - Studente di Informatica, è fondatore e presidente di un noto sito dedicato alla programmazione server-side ed al backend in generale - Collaboratore di Punto Informatico |
Corso PHP/ Lezione 1: "Ciao mondo!"
Un'introduzione al linguaggio
PHP è un linguaggio di programmazione che
consente di realizzare in modo semplice e rapido pagine web dinamiche, cioè
pagine il cui contenuto viene generato (dinamicamente) nel momento in cui queste
vengono richieste al web server.
Uno script PHP è semplicemente una pagina HTML all'interno della quale viene
inserito il codice, cioè le istruzioni che costituiscono il programma. Per
questo motivo PHP viene descritto come un linguaggio "HTML-embedded".
Il codice PHP viene eseguito sul server prima che la pagina venga inviata al
browser (il "client"); il client, quindi, vedrà solo il risultato
(cioè l'output) del programma PHP.
Nello scenario della programmazione per il web, PHP si candida ad eccellente
alternativa rispetto a linguaggi come Perl e Python ed a tecnologie quali
Microsoft ASP.
In questo corso proporremo un
approccio a PHP di tipo pratico ed incrementale: tutte le nozioni verranno
presentate tramite esempi di difficoltà via via crescente, accompagnati da
spiegazioni e commenti.
Il primo esempio che vedremo sarà, inevitabilmente, il classico messaggio di
saluto "Ciao mondo" e ci servirà per mostrare la sintassi da
utilizzare per includere codice PHP in una pagina web. Ecco il nostro sorgente:
<html>
<head><title>Esempio 1</title></head>
<body>
<?php
echo "<h1>Ciao mondo!</h1>";
?>
</body>
</html>
Come si vede, si tratta di una normale pagina HTML in cui compaiono speciali
marcatori che denotano l'inizio e la fine di un blocco di istruzioni PHP.
Nell'esempio mostrato viene utilizzata la sintassi "classica":
l'inizio del codice viene contrassegnato con <?php mentre con ?> se ne
indica la fine.
Il risultato che otterremo, e cioè la pagina che verrà inviata al browser, sarà
il seguente.
<html>
<head><title>Esempio 1</title></head>
<body>
<h1>Ciao mondo!</h1>
</body>
</html>
Si nota immediatamente che non vi è nessuna traccia del codice originario! In
altri termini, il client non ha alcun modo per risalire alle istruzioni PHP che
hanno generato la pagina richiesta.
Tornando alla sintassi per l'immersione di codice nell'HTML, ne esistono altre
varianti; lo stesso blocco di istruzioni del primo esempio può essere scritto,
in modo del tutto equivalente, così (sintassi abbreviata):
<?così
(sintassi in stile Microsoft ASP):
echo "<h1>Ciao mondo!</h1>";
?>
<%
echo "<h1>Ciao mondo!</h1>";
%>
o, ancora, così:
<script language="php">
echo "<h1>Ciao mondo!</h1>";
</script>
Quest'ultima forma può essere particolarmente conveniente se si utilizzano
degli editor HTML visuali (come ad esempio Front Page) che potrebbero non
tollerare gli altri tipi di sintassi.
Per questa prima puntata è tutto: nella prossima passeremo in rassegna le
funzioni fondamentali del linguaggio PHP.
PHPInfo e
echo Le ultime due funzioni che
esaminiamo sono exit() e die(); entrambe producono il risultato di
arrestare l'esecuzione dello script, con la differenza che die() consente
anche di stampare un messaggio. Ad esempio il seguente script...
Nelle prossime lezioni di questo corso si avrà modo di
apprendere i rudimenti del linguaggio PHP; prima di tutto, però, è opportuno
prendere familiarità con alcune funzioni di uso estremamente comune.
La prima funzione di cui ci occupiamo è phpinfo(). Quello che fa è
generare dinamicamente una (lunga) pagina contenente moltissime informazioni
sulla versione di PHP installata e sull'ambiente di esecuzione. Per richiamare phpinfo()
e' sufficiente uno script come il seguente:
<html>
<head><title>phpinfo()</title></head>
<body>
<?php
phpinfo();
?>
</body>
</html>
La pagina web generata da phpinfo() consente di visualizzare la
configurazione della nostra installazione di PHP, di conoscere quali estensioni
sono disponibili e, cosa particolarmente importante per un neofita, di imparare
i nomi delle variabili predefinite che PHP mette a disposizione del
programmatore.
La seconda funzione di cui facciamo la conoscenza è certamente la più
utilizzata in ogni script PHP: echo(). La funzione echo() serve
per scrivere (o stampare) l'output che viene inviato al browser del visitatore
che accede al nostro script. Si consideri il seguente esempio:
<html>
<head><title>echo</title></head>
<body>
<?php
echo "<h1>Benvenuto!</h1>";
?>
</body>
</html>
La pagina che verrà inviata al client, dopo l'elaborazione da parte
dell'interprete PHP, sarà la seguente:
<html>
<head><title>echo</title></head>
<body>
<h1>Benvenuto!</h1>
</body>
</html>
Grazie ad echo() possiamo visualizzare il contenuto di variabili;
nell'esempio seguente viene mostrato, nel messaggio di benvenuto, anche il nome
di dominio del sito su cui lo script viene eseguito (nome contenuto nella
variabile $HTTP_HOST).
<html>
<head><title>echo</title></head>
<body>
<?php
echo "<h1>Benvenuto su $HTTP_HOST!</h1>";
?>
</body>
</html>
Se, ad esempio, lo script viene eseguito sul sito www.latoserver.it, la pagina
risultante sarà...
<html>
<head><title>echo</title></head>
<body>
<h1>Benvenuto su
www.latoserver.it!</h1>
</body>
</html>
A rigore occorre rilevare che echo non è propriamente una funzione bensì
un costrutto del linguaggio; per questo motivo non è necessario, come si è
visto negli esempi, utilizzare le parentesi tonde per racchiudere gli argomenti.
<html>
<head><title>exit</title></head>
<body>
<? exit(); ?>
<p>Questa frase non si vedrà</p>
</body>
</html>
produce questo output:
<html>
<head><title>exit</title></head>
<body>
Le funzioni exit() e die() possono essere utilizzate, quindi, per
gestire eventuali situazioni di errore che non consentono di proseguire
l'esecuzione del nostro script PHP (i cosiddetti "errori fatali"). In
queste circostanze può essere conveniente usare die() per mostrare un
messaggio di errore appropriato.
Vediamo un semplice esempio. Nello script seguente controlliamo il valore della
variabile globale $n e mostriamo un messaggio di errore, bloccando
l'esecuzione del programma, se questo è maggiore di 1.
<html>
<head><title>die</title></head>
<body>
<?
$n = 5;
if ($n > 1) die("<h1>\$n è maggiore di uno!!!</h1>");
?>
<h1>$n è minore
o ugale ad uno!</h1>
</body>
</html>
Il risultato sarà il seguente:
<html>
<head><title>die</title></head>
<body>
<h1>$n è
maggiore di uno!!!</h1>Se, invece, sostituiamo
l'istruzione $n=5 con $n=1 il risultato diventa:
<html>
<head><title>die</title></head>
<body>
<h1>$n è minore
o ugale ad uno!</h1>
</body>
</html>
Nella prossima puntata parleremo di variabili e tipi di dato nel linguaggio PHP.
Le variabili ed i tipi di
dati
In uno script PHP i nomi di variabili sono prefissati dal simbolo $
(dollaro); ad esempio, la seguente istruzione:
$a = $b + $c
assegna ad una variabile di nome a la somma dei valori di altre due
variabili, rispettivamente b e c. Il simbolo = è
l'operatore di assegnamento.
Per creare una variabile è sufficiente assegnarle un valore; in altre parole
non vi è alcuna necessità di dichiararla esplicitamente, come avviene, invece,
in altri linguaggi. Si parla, dunque, di dichiarazione implicita. Se vogliamo
visualizzare nella nostra pagina PHP il valore di una variabile, in modo che
venga mostrata dal browser del visitatore, possiamo usare la funzione echo.
Ad esempio:
// Questa istruzione
visualizza il valore della
// variabile $a
echo $a;
A disposizione del programmatore c'è anche un certo numero di variabili
predefinite, cioè di variabili il cui valore è già impostato. Solitamente
queste variabili contengono informazioni circa l'ambiente di esecuzione dello
script PHP. Esaminiamone alcune di uso frequente.
La variabile $PHP_SELF contiene il percorso dello script in esecuzione;
ad esempio, all'interno dello script PHP raggiungibile all'indirizzo
http://www.latoserver.it/index.php3
il valore della variabile $PHP_SELF sarà /index.php3.
La variabile $HTTP_HOST contiene il nome del server su cui lo script
viene eseguito; nel caso dell'esempio precedente il valore di $HTTP_HOST
sarebbe www.latoserver.it.
Le variabili $HTTP_REMOTE_HOST e $HTTP_REMOTE_ADDR, invece,
forniscono rispettivamente il nome di dominio e l'indirizzo IP del visitatore.
L'elenco completo delle variabili predefinite può essere visualizzato usando la
funzione phpinfo(): si veda, in proposito, la lezione precedente.
Vediamo adesso cosa può contenere una variabile.
Abbiamo parlato di valori, ma a che tipo di valori facciamo riferimento?
Introduciamo dunque i tipi di dato che PHP mette a disposizione del
programmatore.
I tipi di dato supportati da PHP si distinguono in tipi scalari e tipi
compositi: sono tipi scalari i numeri (sia interi che in virgola mobile) e le
stringhe; sono tipi compositi gli array e gli oggetti. A partire dalla versione
4 di PHP, inoltre, è stato introdotto un nuovo tipo scalare: quello booleano.
Una variabile booleana può assumere solo due valori, vero (costante TRUE)
o falso (costante FALSE).
//
$b è una variabile di tipo bool
$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!";
Un array in PHP può corrispondere sia ad un vettore, cioè ad una struttura
dati in cui ogni elemento è individuato da un indice numerico, sia ad una
tabella di hash, cioè (in modo molto semplice) ad una collezione di coppie
nome/valore. In PHP, infatti, tali strutture sono sostanzialmente la stessa
cosa.
Un array può essere creato esplicitamente utilizzando il costrutto array()
oppure implicitamente. Vediamo alcuni esempi.
//
Questo è un array di numeri interi
// Lo creo esplicitamente usando array()
$primi = array( 2, 3, 5, 7, 11 );
// Questo array lo creo implicitamente
$pari[0] = 2;
$pari[1] = 4;
$pari[2] = 6;
// Questa è una tabella di hash
$bookmark["puntoinf"] = "punto-informatico.it"
$bookmark["latoserver"] = "www.latoserver.it"
Per accedere ad un elemento di un array si può utilizzare sia il corrispondente
indice numerico, sia la chiave (se si tratta di una tabella di hash). Ad
esempio:
// Questa istruzione
stampa "7"
// cioe' l'elemento di indice 3 dell'array $primi
echo $primi[3];
// Questa istruzione stampa
"www.latoserver.it"
echo $bookmark["latoserver"];
A differenza di quanto avviene in altri linguaggi di programmazione, un array in
PHP può contenere elementi di tipo diverso. Ad esempio, è perfettamente
legittimo costruire un array che contenga sia numeri interi che stringhe.
// Questo è un array
valido!
// Contiene: un numero intero, una stringa,
// un numero in virgola mobile ed un altro array!
$mix = array( 1, "ciao", 3.14, array( 1, 2, 3 ) );
Il tipo di dato object verrà trattato in una lezione successiva dedicata
alla programmazione orientata agli oggetti con PHP.
Nella prossima puntata parleremo delle form (moduli) HTML e di come utilizzarle
per inviare informazioni ad uno script PHP.
Corso di PHP/ Lezione 4: Gestire i form HTML
<!-- file form.html
-->
...
<form action="/scripts/elabora.php" method="get">
<input type="text" name="campione">
<input type="submit" name="bInvia" value="Invia i
dati">
</form>
La codifica dei dati
Riprendiamo la form dell'esempio precedente e supponiamo di scrivere nella
casella di testo la parola "Schumacher" e di premere il pulsante
"Invia i dati". Il browser si sposterà all'indirizzo
http://www.miosito.tld/scripts/elabora.php?campione=Schumacher
Cosa è successo? Poiché la form dell'esempio usa il metodo GET per trasferire
i propri dati, questi vengono codificati nell'indirizzo dello script a cui
devono essere inviati. Nello script 'elabora.php' adesso troveremo definita una
variabile globale di nome $campione il cui valore è la stringa "Schumacher".
// Nel file
`elabora.php' ...
// Questo stampa "Schumacher"
echo $campione;
A questo punto è utile accennare al modo in cui le informazioni provenienti da
una form HTML vengono codificate per essere trasmesse con il metodo GET.
Partiamo dall'indirizzo URL dello script a cui vogliamo inviare tali dati; ad
esso aggiungiamo (a destra) un punto interrogativo che separerà la URL vera e
propria (a sinistra) dalla `query string' che andiamo a costruire.
La struttura della query string consiste di una serie di coppie nome/valore
separate da una "e" commerciale (&); i caratteri non ammissibili
in un indirizzo URL (ad esempio gli spazi) vengono sostituiti dal simbolo di
percentuale seguito dal corrispondente codice ASCII (in esadecimale).
Adesso che sappiamo come funziona il metodo GET possiamo sfruttarlo per passare
parametri ad uno scrip PHP. Supponiamo di avere uno script di nome `news.php'
che estrae notizie ed articoli da un database; ad esso vogliamo passare un
parametro, chiamiamolo $argomento, che determinerà il tipo di notizie
che ci verranno mostrate. Ad esempio, per ottenere notizie sportive,
invocheremo:
http://www.miosito.tld/news.php?argomento=Sport
In questo caso la codifica manuale della URL era semplice, ma cosa fare se ci
interessano le notizie di `Attualità e Cultura'? Niente paura, esiste una
funzione PHP, urlencode(), che ci permette di codificare una stringa in
una forma ammissibile per una URL. Il frammento di script per creare il link
appropriato sarà:
<?
echo '<a href="http://www.miosito.tld/news.php?argomento=';
echo urlencode("Attualità e Cultura");
echo '">Clicca qui</a>';
?>
E il risultato... scopritelo da voi.
Corso di PHP/ Lezione 5: Dichiarazione di funzioni
function
<nome-funzione> ( <argomenti> ) {
<corpo-della-funzione>
}// Una semplice
funzione//
Dichiarazione
function somma($a, $b) {
return $a + $b;
}// Uso
della funzione 'somma'// Il valore di $risultato è
2
$risultato = somma(1,1);
Variabili
locali e globali
All'interno di una funzione è possibile, naturalmente,
utilizzare delle variabili, anche se in questo caso occorre prestare attenzione
alla distinzione tra variabili globali e variabili locali. Le
variabili globali sono quelle definite all'esterno della funzione (nella parte
principale dello script); viceversa, le variabili locali sono quelle definite al
suo interno.
Le variabili locali ad una funzione non
sono accessibili al di fuori di essa. Ad esempio, supponiamo di aver definito
una funzione "prova" all'interno della quale utilizziamo una variabile
di nome $numero: questa variabile ($numero) non sarà utilizzabile
all'esterno del corpo della funzione.
<?
function prova() {
$numero = 3;
...
}
// Qui $numero
non è definita!
?>
Le variabili globali, invece, sono accessibili anche dall'interno di una
funzione, ma solo se vengono esplicitamente dichiarate come globali, usando la
parola chiave global. Ad esempio:
<?
// $numero e' una variabile globale
$numero = 3;
function
prova() {
// Quando dico $numero
// intendo la variabile globale
global $numero;
echo $numero;
}
?>
Nel precedente frammento di codice, la parola chiave global è stata
utilizzata per indicare che $numero è una variabile globale; in questo
modo $numero è accessibile anche dall'interno della funzione. Cosa
sarebbe successo se avessimo dimenticato di usare global? In questo caso,
illustrato nell'esempio seguente, l'interprete PHP avrebbe considerato $numero
una variabile locale e l'avrebbe trovata "non definita".
<?
// $numero e' una variabile globale
$numero = 3;
function prova() {
// Ho dimenticato global!
// Questa istruzione non
stampa nulla
// perche' $numero viene considerata locale
echo $numero;
}
?>
In alternativa all'uso di global è possibile, dall'interno di una
funzione, accedere ad una variabile globale utilizzando l'array associativo $GLOBALS.
Ad esempio, dall'interno della funzione "prova" si poteva accedere
alla variabile globale $numero, senza usare global, nel modo
seguente:
$GLOBALS["numero"]
Termina qui questa puntata dedicata alle funzioni: alla prossima settimana.
Corso di PHP/ Lezione 6: Costrutti di controllo
// $a e $b sono
due numeri
if ($b != 0) {
// Il divisore e' diverso da zero
$c = $a / $b;
}if (condizione)
blocco-istruzioniif (condizione)
blocco-istruzioni1
else
blocco-istruzioni2// La schedina!
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.";
}switch(espressione)
{
case valore1:
blocco-istruzioni1
case valore2:
blocco-istruzioni2
...
}I costrutti iterativi
while
(condizione)
blocco-istruzioni$contatore = 1;
$max = 10;
while ( $contatore <= $max ) {
echo "Ho contato fino a $contatore <br>";
$contatore++;
}for ( espr1;
espr2; espr3 )
blocco-istruzioni$max = 10;
for ($contatore=1; $contatore<=$max; $contatore++) {
echo "Ho contato fino a $contatore <br>";
}Corso di PHP/ Lezione 7: Inclusione di file esterni
Vediamo subito, allora, quali sono e come si
usano i costrutti di cui stiamo parlando, e cioè require e include.
La loro sintassi è mostrata nell'esempio seguente.
// Questa
istruzione include ed esegue il file
// 'libreria.php3' contenuto nella directory corrente
require "libreria.php3";
// Usando
'include' avrei scritto
include "libreria.php3";
Quello che fanno require ed include è semplicemente leggere il
file specificato dall'argomento (si noti che non è obbligatorio utilizzare le
parentesi tonde), considerandolo parte integrante dello script PHP. Di
conseguenza se il file incluso ("libreria.php3" nell'esempio) contiene
istruzioni PHP, queste verranno regolarmente eseguite.
E' importante osservare, comunque, che nel momento in cui PHP inizia ad
analizzare il file incluso l'interprete si pone in "modalità HTML",
per cui eventuali frammenti di codice PHP, per essere correttamente riconosciuti
ed eseguiti, dovranno essere racchiusi dai consueti demarcatori (si veda la
prima lezione del corso). Terminata l'analisi del file esterno, si torna in
modalità PHP e si continua l'elaborazione dello script principale.
Nella realizzazione di script PHP i costrutti require ed include
vengono spesso utilizzati indifferentemente; d'altra parte, nella maggior parte
dei casi essi sono perfettamente equivalenti ed intercambiabili. Esistono,
tuttavia, delle differenze di cui occorre essere consapevoli per evitare brutte
sorprese. Per l'approfondimento di questo argomento si rimanda ai link in fondo
all'articolo.
Un semplice esempio
Supponiamo di voler realizzare un sito in cui tutte le pagine devono contenere
la classica barra di navigazione con i link alle varie sezioni del sito stesso.
Naturalmente non è ipotizzabile pensare di inserire manualmente un appropriato
frammento di HTML (magari con il "copia e incolla") in tutte le
pagine: la manutenzione diventerebbe presto ingestibile.
Adottiamo allora un sistema diverso, per il quale
ricorreremo a PHP. Per prima cosa isoliamo il frammento di HTML corrispondente
alla barra di navigazione e lo salviamo in un file che chiameremo intestazione.html.
Ecco un esempio di come potrebbe essere un file del genere:
<!--
file intestazione.html === INIZIO -->
<body color="black" bgcolor="white">
<a href="index.php3">Home
page</a> |
<a href="pagina2.php3">Pagina 2</a> |
<hr size="1">
<!--
file intestazione.html === FINE -->
Si noti che abbiamo inserito nel frammento anche il tag BODY con
l'impostazione dei colori della pagina; in questo modo, tutte le pagine
utilizzeranno lo stesso insieme di colori per il testo, lo sfondo, etc.
Realizziamo adesso le varie pagine del sito. Ogni pagina sarà uno script PHP
piuttosto che una pagina HTML statica, per cui dovremo utilizzare una estensione
appropriata per il nome del file, di modo che il web server possa riconoscerla e
farla eseguire dal processore PHP. Nel nostro esempio utilizzeremo l'estensione
più diffusa e cioè .php3.
Per comporre le pagine possiamo utilizzare i nostri strumenti di authoring
preferiti; una volta completata una pagina andremo ad inserire il codice PHP
necessario per includere il file con la barra di navigazione, come mostrato
dall'esempio seguente.
<!--
file index.php3 -->
<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.php3 è stato rimosso il tag BODY
in quanto presente nella barra di navigazione inclusa. In tutte le pagine PHP
costruite in questo modo, l'istruzione
<?
require "intestazione.html" ?>
verrà rimpiazzata dinamicamente dal contenuto del file intestazione.html.
Qualunque modifica apportata a tale file verrà immediatamente riflessa in tutte
le pagine del sito che la includono, rendendone così molto semplice la
manutenzione.
Nella prossima puntata vedremo in dettaglio la realizzazione di una barra di
navigazione "intelligente" per il nostro sito.
Corso di PHP/ Lezione 8: Una barra di navigazione intelligente
La nostra barra di navigazione sarà generata da
uno script PHP separato, che chiameremo barra.php3, e che verrà
richiamato da tutte le pagine in cui vorremo visualizzare la barra.
Cominciamo con il costruire una struttura dati appropriata; nel nostro caso sarà
sufficiente un array associativo (vedi la lezione
n. 3), che chiameremo $links, in cui avremo tanti elementi quanti
sono i link che vogliamo inserire nella barra di navigazione. Ogni elemento
consisterà di una chiave e di un valore: la chiave sarà l'indirizzo della
pagina web corrispondente, il valore una sua breve descrizione. Ecco un esempio
di un siffatto array:
//
Struttura dati: array con link e descrizioni
$links = array( "index.php3" => "Home page",
"pagina2.php3" => "Pagina 2",
"pagina3.php3" => "Pagina 3"
);
In questo modo abbiamo rappresentato, internamente al nostro script, la
struttura della barra di navigazione. Veniamo adesso alla parte
``intelligente'': vogliamo, infatti, che quando la barra di navigazione viene
visualizzata, venga evidenziata la voce corrispondente alla pagina in cui ci
troviamo. Come fa a saperlo? Ci sono sostanzialmente due possibilità: possiamo
essere noi a stabilire di volta in volta quale voce evidenziare oppure, come nel
nostro caso, fare in modo che ciò avvenga in modo automatico.
Nel nostro esempio, quello che facciamo è confrontare il nome del file della
pagina corrente con quelli contenuti nell'array $links: la pagina
corrente è quella per cui il confronto ha esito positivo. Il percorso della
script PHP corrente è contenuto nella variabile globale $PHP_SELF; poiché
nel nostro caso ci interessa soltanto il nome del file piuttosto che l'intero
percorso, utilizziamo la funzione basename per estrarlo, nel modo
seguente:
// Nome del
file dello script corrente
$pagina_corrente = basename($PHP_SELF);
A questo punto non ci resta altro da fare che scrivere il codice PHP necessario
alla visualizzazione della barra di navigazione; si tratta, in realtà, di un
compito molto semplice: dobbiamo scorrere l'array creato precedentemente,
confrontando ogni indirizzo con quello della pagina corrente e, in base
all'esito del confronto, rappresentare la voce in maniera opportuna.
Nel nostro caso, ad esempio, decidiamo di racchiudere ogni link della barra di
navigazione tra parentesi quadre, con la sola eccezione di quello corrispondente
alla pagina corrente, visualizzato in grassetto e senza collegamento
ipertestuale. Vediamo il sorgente.
Il codice sorgente
//
Visualizzazione barra di navigazione// Riga
orizzontale prima dei link
echo "<hr>\n";// Inizio a
scorrere l'array
while (list($url,$desc)=each($links)) {
if ($url==$pagina_corrente) {
// Pagina corrente
echo "<b>$desc</b> ";
} else {
// Altre pagine
echo "[<a href=\"$url\">$desc</a>] ";
}
}// Riga
orizzontale dopo i link
echo "<hr>\n";<!--
Questo e' il file index.php3 -->
<html>
<head>
<title>Barra di navigazione intelligente</title>
</head>
<body><?
require "barra.php3" ?><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>Corso di PHP/ Lezione 10: Le Date
Operazioni semplici
Lavorare con date ed orari è un'operazione non banale, considerata la
particolare struttura dati con cui si ha a che fare. In molte applicazioni,
tuttavia, si ha necessità di manipolare date, confrontarle, validarle e così
via. In questa lezione vedremo in che modo possiamo operare su date ed orari nei
nostri script PHP, ricorrendo ad esempi concreti.
Nel linguaggio PHP le date vengono rappresentate sotto forma di "timestamp":
un timestamp è semplicemente un numero intero che corrisponde al numero di
secondi trascorsi dalla cosiddetta "Unix epoch" (le ore 0:00:00 del
primo gennaio 1970). Ad esempio, le ore 0:00:00 del primo gennaio 2001
corrispondono al timestamp 978303600.
Per conoscere il timestamp corrispondente ad una certa data basta invocare la
funzione mktime() passandole i parametri previsti e cioè, nell'ordine,
ore, minuti, secondi, mese, giorno, anno. Un ulteriore argomento, opzionale,
consente di tener conto dell'ora legale. Vediamo quale istruzione abbiamo
utilizzato per determinare il timestamp mostrato in precedenza.
// Timestamp delle ore 0:00:00
del primo gennaio 2001
echo mktime(0, 0, 0, 1, 1, 2001);
I timestamp, naturalmente, sono poco comprensibili per un essere umano, per cui
vediamo subito in che modo si possano tradurre in una forma "human readable".
PHP ci mette a disposizione, a questo scopo, la funzione date(). Gli
argomenti di date() sono due: il primo, obbligatorio, è una stringa che
rappresenta il formato in cui codificare la data; il secondo, facoltativo, è il
timestamp da formattare. Se quest'ultimo viene omesso, verrà considerato il
timestamp corrente. Vediamo un esempio.
// Questa
istruzione stampa la data corrente nel formato gg/mm/aaaa
echo "Data di oggi " . date("d/m/Y");
Nell'esempio mostrato, la stringa che esprime il formato in cui visualizzare la
data è "d/m/Y". Ognuna delle lettere che vi compaiono corrisponde ad
un elemento della data; nel nostro caso al giorno del mese (01-31), al mese
(01-12) ed all'anno, espresso con quattro cifre. Si consulti la pagina del
manuale PHP relativa alla funzione date() per un elenco completo delle
lettere utilizzabili. Nel frattempo, divertiamoci con altri esempi.
// Come sopra
ma senza lo zero prima di giorni e/o mesi di una sola cifra
echo "Data di oggi " . date("j/n/Y");
L'esempio seguente stampa il numero di giorni trascorsi dall'inizio dell'anno.
echo "Sono trascorsi
".date("z")." giorni dall'inizio dell'anno.";
Riprendiamo l'esempio della data corrente; come possiamo visualizzarla in modo
testuale? Ecco una possibile soluzione.
// Nomi dei
giorni della settimana
$giorni = array( "Dom", "Lun", "Mar", "Mer",
"Gio", "Ven", "Sab" );
echo "Oggi e': " . $giorni[date("w")];
In modo del tutto analogo si può ottenere il nome dei mesi. Per evitare di
chiamare ripetutamente la funzione date() se ne può utilizzare un'altra,
getdate(), che restituisce le informazioni sulla data ed ora correnti in
un array associativo.
Operazioni più
complesse
Fino ad ora abbiamo considerato operazioni estremamente semplici sulle date; nel
seguito mostriamo, invece, come eseguirne altre più evolute. In primo luogo,
vediamo come sia possibile validare una data, cioè accertarsi che si tratti di
una data valida. Per citare qualche esempio sono date non valide il 31 aprile o
il 29 febbraio di un anno non bisestile. La funzione preposta alla verifica di
una data è checkdate().
// Verifichiamo
una 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!";
Supponiamo adesso di voler confrontare due date per verificare se la prima è
antecedente alla seconda. In PHP un modo rapido per risolvere il problema è
quello di convertire entrambe le date nei corrispondenti timestamp e confrontare
quelli.
// Data n° 1:
ancora il primo gennaio 2001
$data1 = mktime(0, 0, 0, 1, 1, 2001, 0);
// Data n° 2:
il 29 luglio 2001
$data2 = mktime(0, 0, 0, 7, 29, 2001, 0);
echo "La
prima data è ";
if ($data1 <
$data2) echo "precedente";
else echo "successiva";
echo "
alla seconda.";
Altrettanto semplicemente si può calcolare il numero di giorni che separa due
date arbitrarie, come mostrato nell'esempio seguente:
// Data n° 1:
ancora il primo gennaio 2001
$data1 = mktime(0, 0, 0, 1, 1, 2001, 0);
// Data n° 2:
il 29 luglio 2001
$data2 = mktime(0, 0, 0, 7, 29, 2001, 0);
echo "Tra
le due date ci sono ";
echo ($data2 - $data1)/(60*60*24);
echo " giorni.";
La differenza tra i due timestamp, espressa in secondi, può essere convertita
in giorni dividendo per 24 ore al giorno, 60 minuti l'ora, 60 secondi al minuto.
L'unica particolarità riguarda l'ultimo parametro fornito a mktime()
impostato a zero, in modo da ignorare l'ora legale.
A questo punto non mi resta che augurarvi buon divertimento con le date e darvi
appuntamento alla prossima lezione.
Corso di PHP/ Lezione 9: I cookies
Ogni utente di Internet ha sentito parlare, una volta o l'altra, dei cookies; l'argomento è tradizionalmente piuttosto controverso, risultando difficile stabilire in modo definitivo se i "biscotti" (questo il significato del termine) siano da considerarsi buoni o cattivi. Cerchiamo di capire, allora, di cosa si tratta.
La definizione originale dei cookies li descrive
come un meccanismo mediante il quale delle applicazioni lato server posso
memorizzare e recuperare informazioni sul lato client (rappresentato dal
browser); in questo modo è possibile associare ad ogni visitatore un
rudimentale "stato". Vediamo adesso come si manipolano i cookies con
il linguaggio PHP.
Tutte le operazioni di scrittura, modifica o cancellazione di cookies in PHP
avvengono mediante una stessa funzione, setcookie(). Tale funzione deve
obbligatoriamente essere invocata prima che qualsiasi contenuto venga inviato al
browser; i cookies, infatti, vengono trasmessi tra client e server sotto forma
di intestazioni (headers) HTTP.
La funzione prevede solo due argomenti obbligatori: il nome da assegnare al
cookie ed il suo valore. Ad esempio, se vogliamo memorizzare nel browser di un
visitatore un cookie, che chiameremo $nomeutente, contenente la stringa
"latoserver", l'istruzione da utilizzare sarà la seguente
// Imposto un
cookie: $nomeutente = "latoserver.it";
setcookie( "nomeutente", "latoserver.it" );
E' possibile specificare anche altri argomenti (facoltativi); nell'ordine
abbiamo: scadenza del cookie, percorso, dominio e secure. Per una
discussione dettagliata si rinvia alla sitografia in fondo alla pagina.
Quando un cookie è stato impostato, il suo valore può essere modificato
richiamando nuovamente la funzione setcookie() ed associando allo stesso
nome il nuovo valore. La cancellazione di un cookie, infine, può avvenire in
due modi: assegnandogli un valore nullo o impostando la scadenza ad una data
passata.
Resta da vedere in quale modo si possano leggere da uno script PHP le
informazioni memorizzate nei cookies; in questo compito siamo molto facilitati,
in quanto l'interprete PHP analizza automaticamente i cookies inviati dal
browser e li rende disponibili in altrettante variabili globali e nell'array
associativo $HTTP_COOKIE_VARS.
Mangiare i biscottini
Il valore assegnato di volta in volta al cookie $ultimavisita
è il risultato della funzione time() e consiste nel numero di secondi
trascorsi dalla cosiddetta "Unix epoch" (primo gennaio 1970).
<?php
// file `saluto.php'
// Il saluto predefinito
$saluto = "Benvenuto!";
// Controllo se esiste il cookie...
if (isset($HTTP_COOKIE_VARS["ultimavisita"])) {
// Cambio il saluto con uno piu' appropriato
$saluto = "Bentornato!";
}
// Imposto il cookie relativo a questa
visita
setcookie( "ultimavisita", time() );
?>
<html>
<head>
<title><? echo $saluto ?></title>
</head>
<body>
<h1><? echo $saluto ?></h1>
<?php
if (isset($HTTP_COOKIE_VARS["ultimavisita"])) {
// Stampo la data dell'ultima visita
echo "L'ultima volta sei stato qui il " . date( "d/m/Y");
echo " alle ore " . date( "H:i:s.", $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>
Lo script cancella.php, richiamabile cliccando sul link "Cancella il
cookie", non fa altro che cancellare il cookie $ultimavisita,
assegnandogli un valore nullo, e dirottare il browser di nuovo alla pagina
precedente.
<?
// file `cancella.php'
setcookie( "ultimavisita", "" );
header( "Location: saluto.php" );
?>
L'esempio proposto, sebbene di improbabile utilità, dovrebbe aver chiarito le
modalità d'impiego dei cookies; pur nella sua semplicità, inoltre, può essere
il punto di partenza per lo sviluppo di funzionalità personalizzate, lasciate
alla vostra fantasia.
Ancora una volta, per questa puntata è tutto. Alla prossima!
Corso di PHP/ Lezione 11: PHP ed il database MySQL
Nel seguito vedremo in che modo è possibile, da
uno script PHP, collegarsi ad un database MySQL ed eseguire operazioni su di
esso tramite il linguaggio SQL. Per una completa comprensione della lezione è
necessaria una conoscenza di base di SQL; assumeremo, inoltre, che MySQL sia
correttamente installato.
L'accesso ad un database MySQL avviene mediante autenticazione; questo vuol dire
che, prima di poter effettuare qualsiasi operazione su di esso, dobbiamo
disporre dei privilegi necessari. In particolare, le informazioni di cui abbiamo
bisogno sono: il nome dell'host su cui è in esecuzione il server MySQL, il nome
del nostro database, il nome utente che ci è stato assegnato e la relativa
password (per averle occorre rivolgersi all'amministratore di sistema).
Supponiamo che i parametri nel nostro caso siano i seguenti:
// Il nome
dell'host (hostname) su cui si trova MySQL
$dbhost = "localhost";
// Il nome del
nostro database
$dbname = "dbprova";
// Il nostro
nome utente (username)
$dbuser = "luca";
// La
nostra password
$dbpass = "secret";
E' opportuno salvare tali parametri in apposite variabili piuttosto che
utilizzarli direttamente nelle chiamate di funzione; in tal modo, infatti,
potremo inserirli in un file separato che includeremo in tutti gli script che
accedono al database.
La prima funzione che utilizziamo è mysql_connect(), che ci servirà per
instaurare la connessione con il server MySQL. I parametri da fornire a tale
funzione sono il nome dell'host, il nome utente e la password. Vediamo un
esempio:
// Funzione
mysql_connect()
$conn = mysql_connect($dbhost,$dbuser,$dbpass)
or die("Impossibile collegarsi al server MySQL.");
Si osservi la sintassi utilizzata nell'esempio precedente; il significato è il
seguente: se la funzione restituisce un valore nullo, situazione che denota
l'impossibilità a collegarsi al server MySQL, viene invocata die() per
arrestare l'esecuzione e visualizzare un messaggio di errore. Inoltre, in una
variabile che abbiamo chiamato $conn salviamo il valore restituito da mysql_connect(),
che servirà da identificativo della connessione stabilita.
Le interrogazioni
Il passo successivo è la selezione del database su cui operare; la funzione da
utilizzare è mysql_select_db(), alla quale occorre fornire il nome del
database e, opzionalmente, l'identificativo della connessione (se non viene
indicata verrà utilizzata l'ultima aperta).
// Funzione mysql_select_db()
mysql_select_db($dbname,$conn)
or die("Impossibile selezionare il database $dbname");
Anche questa volta in caso di insuccesso viene
arrestata l'esecuzione del programma PHP e viene visualizzato un messaggio di
errore appropriato.
Arriviamo così alla parte più importante, quella dell'interazione con la base
di dati, interazione che avverrà mediante il linguaggio SQL. Le funzioni PHP
che utilizzeremo in questa fase sono mysql_query(), per l'esecuzione di
comandi SQL, e mysql_fetch_row(), per prelevare il risultato restituito
da MySQL quando il comando eseguito è un'istruzione SELECT (quindi
un'interrogazione, o query).
Supponiamo di voler creare una tabella del database con cui gestire una
rudimentale rubrica telefonica. Il comando SQL da utilizzare sarà del tipo
CREATE TABLE
rubrica(
Progressivo int PRIMARY KEY AUTO INCREMENT,
Nome varchar(40),
Cognome varchar(40),
Telefono varchar(20))
Per eseguire tale comando dal nostro script PHP, lo inseriamo dapprima in una
stringa, ad esempio nel modo seguente
$sql =
"CREATE TABLE rubrica( "
. "Progressivo int PRIMARY KEY AUTO INCREMENT, "
. " Nome varchar(40), Cognome varchar(40), Telefono varchar(20))";
Passiamo poi all'esecuzione vera e propria, invocando la funzione mysql_query().
// Esegue il
comando SQL o stampa un messaggio di errore
$res = mysql_query($sql,$conn)
or die( "Errore: " . mysql_error() );
Voilà, il gioco è fatto! In caso di errori, comunque, l'istruzione mysql_error()
ci fornisce la descrizione del problema che si è verificato.
Esaminiamo adesso il caso di una interrogazione del database. L'esecuzione del
relativo comando SQL (sarà, naturalmente, una SELECT) è del tutto
analoga al caso già visto. L'unica differenza risiede nel fatto che, in questo
caso, abbiamo un risultato da prelevare. Una delle funzioni che possiamo
utilizzare a tale scopo è mysql_fetch_row().
//
Interroghiamo la nostra rubrica
// Comando SQL
da eseguire
$sql = "SELECT Telefono FROM rubrica "
. "WHERE Nome='Luca' AND Cognome='Balzerani'";
// Esecuzione
comando SQL o messaggio di errore
$res = mysql_query($sql,$conn)
or die( "Errore: " . mysql_error() );
// Estrazione
del risultato
$info = mysql_fetch_row($res);
echo "Il mio numero di telefono è " . $info[0];
Al termine della sessione di lavoro si può invocare la funzione mysql_close()
per chiudere la connessione con il server MySQL. Si tratta, in ogni caso, di un
passo opzionale in quanto tutte le connessioni lasciate aperte verranno chiuse
automaticamente alla fine dello script.
// Funzione
mysql_close()
mysql_close($conn);
Si conclude qui questa lezione dedicata a PHP e MySQL. Nella prossima, che sarà
anche l'ultima del corso, ci occuperemo delle sessioni.
Corso di PHP/ Lezione 12: Le Sessioni
Creare una sessione
Nella lezione dedicata all'uso dei cookies abbiamo visto che essi, consentendoci
di rendere persistenti delle variabili nell'arco di più accessi HTTP, possono
essere sfruttati per il mantenimento di un rudimentale stato. Il meccanismo dei
cookies, tuttavia, presenta delle limitazioni intrinseche che lo rendono
inadatto ad applicazioni complesse. Un esempio per tutti: vogliamo essere in
grado di mantenere uno stato anche nell'eventualità in cui il browser del
visitatore non supporti i cookies (o li abbia disabilitati).
Arriviamo così a parlare di sessioni. Precisiamo subito che il supporto nativo
per le sessioni è stato introdotto nella versione 4 di PHP; se si ha necessità
di gestire le sessioni con la versione precedente sarà necessario ricorrere ad
apposite librerie, come ad esempio le ottime PHPLIB. Cominciamo con l'esaminare
alcune nozioni di base sulle sessioni.
Una sessione, in questo contesto, consiste di una serie di accessi alle nostre
pagine PHP, effettuati in un determinato arco di tempo durante il quale viene
mantenuto uno stato. Ogni sessione è individuata da un identificatore, univoco,
utilizzato per l'associazione tra client e relativa sessione.
Per utilizzare le sessioni in PHP 4 abbiamo bisogno essenzialmente di tre
funzioni, e precisamente: session_start(), session_register() e session_destroy().
La prima funzione, session_start(), viene invocata per creare una nuova
sessione o per ripristinarla, nel caso sia stata creata in precedenza. Questa
funzione tenta anche di impostare, nel browser, un cookie contenente
l'identificativo di sessione, per cui è necessario che venga invocata
all'inizio degli script, esattamente come nel caso della funzione setcookie().
La funzione session_register(), invece, viene utilizzata per registrare
delle variabili come variabili di sessione. Ad esempio, se abbiamo una variabile
$nomeutente e vogliamo renderla persistente per tutta la durata della
sessione, invocheremo session_register() nel modo seguente
//
$nomeutente diventa variabile di sessione
session_register("nomeutente");
Infine, la funzione session_destroy() viene invocata per distruggere i
dati relativi alla sessione, tipicamente al momento del "log out".
Come si vede, quindi, lavorare con le sessioni è piuttosto semplice. L'unico
aspetto critico, al quale il programmatore deve prestare la massima attenzione,
è quello della propagazione del SID, il già citato identificatore di sessione.
Sebbene, infatti, nella maggior parte delle situazioni reali, sarà sufficiente
memorizzare tale valore in un cookie nel browser del visitatore (PHP lo fa
automaticamente), è opportuno gestire anche il caso in cui i cookies non
possano essere utilizzati (perché il browser non li supporta o è stato
configurato per rifiutarli).
In questo "caso pessimo" è il programmatore PHP che deve preoccuparsi
della propagazione del SID, modificando i link tra i vari script che condividono
la sessione e passandolo come parametro. A dispetto di quanto possa sembrare, si
tratta di un'operazione piuttosto semplice: basta includere nei link alle altre
pagine PHP il valore della costante SID, come nell'esempio seguente:
<!--
Un esempio di link che propaga l'identificativo
di sessione senza richiedere cookies
-->
<a href="altroscript.php?<?= SID ?>">Altro script</a>
Un esempio completo
// Attivo (o
ripristino) la sessione
session_start();// 'clicks' e'
una variabile di sessione: devo registrarla
session_register("clicks");// Devo
azzerare?
if ($azzera) {
$clicks = array();
}if ($click) {
$clicks[] = $click;
}if (count($clicks))
{
foreach ($clicks as $colore) { echo "$colore "; }
} else {
echo "(sequenza vuota)";
}