php - Dipartimento di Ingegneria dell`Informazione

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("<", "<", $titolo);
str_replace(">", ">", $titolo);
str_replace("<", "<", $autore);
str_replace(">", ">", $autore);
str_replace("<", "<", $testo);
str_replace(">", ">", $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