Interazione tra basi di dati e web • • • Php e MySQL PhpMyAdmin Smarty template Francesco Brancati – [email protected] Cristina Pucci – [email protected] Php e MySQL • Gestire intere sezioni di siti web in modo semplice e veloce – Gestione efficiente: possibilità di effettuare modifiche frequenti di contenuto ed eventualmente di veste grafica • Ci vengono in aiuto i linguaggi di programmazione orientati al web publishing come Php – Php ottimo per la creazione di pagine dinamiche, ma non offre nessuna possibilità di memorizzazione dei dati • Soluzione: utilizzare parallelamente un linguaggio di programmazione e un database Interazione tra basi di dati e web Php e MySQL 2 Connessione al database: config.inc.php • Parametri per la connessione: – host: da cui si può raggiungere MySQL (generalmente è localhost) – username e password: per l'accesso al database – nome del database. Questi parametri vengono forniti dall'amministratore dello spazio web Interazione tra basi di dati e web Php e MySQL 3 config.inc.php (1) Creiamo una pagina di nome config.inc.php con i parametri necessari: <? // parametri del database $db_host = "localhost"; $db_user = "cristina"; $db_password = "pucci"; $db_name = "bdd"; // password per inserimento articoli $password = "master"; ?> Interazione tra basi di dati e web Php e MySQL 4 config.inc.php (2) • config indica che il file contiene dei dati relativi alla configurazione dello script. • .inc ci ricorderà che questo file non è una pagina che verrà visualizzata direttamente, ma verrà inclusa all'interno di altre. • .php invece viene inserito per motivi di sicurezza. Se qualcuno cercherà di visualizzare questa pagina con il browser, vedrà solo una pagina vuota. Interazione tra basi di dati e web Php e MySQL 5 Connessione al database: connect.inc.php • Possiamo realizzare la connessione al db attraverso la funzione mysql_connect. • Creiamo una pagina di nome connect.inc.php da includere in ogni file che effettua una operazione sul db <? $db = mysql_connect($db_host, $db_user, $db_password); if ($db == FALSE) die ("Errore nella connessione. Verificare i parametri nel file config.inc.php"); Interazione tra basi di dati e web Php e MySQL 6 connect.inc.php • Se la connessione ha buon esito restituisce un identificatore alla connessione in $db • Se la connessione non va a buon fine viene restituito FALSE. • Dobbiamo specificare su quale database vogliamo lavorare e verificare nuovamente la riuscita dell'operazione: mysql_select_db($db_name, $db) or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php"); ?> Interazione tra basi di dati e web Php e MySQL 7 Creazione delle tabelle: install.php • Dopo aver creato la connessione possiamo finalmente agire sul database • Il file install.php crea le tabelle necessarie al funzionamento dell’applicazione • Le query vengono comunicate al database attraverso la funzione mysql_query: $query = "CREATE TABLE news ( " ."id INT (5) UNSIGNED not null AUTO_INCREMENT, " ."titolo VARCHAR (255) not null, " ."testo TEXT not null, " ."data INT (11), " ."autore VARCHAR (50), " ."mail VARCHAR (50), " .”PRIMARY KEY (id))"; Interazione tra basi di dati e web Php e MySQL 8 install.php • Se si verifica un errore durante l’esecuzione della query, questo viene visualizzato con la funzione mysql_error() if (mysql_query($query, $db)) echo "L'installazione è stata eseguita correttamente"; else echo "Installazione fallita: " .mysql_error()." durante l'esecuzione della query:".$query; include(“disconnect.inc.php"); ?> Interazione tra basi di dati e web Php e MySQL 9 Connessione al database: disconnect.inc.php • Al termine dello script è sempre bene terminare la connessione al database includendo il file disconnect.inc.php : <? mysql_close($db); ?> Interazione tra basi di dati e web Php e MySQL 10 Intestazione e piè di pagina: top_foot.inc.php • Creiamo una pagina top_foot.inc.php con i codici html che caratterizzano la veste grafica. <? function top() { ?> <HTML> <HEAD> <meta name=generator content="Script di esempio"> </HEAD> <BODY bgcolor=ffffff text=000000> <font face=verdana,tahoma,arial size=-1> <h1>News</h1><br> <? } function foot() { ?> </body></HTML> <? } ?> Interazione tra basi di dati e web Php e MySQL 11 Creazione del modulo: insert.php • Creiamo il modulo per l'inserzione degli articoli: insert.php – questa pagina contiene la form necessaria a raccogliere i dati – non ci sono accessi al database – separazione tra interfaccia grafica e interazione con db Interazione tra basi di dati e web Php e MySQL 12 insert.php (1) <? include ("top_foot.inc.php"); //intestazione top(); ?> <form method=post action=save.php> Titolo:<br> <input type=text size=40 name=titolo><br> <br> Data:<br> <select name=giorno> <? for ($i=1; $i<=31; $i++) echo "<option value=$i>$i"; ?> Interazione tra basi di dati e web Php e MySQL 13 insert.php (2) </select> <select name=mese> <option value=1>Gennaio <option value=2>Febbraio ... <option value=12>Dicembre </select> <select name=anno> <option value=2001>2001 <option value=2002>2002 <option value=2003>2003 <option value=2004>2004 <option value=2005>2005 </select><br> <br> Interazione tra basi di dati e web Php e MySQL 14 insert.php (3) Autore:<br> <input type=text size=40 name=autore><br> <br> E-mail:<br> <input type=text size=40 name=mail><br> <br> Testo:<br> <textarea cols=60 rows=40 name=testo></textarea><br> <br> Password:<br> <input type=password size=40 name=pass><br> <br> <input type=submit value=Invia> </form> <? // chiusura pagina foot(); ?> Interazione tra basi di dati e web Php e MySQL 15 Inserimento nel database: save.php • Creiamo la pagina save.php – – – – – controllo della password controllo dei campi not null controllo ed escaping dei caratteri particolari dentro le stringe conversione delle date in formato timestamp connessione al db e esecuzione della query Interazione tra basi di dati e web Php e MySQL 16 save.php (1) <? include("top_foot.inc.php"); include("config.inc.php"); top(); if (!strcmp($pass,$password)) die ("Password errata"); if (trim($titolo) == "" OR trim($testo) == "") die("I campi Titolo e Testo devono essere riempiti!"); Interazione tra basi di dati e web Php e MySQL 17 save.php (2) $titolo $autore $mail $testo $titolo $titolo $autore $autore $testo $testo $testo = = = = = = = = = = = $data = mktime("0", "0", "0", $mese, $giorno, $anno); Interazione tra basi di dati e web addslashes(stripslashes($titolo)); addslashes(stripslashes($autore)); addslashes(stripslashes($mail)); addslashes(stripslashes($testo)); str_replace("<", "&lt;", $titolo); str_replace(">", "&gt;", $titolo); str_replace("<", "&lt;", $autore); str_replace(">", "&gt;", $autore); str_replace("<", "&lt;", $testo); str_replace(">", "&gt;", $testo); nl2br($testo); Php e MySQL 18 save.php (3) $db = mysql_connect($db_host, $db_user, $db_password); if ($db == FALSE) die ("Errore nella connessione. Verificare i parametri nel file config.inc.php"); mysql_select_db($db_name, $db) or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php"); $query = "INSERT INTO news (titolo, testo, data, autore, mail) VALUES ('$titolo', '$testo', '$data', '$autore', '$mail')"; Interazione tra basi di dati e web Php e MySQL 19 Visualizzazione degli ultimi articoli: index.php • Si estraggono dal db i titoli degli articoli tramite mysql_query() • La funzione ci restituisce un identificatore nella variabile $result • Si scorre riga per riga il risultato dell’interrogazione tramite mysql_fetch_assoc(), che ci restituisce un array associativo • Si visualizzano gli articoli Interazione tra basi di dati e web Php e MySQL 20 index.php <? include("top_foot.inc.php"); include("config.inc.php"); top(); include("connect.inc.php"); $query = "SELECT id" .",data" .",titolo " ."FROM news " ."ORDER BY data DESC " ."LIMIT 0,5"; $result = mysql_query($query, $db); while ($row = mysql_fetch_array($result)) { echo "<a href=\"view.php?id=$row[id]\">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; } include("disconnect.inc.php"); foot(); ?> Interazione tra basi di dati e web Php e MySQL 21 Visualizzione dell'articolo completo: view.php • Si estrae dalla tabella la riga corrispondente all’articolo interessato • Si visualizzano le informazioni Interazione tra basi di dati e web Php e MySQL 22 view.php <? include("top_foot.inc.php"); include("config.inc.php"); top(); include("connect.inc.php"); $query = "SELECT titolo,testo,data,autore,mail FROM news WHERE id='$id'"; $result = mysql_query($query, $db); $row = mysql_fetch_assoc($result); $data = date("j/n/y", $row[data]); echo "<b>$row[titolo]</b><br><br>"; echo "$row[testo]<br><br>"; if ($row[mail] != "") echo "$data, <a href=mailto:$row[mail]>$row[autore]</a><br>"; else echo "$data, $row[autore]<br>"; echo "<br><a href=index.php>Torna alla pagina iniziale</a><br>"; echo "<a href=all.php>Visualizza tutti gli articoli</a><br>"; include("disconnect.inc.php"); foot(); ?> Interazione tra basi di dati e web Php e MySQL 23 Elenco di tutti gli articoli: all.php • Si stabilisce quanti titoli visualizzare per pagina • Si estraggono dal db i solo i titoli necessari per la pagina corrente Interazione tra basi di dati e web Php e MySQL 24 all.php (1) <? include("top_foot.inc.php"); include("config.inc.php"); top(); include("connect.inc.php"); if (!isset($start) OR $start<0) $start = 0; $step = 10; $query = "SELECT id,data,titolo FROM news ORDER BY data DESC LIMIT $start,$step"; $result = mysql_query($query, $db); while ($row = mysql_fetch_array($result)) { echo "<a href=\"view.php?id=$row[id]\">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; } ?> Interazione tra basi di dati e web Php e MySQL 25 all.php (2) <br><br> <table width=90% border=0><tr> <td width=20% align=left> <? if ($start>0) { $start_back = $start - $step; echo "<a href=all.php?start=$start_back>precedenti</a>"; } ?> </td> <? $query = "SELECT count(*) AS tot FROM news"; $result = mysql_query($query, $db); $row = mysql_fetch_array($result); $pages = intval(($row[tot]-1) / $step)+1; ?> <td width=60% align=center> <? for ($i=0; $i<$pages AND $i<20; $i++) { $start_page = $i * $step; echo "<a href=all.php?start=$start_page>" . ($i+1) . "</a> "; } ?> Interazione tra basi di dati e web Php e MySQL 26 all.php (3) </td> <td width=20%> <? if ($start + $step < $row[tot]) { $start_next = $start + $step; echo "<a href=all.php?start=$start_next>successivi</a>"; } ?> </td> </tr></table> <br> <? echo "<a href=search.php>Cerca negli articoli</a>"; include(“disconnect.inc.php”); foot(); ?> Interazione tra basi di dati e web Php e MySQL 27 Il motore di ricerca: search.php – result.php • Creiamo una form per immettere le parole da cercare • Supponiamo le chiavi divise da virgole ed usiamo la funzione array explode (string separator, string string [, int limit]); per ottenere un array di chiavi • Per ogni chiave facciamo una ricerca nel titolo, nel testo, e nell’autore • Visualizziamo i risultati Interazione tra basi di dati e web Php e MySQL 28 search.php <? include("top_foot.inc.php"); include("config.inc.php"); top(); ?> <form method=post action=result.php> <input type=text name=chiave><input type=submit value=cerca><br> </form> <? foot(); ?> Interazione tra basi di dati e web Php e MySQL 29 result.php <? include("top_foot.inc.php"); include("config.inc.php"); top(); include("connect.inc.php"); $keys = explode (",", $chiave); $query = ""; reset ($keys); foreach ($keys as $parola) { $parola = trim($parola); if ($parola != "") $query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR "; } $query .= "0"; $query = "SELECT id, titolo, data FROM news WHERE " . $query; $result = mysql_query($query, $db); while ($row = mysql_fetch_array($result)) { echo "<a href=\"view.php?id=$row[id]\">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; } include("disconnect.inc.php"); foot() ?> Interazione tra basi di dati e web Php e MySQL 30 PhpMyAdmin • PhpMyAdmin è un'interfaccia grafica che permette di amministrare MySql • Con PhpMyAdmin, possiamo: – Visualizzare il contenuto del nostro database – Creare, modificare, cancellare database, intere tabelle o singoli record – Fare un backup (dump) dei dati contenuti – Importare grosse quantità di dati in diversi formati cvs, excel, sql… – Visualizzare informazioni interessanti sul db – Gestire gli utenti di MySQL ed i loro privilegi Interazione tra basi di dati e web PhpMyAdmin 31 Home Page Interazione tra basi di dati e web PhPMyAdmin 32 Struttura database Interazione tra basi di dati e web PhPMyAdmin 33 Struttura tabella Interazione tra basi di dati e web PhPMyAdmin 34 Query SQL Dump Interazione tra basi di dati e web PhPMyAdmin 36 Dump (2) Interazione tra basi di dati e web PhPMyAdmin 37 Cos'è Smarty? • Smarty è un motore di template per PHP • Consente di separare logica e contenuto dell'applicazione dalla sua presentazione/layout – Programmatore e progettista non sono la stessa persona • Possibilità di apportare modifiche alla struttura logica dell’applicazione senza dover modificare il layout grafico e viceversa – Il programmatore (che si occupa della logica applicativa) può modificare il suo codice senza chiedere aiuto al grafico e viceversa Interazione tra basi di dati e web Smarty 38 Compilazione dei template • Smarty legge i file dei template • Crea script PHP a partire da questi – una volta creati, questi script vengono eseguiti da quel momento in poi • Vantaggio: si evita una costosa analisi dei template ad ogni richiesta Interazione tra basi di dati e web Smarty 39 Funzionalità di Smarty • • • • • E' estremamente veloce E' efficiente, perché è l'analizzatore di PHP a fare il "lavoro sporco" Non c'è sovraccarico per l'analisi del template, che viene compilato una sola volta E' abbastanza furbo da saper ricompilare solo i template che sono stati modificati Si possono creare funzioni personalizzate e modificatori di variabili personalizzati – Ciò rende il linguaggio dei template estremamente estensibile • La sintassi dei tag di delimitazione dei template è configurabile – Si possono usare {}, {{}}, <!--{}-->, ecc • • E' consentito nidificare in maniera illimitata sezioni, test, ecc E' possibile incorporare direttamente codice PHP nei file di template – Sebbene non dovrebbe essercene bisogno • • • Supporto nativo al caching Funzioni personalizzate di gestione della cache Architettura a plugin Interazione tra basi di dati e web Smarty 40 Sintassi • Il concetto della programmazione con i template è semplice: – nel codice Php si definiscono variabili per l’utilizzo nel template – nel template si visualizzano queste variabili index.php include('Smarty.class.php'); // crea l’oggetto $smarty = new Smarty; // assegna un contenuto ad una variabile. // NB. di solito il contenuto è assegnato dinamicamente. $smarty->assign('name', 'mario rossi'); $smarty->assign('address', 'via forlì 42'); // lo visualizza $smarty->display('index.tpl'); Interazione tra basi di dati e web Smarty 41 Sintassi • Il concetto della programmazione con i template è semplice: – nel codice php si definiscono variabili per l’utilizzo nel template – nel template si visualizzano queste variabili index.tpl output <html> <head> <title>Info Utente</title> </head> <body> Utente:<p> Name: {$name}<br> Address: {$address}<br> </body> </html> <html> <head> <title>Info Utente</title> </head> <body> Utente:<p> Name: mario rossi<br> Interazione tra basi di dati e web Address: via forlì 42<br> </body> </html> Smarty 42 Modificatori delle variabili • Sono usati per modificare l’output di una variabile, una funzione utente o una stringa da dentro il template • Per applicare un modificatore bisogna indicare il valore seguito da | (pipe) e dal nome del modificatore • Un modificatore può accettare parametri addizionali che modificano il suo comportamento – Questi parametri seguono il nome del modificatore e sono separati da : (due punti) Interazione tra basi di dati e web Smarty 43 header.tpl footer.tpl <html> <head> <title>{$title|default:"no title"}</title> </head> <body> </body> </html> index.tpl output {include file="header.tpl" title="Info Utente"} Utente:<p> Name: {$name|capitalize}<br> Address: {$address|escape:”htmlall”} <br> Date: {$smarty.now|date_format: "%Y-%m-%d"}<br> {include file="footer.tpl"} <html> <head> <title>Info Utente</title> </head> <body> Utente:<p> Name: Mario Rossi<br> Address: via forl&igrave 42<br> Date: 2005-04-29<br> </body> </html> La funzione include • Permette l’uso delle variabili locali – nell’esempio precedente la variabile $title non è definita direttamente nel template ma è passata come parametro della funzione include() – così facendo $title può essere cambiata dinamicamente ogni volta che si include il file header.tpl • Usando il modificatore default è possibile dichiarare un valore predefinito nel caso la variabile non sia definita nella include() Interazione tra basi di dati e web Smarty 45 Generare un elenco di dati • Si crea un array con i dati da elencare e si passa al template $smarty->assign('name', array('franco','marco','joe','lucia','carla')); • Nel template si cicla sull’array tramite il costrutto section <table> {section name=mysec loop=$name} <tr bgcolor="{cycle values="#eeeeee,#dddddd"}"> <td>{$name[mysec]}</td> </tr> {/section} </table> • Con la funzione cycle values alterniamo lo sfondo Interazione tra basi di dati e web Smarty 46 Generare un elenco di dati • L’output generato è questo: <table> <tr bgcolor="#eeeeee"><td>franco</td></tr> <tr bgcolor="#dddddd"><td>marco</td></tr> <tr bgcolor="#eeeeee"><td>joe</td></tr> <tr bgcolor="#dddddd"><td>lucia</td></tr> <tr bgcolor="#eeeeee"><td>carla</td></tr> </table> Interazione tra basi di dati e web Smarty 47 Risorse • • • • • http://freephp.html.it/ http://www.risorse.net/ http://www.php.net/ http://smarty.php.net/ http://www.mysql.com/ Interazione tra basi di dati e web Risorse 48