Php
Php in origine, esattamente nel 1994, era stato concepito come un insieme di macro, tese a
facilitare ai programmatori il compito di amministrare le home page; da qui il
nome Personal Home Page.
Col passare degli anni le
capacità di Php sono state aumentate, trasformandolo
da una serie di strumenti di utilità in un linguaggio
di programmazione completo, in grado di amministrare ambienti online basati su
database, così, con l?aumentare delle potenzialità, aumentò anche la popolarità
di Php.
Il successo avuto da
questo linguaggio è dovuto ad una sintassi semplice e
non dissimile dai linguaggi di programmazione più comuni (C++,PERL), ad una
serie di funzioni che consente di interfacciare Php
con un elevato numero di software, ad un linguaggio multipiattaforma
che può interagire con molti web server (nel nostro caso Apache), ma
soprattutto, dal fatto che Php è disponibile con
licenza open source, scaricabile dal sito ?www.php.net?, quindi non richiede costi
per licenze di software commerciali.
Ormai la popolarità di Php è elevatissima nel web, infatti
sono moltissimi i siti dedicati a questo linguaggio: si possono risolvere problemi
grazie a mailing list, manuali e imparare nuove funzioni. In più si vedono
sempre più spesso pagine con estensione php negli URL
(Uniform Resource Locators) anche se alcune di esse,
con estensione html, possono nascondere script php: entrando in un aspetto più pratico che teorico nel
file di configurazione dell?Apache, viene chiesto solitamente di interpretare
le pagine con estensione Php. Ma se si volessero
offrire ai propri utenti pagine Php con estensioni
più familiari come (.html), si potrebbe: così tutti i file con questa estensione verrebbero trattati come
file Php, ma ciò potrebbe comportare un rallentamento
del sito, dato che ogni pagina con estensione html
verrebbe interpretata dal web server anche se non contenente i tag di inizio e fine script.
Ora Php
è conosciuto come l?acronimo di Hypertext Preprocessor.
Si tratta di un
linguaggio script lato server (server-side
HTML-embedded scripting language) utilizzato
specialmente per lo sviluppo Web ed in particolare nella creazione di pagine
dinamiche in un contesto Html
(Hypertext Markup Language): mentre una normale pagina statica in Html è inviata direttamente dal server al client, uno
script in Php è analizzato da un modulo Php
di un server web (anche se in realtà si può configurare come uno script CGI
separato). Ciò non vuol dire che uno script non possa contenere elementi
scritti in Html anzi, tutto il contrario: gli
elementi Html contenuti nello script sono mantenuti
tali, mentre il codice Php viene
interpretato ed eseguito dal web server[1].
Tecnicamente si definisce
un linguaggio interpretato ed in questo esso si
differenzia da altri linguaggi di programmazione, come ad esempio C++ e Java,
il cui codice sorgente, per poter essere eseguito, deve prima essere compilato
(tradotto cioè in codice macchina); gli script Php
non giungono mai al browser ma vengono eseguiti prima per: interrogare i
database, creare immagini, leggere e scrivere file o dialogare con server
remoti infatti, essendo un linguaggio lato server, ha il vantaggio che
all?utente viene inviato solo il risultato dell?esecuzione del programma. E?
sufficiente che il browser dell?utente sia in grado di interpretare il codice
HTML utilizzato.
In parole povere, il Php fornisce un modo per
inserire istruzioni nelle pagine Html per
creare contenuto dinamico, rendendo il codice completamente trasparente all?utente
finale in quanto ciò che verrà visualizzato sarà
codice Html puro: ciò permette di visualizzare
documenti in Internet attraverso un browser che formatta il testo in base ai tag Html e li visualizza nello schermo.
Come per Html, anche i file Php sono semplici documenti di testo perciò, per iniziare a
scrivere uno script, basta avviare il proprio editor preferito[2].
Php richiede che l?interprete venga
informato che si intende mandare in esecuzione i comandi inseriti: quindi prima
di ogni istruzione si devono aggiungere i tag ?<?php? e ??>? all?inizio e alla fine dello script. In caso
contrario, il codice verrà scambiato per semplice Html e visualizzato nel browser.
Una caratteristica è che
l?interprete ignora tutto ciò che si ritrova al di fuori di questi tag, quindi in una stessa pagina Php
si può incorporare Html; inoltre qualsiasi codice di
questo ultimo che va dalla formattazione al testo, dai meta
tags ai link può essere
generato dinamicamente (attraverso le funzioni ?echo?
o ?print? che producono un output nella finestra del
browser) anche se non c?è nessun obbligo di realizzare l?intera pagina con Php.
Il linguaggio presenta
numerose ed interessanti caratteristiche che è utile menzionare. Innanzitutto è
facile da imparare, ha una sintassi molto simile ad altri linguaggi da cui
prende spunto, come il C++, Java ed il Perl[3].
Il Php
è modulare, l'interprete principale può essere esteso realizzando, in
linguaggio C, ulteriori moduli da affiancare a quelli
preesistenti.
La dotazione di moduli
per il PHP è in continua crescita soprattutto per quanto riguarda l'accesso al
database: infatti è possibile l'utilizzo dei
principali database utilizzati su internet (MySQL, mSQL, PostgreSQL) o in azienda (Oracle, Informix, Sybase, Microsoft SQL Server, supporto ODBC).
Il PHP inoltre gestisce
in maniera trasparente i cookie, l'autenticazione
HTTP di utenti, la creazione e manipolazioni di
immagini (attraverso particolari librerie scaricabili gratuitamente da
internet), la gestione dell'upload dei file tramite
il tag ?form enctype?, mette a disposizione la gestione diretta dei socket, fornisce supporto per le espressioni regolari e per
numerosi protocolli (imap, ldap,
smtp, snmp, ftp) utilizzati
su internet.
Infine, a partire dalla versione 4, è arrivato il supporto per le variabili di
sessione.
Un aspetto molto
interessante è la gestione delle variabili (dove il nome è preceduto dal
simbolo ?$?); le variabili del PHP, diversamente dal C, sono molto flessibili e
vengono riconosciute automaticamente.
Il tipo di dato per una
variabile non viene stabilito dal programmatore: esso
viene assegnato a seconda del contesto nel quale viene utilizzata la variabile.
Una variabile può
cambiare il proprio tipo[4] all?interno di un
programma: così una stessa variabile che avevamo
trattato come un intero in un primo momento, dopo può essere trattata come una
stringa. Quindi a differenza di altri linguaggi come
il C++ o il Pascal, in Php
non ha luogo alcuna dichiarazione di variabile[5].
Questa caratteristica
presenta vantaggi e svantaggi. Da un lato è possibile utilizzare le variabili
con una certa flessibilità, d?altra parte, però, è forte il rischio di
confusione, soprattutto alla presenza di script di una certa complessità: può
capitare, infatti, che una variabile finisca per contenere un tipo di dati
totalmente diverso da quello previsto. Attraverso la
funzione ?gettype?, è comunque
sempre possibile individuare il tipo di
variabile con cui si sta trattando oppure, con la tecnica di ?casting?, in cui
si fa precedere una variabile da un tipo di dato inserito tra parentesi, è
possibile creare un valore trasformato nel tipo specificato.
Altre variabili,
conosciute più comunemente come variabili ambientali, sono messe a disposizione
da Php ma vengono fornite
dal server (nel nostro caso Apache).
Utilizzata per il
completamento del progetto, è ?$_SERVER[?QUERY_STRING?]?
che permette di leggere i dati aggiunti all?URL per inserirli nello script.
Esistono poi altre
variabili, definite direttamente dall?interprete Php e quindi disponibili su qualsiasi piattaforma e
indipendentemente dal sever web utilizzato.
Le più importanti tra queste variabili, dette globali, sono:
· ?$_POST? per trasmissioni di tipo POST,
· ?$_GET? per trasmissioni di tipo GET,
· ?$HTTP_SESSION_VARS? per rendere disponibili
determinate variabili tra uno script e l?altro.
Quest?ultime verranno approfondite meglio quando andremo a trattare la
gestione degli input dall?utente riferendoci alle prime due, per la gestione delle sessioni riferendoci a
quella che rimane.
Un elenco di queste variabili si può ottenere
attraverso la funzione ?phpinfo()?: uno strumento di debugging che fornisce informazioni su Php,
sull?ambiente server e sulle variabili dello script da cui è richiamata,
producendo un output in Html a video. Rimanendo
sempre nel campo delle variabili, non ci si può non soffermare sugli array (cioè variabili che
contengono molteplici elementi indicizzati).
Php gestisce sia gli
array associativi sia quelli con indice scalare, nonché gli array multidimensionali dove, tra l?altro, si possono mischiare i
due tipi di indicizzazione.
Molto interessante si
presenta l?istruzione di controllo ?foreach? che
permette di scorrere interamente un array e di
determinare tutte le chiavi e i valori per quello associativo e i valori per
quello numerico, in più sarà molto utilizzata quando si dovranno leggere gli
input degli utenti dai ?form?.
Non si
può non fare un cenno sulle stringhe.
Php dispone di un gran numero di funzioni con cui formattare,
analizzare e manipolare le stringhe. Tra le funzioni che possono destare
maggiori interessi ci sono sicuramente: ?esplode()?, che trasforma una
stringa in un array, dandogli come parametro il
carattere di delimitazione che si vuole utilizzare per suddividere la stringa
sorgente e la stringa sorgente stessa; ?strpos()? che
permette di individuare se una sottostringa è presente all?interno di una stringa
ed infine ?str_replace()? che, invece, permette di
sostituire una sottostringa con un?altra.
Quest?ultima funzione, in particolare, è molto
importante perché permette, per esempio, di sostituire eventuali caratteri che
gli utenti o male intenzionati potrebbero inserire per trovare falle nel
sistema. Un esempio può essere l?apice che, nell?interagire con il database Postegresql,
crea un errore in quanto questo carattere serve per
limitare i valori nei comandi SQL.
I vari operatori, da
quelli di assegnazione a quelli aritmetici e a quelli
di confronto, sono molto simili agli altri linguaggi. Interessante può essere l?uso
dell?operatore di concatenamento costituito da un singolo punto; con tale
operatore infatti si può comporre una stringa utilizzando
diverse variabili o altre stringhe. Come negli altri linguaggi evoluti, non
mancano le istruzioni: ?If?else?, ?switch case?? e i vari cicli con il ?while?,
?do?while?, ?for?, cui fanno da corredo l?istruzione ?break?, per interrompere un
ciclo ed uscire da esso e l?istruzione ?continue?, per interrompere
l?esecuzione dell?iterazione in atto non uscendo dal ciclo e quindi continuando con l?iterazione
successiva.
La definizione di una
funzione è effettuata con l?istruzione ?function? che
può tornare anche un valore se all?interno di essa è
presente l?istruzione ?return?, quindi
per questo possiamo distinguere tre tipi diversi tra le funzioni definite
dall?utente: funzioni senza parametri (che eseguono ogni volta lo stesso
compito), funzioni con uno o più parametri (che eseguono ogni volta compiti
dipendenti dai valori dei parametri) e appunto funzioni che producono un
risultato.
Una variabile, dichiarata all?interno di una
funzione, rimane locale alla funzione stessa, mentre una variabile globale definita altrove non è visualizzabile al suo
interno; a volte però potrebbe insorgere l?esigenza di accedervi, senza
passarla come argomento ed in questo caso entra in gioco l?istruzione ?global?.
Quando un argomento è passato a una funzione, esso viene memorizzato come copia in una
variabile di parametro, quindi diviene molto interessante approfondire il
discorso sul passaggio dei parametri, dove Php offre
varie possibilità:
· Il passaggio delle variabili alle
funzioni per valore, perciò una modifica delle copie non ha alcun effetto
sull?originale, venendo così a creare tante copie locali dei valori delle
variabili.
· Il passaggio
delle variabili alle funzioni per riferimento, perciò la funzione manipola un
riferimento alla variabile e non una copia del suo valore: quindi qualsiasi
modifica apportata ad un argomento si rifletterà sul valore della variabile
originale. Però ci sono da distinguere due casi, infatti
un argomento può essere passato per riferimento, aggiungendo il carattere
?&? al nome della variabile, nella chiamata o nella definizione della
funzione. La differenza sta nel fatto che nel primo caso si potrà utilizzare la
stessa funzione anche per un passaggio per valore, mentre nel secondo il
passaggio avverrà sempre per riferimento.
Le varie funzioni create
potranno essere salvate in file diversi ma questi ultimi
potranno essere aggiunti ai propri documenti Php
tramite la funzione ?include()?.
Il maggior vantaggio che
si trae da tale funzione è dato dal fatto che permette di inserire lo stesso
codice in più pagine diverse senza doverlo ripetere ogni volta.
Molte volte sarà capitato
di inserire il nome di un sito nella barra degli indirizzi del
vostro browser per poi essere dirottati in un?altra pagina. Quando
ciò accade, allora vuol dire che siete stati reindirizzati.
Con Php
inviando un?intestazione ?Location? tramite la funzione ?Header?
è possibile reindirizzare il browser a una nuova pagina, per esempio :
Header("Location: indirizzo.php");
In verità il reindirizzamento non avviene solo scrivendo tale codice,
anche se alcuni libri e molti siti dedicati al Php
fanno intendere così, infatti, dopo una lunga ricerca attraverso le molte mailing-list sul linguaggio, il ?bug? di questa funzione è stato risolto aggiungendo lo
script ?ob_start();? all?inizio di ogni pagina in cui
si veniva dirottati. In ogni caso, quando si viene reindirizzati
in una nuova pagina, le variabili della pagina precedente non possono essere
utilizzate nella pagina seguente.
Per superare le limitazioni imposte dalla
mancanza di memoria del protocollo Http, con la nuova versione di Php sono state introdotte le variabili di sessione.
Ad ogni sessione è
assegnato un identificativo univoco e il
suo stato viene memorizzato in un file temporaneo
consentendo il passaggio di informazioni da una pagina all?altra.
Le variabili di sessioni sono
rese disponibili allo script attraverso l?array
associativo ?HTTP_SESSION_VARS? che, combinato con l?istruzione ?foreach?, permette di determinare le chiavi e i valori in esso contenuto. Un esempio della sintassi del comando
potrebbe essere:
Foreach ($HTTP_SESSION_VARS as $key => $valore) {if ($key=="kounter") $count=$valore ;}
Però, prima di questo
passaggio, le variabili di sessioni devono essere registrate attraverso la
funzione ?session_register (?nome_variabile?);? alla quale bisogna aggiungere, all?inizio di ogni script
in cui le variabili di sessione vengono gestite, l?inizializzazione
di una sessione attraverso la funzione ?session_start();?.
Per una migliore gestione
delle sessioni sono disponibili altre funzioni che permettono di cancellare una
sessione ?session_unset()?, di codificarla e decodificarla attraverso rispettivamente ?session_encode()? e ?session_decode()?
e di verificare se una variabile è registrata all?interno di una sessione,
?session_is_registered(?nome_variabile?)?,
restituendo ?true? se la variabile è registrata.
La dinamicità di una
pagina viene utilizzando due diversi elementi che interagiscono tra loro
attraverso un web server. Questi due elementi sono gli input degli utenti
attraverso il browser e i data base attraverso un Dbms (Data Base Management
System, sistema di gestione di una base di dati).
Per permettere il passaggio di
informazioni dagli utenti dei siti web al server, i mezzi principali
sono i moduli Html (Form).
Php è stato progettato per acquisire le informazioni
inviate mediante tali modalità previste da Html e lavorare su di esse.
La struttura generale di
un form è composta dall?attributo ?action?, che
specifica quale file del programma Php deve essere attivato,
e dall?attributo ?method?, che può essere impostato
come ?Get?[6] o ?Post?[7]. Per
essere completi:
<form action=?pagina_nuova.php?
method= ?POST?/?GET?>
che alla fine dovrà
essere chiuso con il tag ?</FORM>?. Quindi all?utente è presentato un form,
che può venire creato sia in maniera dinamica
che statica, nel quale egli può digitare dei valori o scegliere tra
parametri preimpostati. Infatti,
i form sono di diverso tipo:
· <input type=?text? name=?nome_variabile?> dove l?utente
può immettere qualsiasi carattere nella casella che gli sarà presentata a video
fino ad un certo massimo.
· <textarea name=?nome_variabile?> dove l?utente può immettere un intero
testo senza limitazione di caratteri.
· <select name=?nome_variabile?> <option>
nome_opzione
</option> dove l?utente ha un menù nella quale
può selezionare un'unica opzione.
· <select name=?nome_variabile[]?
multiple> <option> nome_opzione </option> dove l?utente ha un menu nel quale può
selezionare più di un?opzione.
· <input type=?checkbox? name=?nome_variabile?>
ed <input type=?radio? name=?nome_variabile?>
dove l?utente, invece di avere un menù a tendina, come con la select dei punti precedenti, seleziona attraverso delle caselle di formato
diverso.
· <input type=?reset?>
crea un pulsante che ripristina lo stato iniziale del form,
mentre il tag <input type=?submit?> crea un pulsante la cui selezione invia al
server i dati immessi e attiva il file Php di
risposta.
Il file attivato
dall?attributo ?action? dovrà contenere gli array
associativi ?$_GET? se la trasmissione avviene col metodo ?get?
o ?$_POST? se la trasmissione avviene col metodo ?post?.
Queste due variabili, chiamate globali, contengono la coppia chiave/valore inviate
dall?utente che, inserite in un ciclo foreach,
permetteranno di essere ?estratte? e utilizzate nel nuovo script. Magari da
queste variabili ?estratte? da uno dei due array
associativi sarà posta un?interrogazione al database. In questo caso entra in
gioco il secondo elemento che caratterizza una pagina dinamica: il dbms con cui
interagisce.
Una delle caratteristiche più interessanti del
linguaggio è la semplicità con cui è in grado di interfacciarsi ad una grande varietà di dbms e di manipolarli. Purtroppo non
esiste, in questo momento, una serie di funzioni standard per l?interazione con
i database, ma esistono diverse funzioni, ognuna delle quali è specializzata in
un particolare dbms, anche se in realtà queste funzioni sono simili tra loro.
Nel nostro progetto è stato scelto Postgresql. Php può comunicare
con questo dbms attraverso una connessione di rete: questo consente di
memorizzare il database su un server remoto distinto dal server web. Per
contro, questa caratteristica rende necessaria una fase di collegamento al
database dove il dbms si comporta da server, mentre a fare da client è l?interprete Php. Quindi
la prima cosa da fare per interagire con il database è aprire una connessione e
le funzioni che si occupano di questo sono: ?pg_connect? e
?pg_pconnect?. Tutte e due hanno la stessa funzione,
ma la differenza sostanziale sta nel fatto che, se si utilizza la seconda, il
collegamento non è interrotto al termine dell?esecuzione dello script: questo
consente ad un altro script di utilizzarla senza creare una nuova connessione.
Al contrario le connessioni effettuate con ?pg_connect?
sono chiuse automaticamente al termine dello script.
Quindi
l?unico vantaggio che si presenta con ?pg_pconnect?
sta nel fatto che le operazioni di connessioni al database sono effettuate
soltanto una volta e utilizzate per diversi script. Comunque
queste due funzioni ritornano un valore che identifica la connessione con il
database in caso di successo o ritornano il valore ?false?, se la connessione
non può essere stabilita.
La connessione è specificata da una stringa, che
contiene il nome dell?host (cioè
della macchina che ospita il database), la porta (che solitamente è la 5432),
il nome del database, l?utilizzatore e la sua password, quindi la sintassi
completa diventa:
Pg_connect(?host=nome port=5432 user=postgres password=*****
dbname=nome_database?);
Questa funzione
deve essere salvata in una variabile visto che poi sarà
utilizzata come parametro per effettuare i vari comandi SQL, infatti, esistono
comandi che permettono l?interfacciamento con il
dbms. Tale interfacciamento avviene fondamentalmente
in due momenti: invio del comando SQL al dbms e l?interpretazione dei
risultati.
L?invio del
comando SQL al dbms, avviene nel caso di PostrgreSQL,
attraverso la funzione:
pg_query($connessione, ?istruzione SQL? );[8].
?Pg_query()? restituisce un valore identificativo del
risultato della query, che andrà memorizzato in una
variabile se è stato possibile eseguire quest'ultima. Restituisce FALSE in caso
di errore o se la connessione non è valida.
I dettagli
dell'errore si possono recuperare utilizzando la funzione ?pg_last_error()? se la connessione è valida.
Il valore di ritorno di questa funzione è una risorsa che si può usare per accedere ai dati attraverso altre funzioni PostgreSQL come:
· Pg_result (risorsa, tupla, campo),
· Pg_fetch_array (risorsa, tupla, tipo_risultato ),
·
Pg_fetch_row (risorsa, tupla).
Queste funzioni
hanno il compito di trasformare il risultato della query
in un formato gestibile da Php. ?Pg_result()?
restituisce i valori da una risorsa ottenuta mediante pg_query(). Tupla è un
intero. Campo è il nome del campo (stringa) o l'indice del campo (intero). I
parametri tupla e campo indicano quale cella nella
tabella risultante va restituita.
Mentre per quanto riguarda ?pg_fetch_array()?
restituisce un array che corrisponde alla riga
caricata. Questa funzione è un?estensione di ?pg_fetch_row()?, infatti restituisce un array
associativo con il nome del campo come chiave (PGSQL_ASSOC),
oppure l'indice del campo (PGSQL_NUM) o entrambi (PGSQL_BOTH).
?Pg_fetch_row()?
restituisce un array che corrisponde alla riga
caricata dove ogni campo è identificato da un indice numerico, che inizia da 0.
Un?altra funzione
è ?pg_num_rows()? che restituisce il numero di tuple
(righe) in un risultato PostgreSQL ottenuto
attraverso pg_query(). In caso di errore
ritorna ?-1?.
Se si desidera ottenere il numero di righe
modificate da query INSERT, UPDATE and DELETE, allora
si deve utilizzare ?pg_affected_rows()?.
Per chiudere una
connessione con ?pg_connect? verso un database PostgreSQL,
identificata dalla risorsa connessione, si utilizza ?pg_close()?
che restituisce TRUE in caso di successo, FALSE in
caso di fallimento.
L'uso di pg_close() non è normalmente necessario, dal momento che le
connessioni con ?pg_connect()? sono chiuse
automaticamente alla fine dell'esecuzione dello script, mentre quelle con ?pg_pconnect? non vanno chiuse.
Fondamentale è la funzione ?fsockopen()?
con la quale è possibile effettuare un collegamento a
un server web internet.
I parametri che
accetta questa funzione sono il nome dell?host, un numero di porta, solitamente 80, che è il numero
di porta su cui solitamente un server web rimane in ascolto, e due variabili di
riferimento.
Queste due
variabili di riferimento sono passate per fornire, in caso di problemi, ulteriori informazioni sul tentativo di collegamento:
?&$errno? fornirà il numero dell?errore e ?&$errdesc? potrebbe contenere ulteriori informazioni sul
malfunzionamento. In più si può aggiungere un intero facoltativo che determina
il timeout, cioè il tempo che ?fsockopen()?
aspetterà prima di abbandonare la connessione.
Per ciò la
sintassi completa diventa:
fsockopen("$host",80,&$errno,&$errdesc,30);
Se il collegamento è
stabilito con successo, viene restituito un puntatore
al file, in caso contrario restituisce ?false?.
Dopo aver ottenuto il
puntatore al file, diventa possibile sia scrivere sul collegamento, con ?fputs()?, sia leggere su di esso
con ?fgets()?, proprio come Php
gestirebbe dei file.
Quando il lavoro sulla connessione è terminato, occorre
chiudere la connessione con ?fclose()?.
[1] La separazione tra istruzioni Php e Html avviene racchiudendo lo script tra i tag ?<?php? e ??>?
[2] La versione Red Hat di linux permette di avere diversi editor di testo come il ?gedit?, ?nedit?, ?vi?
[3] Fonte: ?http:\\www.php.net?
[4] I tipi di dati supportati dal Php sono gli interi (integer), i numeri n virgola mobile(double), le stringhe(string), le variabili di tipo booleano (Boolean), array e variabili contenenti oggetti
[5] Fonte: ?http:\\www.php.net?
[6] Se il metodo è GET l??input dell?utente viene passato accodandolo alla fine dell?URL
[7] Se il metodo è POST l?input dell?utente viene passato come un documento che segue l?URL
[8] Questa funzione si chiamava pg_exec(). Pg_exec() è ancora disponibile per ragioni di compatibilità