LAMP workshop Fabrizio Felici GROsseto Linux Users Group Perché impegnarsi nel LAMP ● È (relativamente) facile da imparare ● È un'architettura completamente libera ● Sta diventando la piattaforma di riferimento in molti ambiti ● C'è interoperabilità di sistemi ● Si rivolge decisamente e funziona su internet e intranet ● Permette di fare molto anche da soli La cosa a cui bisogna stare attenti è... la facilità del linguaggio, che può portare a uno stile di programmazione superficiale; generamente un buon programma dev'essere: ben commentato; ● orientato al riuso del codice (niente copia e incolla ma funzioni richiamabili); ● scalabile (quello che funziona per due oggetti deve farlo per dieci milioni). ● LAMP workshop Conoscenze da sviluppare ● Linguaggio HTML (e javascript, css) ● Linguaggio PHP ● Linguaggio SQL ● Analisi dei problemi ● Cenni di amministrazione di sistemi Con l'autoistruzione e la buona volontà si può ben colmare lacune e mancanze. Questo workshop vuole far vedere che anche in un'ora si hanno dei risultati e delle soddisfazioni inaspettate. LAMP workshop LAMP = Linux Apache Mysql Php (Perl, Python) Istallare Linux ● Istallare Apache Fedora, Debian, Ubuntu, Suse... yum install httpd (Fed), apt-get ● install httpd (Deb,Ub) ● Istallare Php yum install php (Fed), apt-get install php (Deb,Ub) ● Istallare Mysql yum install mysql (Fed), apt-get install mysql (Deb,Ub) ● Istallare librerie per mysql yum install php-mysql (Fed), apt-get install php- mysql (Deb,Ub) E' tutto ok? TEST: ● /etc/init.d/mysqld start (Fed), /etc/init.d/mysql-ctl start (Deb,Ub) /etc/init.d/httpd start (Fed), /etc/init.d/apachectl start (Deb,Ub) ● Aprire browser su http://localhost/ ● echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php ● Aprire browser su http://localhost/phpinfo.php ● Se tutto OK: ● Istallare PhpMyAdmin da http://www.phpmyadmin.net/ prendiamo e scompattiamo il file in /var/www/html, creando una dir chiamata phpmyadmin. LAMP workshop Creazione del database Vogliamo informatizzare la lista della nostra collezione di dischi/Cd. Dopo l'analisi scegliamo per ogni disco di inserire: autore, titolo, note, prezzo. Per esigenze di integrità, un database relazionale deve avere una chiave primaria, un campo distintivo diverso da record a record. Noi sceglaimo di mettere un numero, detto id. Dall'interfaccia di phpmyadmin (http://localhost/phpmyadmin/): scriviamo il nome del database: “dischi” e clic su crea; ● creiamo una nuova tabella “oggetti” con il nome, 5 campi e clic su esegui; ● inseriamo in ogni campo i nomi con i giusti tipi (numerici mediumint, float e varchar con lunghezza 100), per l'id extra auto_increment e accanto il bottone “primaria”, e salva. ● Adesso abbiamo un database vuoto, che possiamo popolare come ci piace con la funzione “inserisci” e poi vedere a schermo con la funzione “mostra”. Ma il nostro scopo è costruire con le nostre mani una piccola applicazione che faccia questo, e altro. LAMP workshop Primo compito: connettersi al db La prima cosa da fare è stabilire una connessione al database mysql, tramite le funzioni del modulo php-mysql; facciamo un file chiamato conn.php dentro /var/www/html con questo contenuto: <?php # gli scritti preceduti da un # sono commenti # connessione al db, $ precede il nome di ogni variabile $db_nome = "dischi"; $connessione = mysql_connect ("localhost", "root", "") or die ("Impossibile stabilire una connessione a $db_nome."); $db = mysql_select_db ($db_nome, $connessione) or die("Impossibile selezionare il database $db_nome."); ?> Come si vede, serve il nome del db (dischi), del nostro pc (localhost), il nome e la password di un utente valido del mysql (root e niente password, il che è una falla di sicurezza ma per provare va bene, ricordatevi poi di mettercela!). Proviamo sul browser: http://localhost/conn.php; schermo bianco = tutto ok! LAMP workshop Arriva l'output (grezzo) Ora è il momento di creare lo script che tirerà fuori tutti i nostri dati, pur se in modo piuttosto banale e sbrigativo; facciamo un file chiamato lista.php dentro /var/www/html con questo contenuto: <?php # include nel file lo script di connessione include "conn.php"; # prepara la query che seleziona tutti i campi di tutte le righe di oggetti $sql = "SELECT * FROM oggetti"; # esegue la query e mette tutto dentro $ris, si ferma se c'è un errore $ris = mysql_query ($sql, $connessione) or die (mysql_error()); # seleziona a turno ogni riga del risultato fino a che ce ne sono while ($row=mysql_fetch_object($ris)) { # stampa la linea presa nel formato 'oggetto' con un a capo in html print_r ($row); echo "<br>"; } ?> LAMP workshop Preparare un output migliore Sul browser con http://localhost/lista.php potete vedere il risultato che sarà un elenco con righe simili a questa: stdClass Object ( [id] => 2 [autore] => BEATLES [titolo] => Let it be [note] => Apple Ita [stato] => buono [prezzo] => 18.00 ) che non è di tutta questa bellezza, e ovviamente può (deve!) essere migliorato! Come vedete ogni oggetto $row è composto dai campi id, autore etc, ognuno col suo valore 2, BEATLES etc... Per estrarre questi valori dentro il while basta riferirsi alla variabile $row->id, $row->autore etc... Per cui il nostro codice si modificherà leggermente in: LAMP workshop Prepara un output migliore <?php # include nel file lo script di connessione include "conn.php"; # prepara la variabile che conterrà l'output $out = ""; # prepara la query che seleziona tutti i campi di tutte le righe di oggetti $sql = "SELECT * FROM oggetti"; # esegue la query e mette tutto dentro $ris, si ferma se c'è un errore $ris = mysql_query ($sql, $connessione) or die (mysql_error()); # seleziona a turno ogni riga del risultato fino a che ce ne sono while ($row=mysql_fetch_object($ris)) { # aggiunge la riga a $out $out.= "$row->autore - $row->titolo ($row->note, $row->stato) $row>prezzo €<br>"; } # stampa tutto a schermo echo $out; ?> Il risultato è apprezzabile, con righe simili: BEATLES - Let it be (Apple Ita, buono) 18.00 € LAMP workshop Un tocco di HTML <?php include "conn.php"; # include nel file lo script di connessione # prepara la variabile che conterrà l'output $out = "<table><tr><td><b>Autore</b></td><td><b>Titolo</b></td><td>Note, stato</td><td>Prezzo(€)</td></tr>"; # prepara la query che seleziona tutti i campi di tutte le righe di oggetti $sql = "SELECT * FROM oggetti"; # esegue la query e mette tutto dentro $ris, si ferma se c'è un errore $ris = mysql_query ($sql, $connessione) or die (mysql_error()); # seleziona a turno ogni riga del risultato fino a che ce ne sono while ($row=mysql_fetch_object($ris)) { # aggiunge la riga a $out $out.= "<tr><td>$row->autore</td><td>$row->titolo </td><td>($row->note, $row->stato)</td><td>$row->prezzo</td></tr>"; } $out.= "</table>"; echo $out; # stampa tutto a schermo ?> Finalmente tutti i nostri risultati sono bellini in colonna! E ora se volessimo fare una ricerca per autore?... LAMP workshop Arriva la ricerca <?php include "conn.php"; # include nel file lo script di connessione # prepara la variabile che conterrà l'output con la casella per la ricerca $out = "<form action=\"$PHP_SELF\" method=\"POST\"><input type=\"text\" name=\"ricerca\" size=20><input name=\"cerca\" value=\"cerca\" type=\"submit\"></form> <table><tr><td><b>Autore</b></td><td><b>Titolo</b></td><td>Note, stato</td><td>Prezzo(€)</td></tr>"; # prepara la query che seleziona tutti i campi delle righe che rispettano la condizione "where" $sql = "SELECT * FROM oggetti WHERE autore LIKE '%$ricerca%'"; # esegue la query e mette tutto dentro $ris, si ferma se c'è un errore $ris = mysql_query ($sql, $connessione) or die (mysql_error()); # seleziona a turno ogni riga del risultato fino a che ce ne sono while ($row=mysql_fetch_object($ris)) { # aggiunge la riga a $out $out.= "<tr><td>$row->autore</td><td>$row->titolo </td><td>($row->note, $row->stato)</td><td>$row->prezzo</td></tr>"; } $out.= "</table>"; echo $out; # stampa tutto a schermo ?> LAMP workshop Arriva la ricerca... Commentiamo brevemente le nuove aggiunte: $PHP_SELF è la variabile col nome dello script, usato per far puntare la form su sé stessa; il primo input è la casella di testo che si chiama “ricerca”, che quando premete il bottone cerca viene passata allo script stesso come variabile chiamata $_POST[ricerca]. Notare i doppi apici tutti con la backslash \ davanti, necessaria essendo dentro a una variabile. A questo punto la SQL viene completata con la condizione autore LIKE '%$_POST[ricerca]%', cioè viene ricercato ogni nome di autore che contiene il testo che avete immesso, grazie alla presenza dei % che fungono da carattere jolly (l'equivalente dello * per i nomi di file). Adesso non vi resta che provare a cambiare un po' di cose, come cercare per titolo, ordinare per prezzo con il comando ORDER BY prezzo aggiunto in coda alla $sql, selezionare solo un campo cambiando il * con il nome del campo stesso... LAMP workshop ...e questo è solo l'inizio! Avete visto come in breve tempo e con poche righe di codice sia facile estrarre dei dati da un database, usando pochissime funzioni PHP e una query. Io trovo che sia elettrizzante riuscire a fare in questo modo una cosa che fino a poco fa magari ritenevate di chissà quale complessità. Ovviamente è solo la punta dell'iceberg. Il resto tocca a voi!... Potete appoggiarvi a phpmyadmin e vedere le query che fa lui per compiere operazioni come inserimenti, aggiornamenti e provare a implementarli ingrandendo la form, potete approfondire l'HTML, che vi serve per fare pagine più accattivanti, andare avanti a esplorare il PHP, che raccoglie migliaia di funzioni. Benchè avete molta strada da fare da soli, nessuno vi vieta di rivolgervi ancora a noi, tramite il forum del nostro gruppo. LAMP workshop Risorse utili ● http://www.php.net/manual/it/ manuale online delle funzioni del PHP; ● http://www.mysql.com/ sito ufficiale del Mysql; ● http://www.w3schools.com/tags/ manuale di riferimento HTML; ● http://www.hotscripts.com/PHP/ miriadi di script già pronti per esempi e tutorial ● http://bluefish.openoffice.nl/ il mio programma preferito per scrivere in PHP ● http://www.nvu.com/ authoring per il il miglior programma libero di web, disponibile per Linux, Win, Mac ● http://www.grolug.org/forums il posto giusto per fare tutte le vostre domande LAMP workshop Per maggiori informazioni: [email protected] http://www.grolug.org [email protected] 26/11/2005 Grosseto, LinuxDay 2005 15