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à

Hosted by www.Geocities.ws

1