Lamp Ld2008

download Lamp Ld2008

If you can't read please download the document

Transcript of Lamp Ld2008

LAMP con PHP

di Michele O-Zone Pinassi

Roadmap

Alla fine del talk avremo capito come interagiscono il server Web, l'interprete PHP ed il DBMS MySQL per offrire all'utente servizi interattivi attraverso le pagine web.

1) Introduzione2) Un passo indietro... (veloce storia del web)3) HTML e PHP4) CSS Cascading Style Sheet5) Interazione6) Riepilogo7) Introduzione a MySQL8) PHP e MySQL9) Il Javascript10) AJAX

Introduzione

LAMP un acronimo per Linux, Apache, MySQL e PHP/Python/Perl. In genere per piattaforma LAMP si intende un server ove sono installati questi software:

Linux (GNU/Linux), il sistema operativo

Apache, il server HTTP

MySQL, un famoso DBMS

PHP/Python/Perl, interprete per uno di questi linguaggi di programmazione

La sinergia tra questi software permette di ottenere un server web stabile, sicuro, flessibile e completamente libero !

Un passo indietro...

Agli albori del World Wide Web (Anni '90) l'HTML era un mezzo per visualizzare testo e semplice grafica sui primi browser web, con i primi collegamenti ipertestuali che permettevano la navigazione all'interno dei siti web.

La necessit di maggior flessibilit ed interattivit fece nascere il meccanismo dei CGI-BIN, semplici programmi (in C, Perl...) che venivano interrogati attraverso il passaggio di variabili GET e POST e restituivano pagine in html generate dal server web (server-side).

Poi, praticamente insieme al Java della Sun -che permetteva l'esecuzione di Applet Java nelle pagine web-, nacquero i linguaggi client-side interpretati ed eseguiti dal browser (Javascript, VBS) e nuovi sistemi server-side per una migliore interazione dell'utente: PHP, ASP,JSP...

La differenza sostanziale tra linguaggi client-side e server-side che i primi vengono eseguiti sulla macchina dell'utente mentre i secondi all'interno del server web.

HTML e PHP

Presupponendo che tutti noi conosciamo, almeno in minima parte, l'HTML, iniziamo a discutere su come integrare codice PHP nelle nostre pagine web. Ovviamente prima necessario configurare Apache HTTPD per il modulo PHP (in genere, nelle distro moderne, gi tutto apposto).

Partiamo con il pi classico Hello World:

Hello World

I tag indicano ad Apache che il contenuto (in verde) deve essere interpretato dal modulo PHP. E che il risultato deve essere incorporato nella pagina web. La cosa veramente interessante che l'utente non ha modo di distinguere, dal browser, la differenza tra la pagina in HTML statico ed l'HTML generato dal PHP: per lui -il browser- solamente HTML da renderizzare e visualizzare !

helloworld.php

1 - Hello World Hello world !

Data ed Ora

2 - Time and Date

La sintassi della funzione date() su http://it.php.net/manual/it/function.date.php

Cascading Style Sheet

Come probabilmente saprete, nella definizione di XHTML -l'ultima evoluzione dell'HTML definita dal consorzio W3C- necessario separare le propriet grafiche dal contenuto stesso della pagina.

I CSS sono il sistema per definire come deve essere visualizzato un elemento (testo, div, frame, pulsante, immagine...) ed il browser (attenzione: i css sono client-side !), interpretanto le definizioni di stile, renderizza la pagina.

Gli stili si possono definire per Id oppure per ogni elemento, a livello globale o per classe.

A livello globalea { color: #000; }Per classea:collegamento { color: #000; }Per Id#collegamentoA { color: #000; }

Attenzione: in una pagina web ogni ID deve essere univoco !

Data ed Ora con CSS

CSSFogli di StilePagina (X)HTML

...

mycss.css:

body {background: #CCC;margin: 10px;padding: 5px;}

#copyright {color: #FC0;}

a.link {color: #C0C;}

Il problema dei CSS

I CSS hanno un grosso problema: non sono standardizzati ! O, meglio, esistono le linee guida del W3C (http://www.w3.org/Style/CSS/) ma i produttori di browser -per motivi anche commerciali- hanno introdotto delle loro estenzioni o particolarit che rendono alcuni CSS dipendenti dal browser. In particolare si trovano pesanti differenze tra i browser Mozilla-like e Microsoft IE. Addirittura tra diverse versioni di IE ci possono essere grosse differenze ! Devo per ammettere che IE7 colma alcune pesanti lacune presenti nelle precedenti versioni. Rimane comunque universalmente accettato che i Mozilla-like sono i pi attenti alle raccomandazioni W3C.

Questo problema importante perch dobbiamo cercare di rendere il nostro sito Web il pi possibile compatibile con i browser degli utenti. Una delle tecniche pi diffuse creare due fogli di stile: uno per IE ed uno per Mozilla e gli altri, e far interpretate al browser (con diversi sistemi, tra cui l'uso del PHP) il CSS corretto.

Questo ci introduce al prossimo argomento, ovvero come facciamo a far interagire PHP con l'utente del nostro sito web.

Interazione

Prima di iniziare a costruire il Nostro sito web interattivo, importante avere ben chiara la natura client-server delle transazioni tra il server web e l'utente.

L'utente richiede una pagina web, il server elabora e risponde: non c' modo, per il server, di inviare dati all'utente di sua iniziativa.

Questo ci deve portare a ragionare in termini di CAUSA ed EFFETTO. Ad esempio:

CAUSA L'utente richiede una pagina con un form di registrazione.EFFETTO Il server invia al browser la pagina con il form.CAUSAL'utente compila i campi e preme il pulsante Registrami del form.EFFETTO Il server riceve i dati immessi dall'utente, elabora e poi risponde.

POST e GET

Lo scambio di dati tra utente e server web avviene attraverso le variabili POST e GET. Queste variabili vengono inviate negli Header delle transazioni HTTP (HyperText Transfer Protocol) e sono accessibili, in PHP, tramite due array superglobali: $_POST e $_GET.

Ok, non spaventatevi: semplice ! Senza addentrarci nei meandri dell'HTTP (che per vi suggerisco di fare in un secondo momento) pensate a come fatto un form:

Variabile A: Variabile B:

L'utente scrive dei valori nei campi (imposta il valore delle variabili) e successivamente, premendo il pulsante Submit, invia questi valori, incapsulati in una richiesta di tipo POST, al nostro server Web e precisamente a postform.php che si occuper di elaborarli.

postform.php

La matrice (Array) $_POST contiene due elementi:

$_POST[variabileA] = uno$_POST[variabileB] = due

N.B. Per la stampa dell'array ho usato la funzione print_r

Notare l'URL !

getform.php

Come prima la matrice (Array) $_GET contiene due elementi:

$_GET[variabileA] = uno$_GET[variabileB] = due

La differenza il modo in cui vengono inviate le variabili. Notando l'URL si vede subito che nella richiesta di tipo GET le variabili vengono accodate.

Notare l'URL !

...e allora ?

La differenza importante tra POST e GET che una richiesta di tipo GET pu essere generata anche attraverso un hyperlink, mentre un POST solamente attraverso un form. Ad esempio, con AJAX si utilizzano le richieste di tipo GET per interrogare il server.

Oltretutto nelle richieste di tipo GET tutte le variabili passate al server sono visualizzate nell'URL e questo pu non essere desiderabile in certi casi.

Per controllare e diagnosticare gli header, comprese le richieste POST e GET, si pu usare una comoda estenzione di Firefox:

LiveHTTPHeaders (http://livehttpheaders.mozdev.org/)

Riepiloghiamo

In queste veloci slide abbiamo scoperto tantissime cose interessanti. Molte di queste non saranno chiare: normale, in quanto la miglior scuola -in questi casi- la pratica. L'importante che siano chiari alcuni concetti fondamentali prima di continuare:

- Le richieste sono sempre inviate dall'utente ed il server risponde ad esse- L'unica interazione con l'utente sono le Sue richieste (compresi i form)

Adesso abbandoniamo per qualche minuto il web e l'html per introdurre MySQL, il nostro DBMS !

MySQL

MySQL un DataBase Management System. La sua funzione, in termini pratici (mi perdoneranno i pi esperti !) ordinare, gestire, trovare e controllare i dati.

Quali sono questi dati e come sono strutturati lo decidiamo noi.

MySQL utilizza le tabelle, contenute in un database. In un DBMS ci possono essere -ed in genere cos- molti databases. Qualcosa tipo:

MIOSITO

Utenti

Libri

Dove MIOSITO il nome del database ed Utenti e Libri sono due tabelle all'interno del DB MIOSITO.

DB e Tables

La parte pi difficile costruire le tabelle (Tables). Dobbiamo pensare a tutti gli elementi (tipi di dati) che desideriamo avere. Un esempio classico quello dell'anagrafica utenti di un sito web: gli utenti si registrano (con Username e Password) ed inseriscono la loro e-mail per poter essere contattati. Ovviamente ciascun utente dovr avere un username univoco (chiave) e voglio tenere traccia dell'IP da cui si collega ed a che ora ha effettuato l'ultimo accesso.

La nostra tabella Utenti potrebbe essere composta da queste colonne:

usernameVARCHAR(20)PRIMARY KEYpasswordVARCHAR(20)e-mailVARCHAR(50)ipVARCHAR(13)ora_ultimo_accessoDATETIME

Ovviamente devo dire al mio DBMS sia il nome che il tipo dell'elemento (ad es. VARCHAR) ed eventuali sue caratteristiche (ad es. PRIMARY KEY).

N.B. Consultare http://www.mysql.com per ulteriori informazioni in merito alla sintassi.

Tables

Ovviamente vorremmo far fare qualcosa ai nostri utenti ! Ipotizziamo di voler offrire un servizio in cui l'utente consulta ed inserisce recensioni sui libri che ha letto. Necessitiamo percui di una ulteriore tabella, Libri. Un libro composto da un Titolo, un eventuale Sottotitolo, un Autore ed un Editore.

Pertanto la nostra tabella Libri potrebbe essere:

titoloVARCHAR(255) PRIMARY KEYsottotitolo TEXTautoreTEXTeditoreTEXT

N.B.: L'attributo PRIMARY KEY su titolo indica che non possiamo avere due libri con lo stesso titolo.

Per il momento dirrei che sufficente per iniziare a lavorare, mettendo insieme tutto quello che abbiamo imparato fino ad ora. Iniziamo pertanto a creare il database MIOSITO e le due tabelle Utenti e Libri.

N.B. Utilizzate delle comode interfacce grafiche, ad es. MySQL Query Browser: eviterete di impazzire dietro ai comandi SQL !

DB MIOSITO

PHP e MySQL

Da PHP facile accedere ed utilizzare MySQL grazie a tante funzioni che ci semplificano molto la vita (http://it.php.net/manual/it/book.mysql.php).

La prima cosa che dobbiamo fare, all'interno della nostra pagina web in php, aprire la connessione al DB. Creiamo una comoda funzione OpenDB():

function OpenDB() { $db = mysql_connect('localhost','UsernameDB','PasswordDB'); if($db == false) {echo "Errore di connessione al DB";exit(); } mysql_select_db('MIOSITO',$db); return $db;}

e poi, alla fine della pagina, chiudiamo la connessione:

function CloseDB($db) {mysql_close($db);}

N.B. Ricordatevi di modificare i parametri in verde per il vostro sistema.

Query SQL

Il prossimo passo imparare ad interrogare il nostro DBMS. Le operazioni fondamentali sono:

SELECT [cosa] FROM [dove] WHERE [condizioni] [altro]INSERT INTO [dove] [cosa]UPDATE [dove] SET [cosa] WHERE [condizioni] DELETE [cosa] FROM [dove] WHERE [condizioni]

N.B. La sintassi molto complessa ed articolata: fate riferimento al manuale MySQL.

Per eseguire le query sul ns server usiamo la funzione PHP mysql_query(). Ad esempio una SELECT:

$result = mysql_query(SELECT * FROM Utenti;);if($result === false) {echo Errore: .mysql_error($db);exit();}

In caso di errore (ad. es. di sintassi o di connessione) la funziona ritorna false, altrimenti i risultati (anche 0) saranno disponibili tramite l'handle $result.

Popolare il DB

Il nostro DB MIOSITO ancora vuoto (una operazione di SELECT restituir sempre un insieme vuoto) e per popolarlo dobbiamo inserire I dati attraverso l'operazione INSERT. Creiamo, con l'HTML ed il PHP, un sistema per la registrazione degli utenti:

L'inserimento del nuovo utente avviene attraverso INSERT:

INSERT INTO Utenti (username, password,email...) VALUES ('$username'...);

Autenticazione

Autenticare un utente su un sito web vuol dire, in parole povere, controllare se esiste una riga nella tabella Utenti con username e password corrispondenti a quelle inserite dall'utente.

Un operazione di SELECT quello che ci serve:

SELECT * FROM Utenti WHERE username='$username' AND password='$password';

Poi controlliamo se il numero delle righe restituite > 0 oppure no:

if(mysql_num_rows($result) > 0) {echo Utente autenticato;} else {echo Oops: credenziali non valide !;}

Dopo che abbiamo verificato l'esistenza dell'utente dobbiamo prevedere un sistema per far ricordare al PHP che il nostro utente valido. A questo scopo possiamo usare le sessioni (http://it.php.net/manual/it/ref.session.php), un sistema basato su cookies che permette di dichiarare variabili valide per l'intera sessione dell'utente sul nostro sito web.

Sessioni PHP

Premetto dicendo che il discorso sulle sessioni PHP estremamente controverso e ci sono state dispute in passato sul tema della sicurezza che vi spiegher brevemente dopo.

Le sessioni altro non sono che variabili valide -appunto- per tutta una sessione. Per usare questo meccanismo dobbiamo inserire la funzione

all'inizio di ogni nostra pagina web. Dopodich useremo l'array $_SESSION[] per le nostre variabili di sessione. Ad esempio, per sapere se un utente autenticato oppure no, possiamo controllare se esiste l'elemento $_SESSION[AUTH]: