Laboratorio di sistemi Web Application in Php5 Php Applicazioni

Transcript

Laboratorio di sistemi Web Application in Php5 Php Applicazioni
Laboratorio di sistemi
Web Application in Php5
Php
Applicazioni web con Xampp, Php5 e NetBeans 6.5 (Windows)
Vogliamo ora riscrivere a titolo di prova un'applicazione web precedentemente scritta in Java
(si legga l'articolo all'indirizzo http://www.mauriziocozzetto.net/pdf/DAO_MySQL.pdf). Il
problema è quello solito: da una casella a scorrimento, l'utente seleziona uno scrittore e
l'applicativo restituisce l'elenco dei libri scritti da quell'autore. Se l'utente clicca su “Dettagli
libro”, è possibile vedere ulteriori dettagli del libro selezionato.
Fig. 1 – I libri (in questo caso solo uno) scritti da Michael Bowers
Fig. 2 – Dettagli del libro con immagine di copertina e introduzione
DAO_mySQL_Php5.pdf
Pag. 1/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
Il modello a oggetti e il modello relazionale
I due modelli sviluppati per l'applicazione Java (modello relazionale e corrispondente modello
a oggetti) sono ancora validi e non vi sono segnalazioni particolari da fare, eccetto forse
qualche leggera differenza nei nomi dei metodi della classe DAO e la presenza di una classe di
utilità contenente un unico metodo statico per la redirezione dell'url.
L'applicativo web è costituito dalle classi Autore.php, Libro.php, DAO.php, Editore.php,
Utility.php (raccolte in un'unica cartella di nome classes), da due pagine php, index.php e
index2.php e da un insieme di risorse (immagini delle copertine dei libri) collocate nella cartella
img. Il database usato è biblio_db, che è lo stesso database usato nell'applicazione web Java
BibliotecaDAOWebApp2, con la stessa struttura delle tabelle e gli stessi dati.
Codice
Riportiamo di seguito tutto il codice delle classi per consentirvi di confrontare le due soluzioni
(Java e Php): noterete davvero molte analogie.
Le differenze riguardano invece la gestione degli errori in Java (mentre in Php possiamo
controllare i valori assunti dalle funzioni), l'uso intensivo degli array associativi in Php (che non
dispone di strutture dati di particolare interesse) mentre in Java abbiamo usato l' interfaccia
List e le corrispondente struttura dati concreta che la implementa (ArrayList).
Per l'accesso al database MySQL, abbiamo fatto uso delle funzioni built-in del Php
mysql_connect(), mysql_select_db(), mysql_query(), mysql_fetch_array() ecc. In questo caso
(Php) in effetti l'accesso al database MySQL risulta semplificato in quanto non dobbiamo
scaricare driver particolari, mentre, se desideriamo cambiare tipo di database, dobbiamo
invece riscrivere e riadattare gran parte del codice della classe DAO. In Java non è necessario
intervenire sul codice direttamente ma è sufficiente cambiare i driver e la url di accesso al db
come spiegato a suo tempo. In alternativa possiamo appoggiarci ad un ulteriore strato
software aggiuntivo (database abstraction layer) che farà da ponte tra l'applicativo e i diversi
tipi di database (usando ad esempio le classi del package MDB2 del repository PEAR,
http://pear.php.net/manual/en/package.database.mdb2.intro.php).
<?php
/**
* Description of Autore
*
* @author maurizio
*/
class Autore {
private $idAutore;
private $cognome;
private $nome;
// costruttore
// si può scrivere anche function Autore(...)
function __construct($idAutore, $cognome, $nome) {
$this->idAutore = $idAutore;
$this->cognome = $cognome;
$this->nome = $nome;
}
// setter e getter
function set_idAutore($idAutore){
$this->idAutore = $idAutore;
}
DAO_mySQL_Php5.pdf
Pag. 2/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
function get_idAutore() {
return $this->idAutore;
}
function set_cognome($cognome){
$this->cognome = $cognome;
}
function get_cognome() {
return $this->cognome;
}
function set_nome($nome){
$this->nome = $nome;
}
function get_nome() {
return $this->nome;
}
function anagrafica() {
return $this->nome." ".$this->cognome;
}
} // fine classe Autore
?>
<?php
/**
* Description of DAO
*
* @author maurizio
*/
class DAO {
private $conn; // rappresenta la connessione al database
// costruttore
// E' possibile scrivere anche function DAO() ecc
function __construct() {
}
function setConn($conn) {
$this->conn = $conn;
}
function getConn() {
return $this->conn;
}
// trova gli autori dei libri
function trovaListaAutori() {
$listaAutori = array();
$rs = @mysql_query("SELECT DISTINCT * FROM autori_tbl",$this->conn);
DAO_mySQL_Php5.pdf
Pag. 3/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
// se per qualche motivo la query fallisce ritorniamo -1
if ($rs==false) {
return -1;
}
// leggiamo le righe risultato
while ($row = mysql_fetch_array($rs)) {
$autore = new Autore($row["idAutore"],$row["cognome"],$row["nome"]);
// carico l'autore in un vettore
$listaAutori[]= $autore;
}
// veramente necessario per “grandi” insiemi di risultati
//mysql_free_result($rs);
return $listaAutori;
} // fine metodo trovaListaAutori
// trova l'elenco dei libri disponibili
function trovaListaLibri() {
$listaLibri = array();
//$lista[]=new Libro("23-434-3233-4","Titolo1");
//$lista[]=new Libro("43-234-5444-3","Titolo2");
// si leggano i commenti del metodo precedente...
$rs = @mysql_query("SELECT * FROM libri_tbl",$this->conn);
if ($rs==false) {
return -1;
}
while ($row = mysql_fetch_array($rs)) {
// carico il libro in un vettore dei libri
$listaLibri[]=new Libro($row["isbn"],$row["titolo"]);
}
//mysql_free_result($rs);
return $listaLibri;
} // fine metodo trovaListaLibri
// restituisce l'elenco dei libri scritti da un certo autore
function trovaListaLibriPerAnagraficaAutore($anagrafica) {
$listaLibri = array();
$rs = @mysql_query("SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE
autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND
Concat(RTrim(autori_tbl.nome),' ',RTrim(autori_tbl.cognome)) = '".$anagrafica."'",$this>conn);
if ($rs==false) {
return -1;
}
DAO_mySQL_Php5.pdf
Pag. 4/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
while ($row = mysql_fetch_array($rs)) {
$isbn = $row["isbn"];
$titolo = $row["titolo"];
$idAutore = $row["idAutore"];
$cognome = $row["cognome"];
$nome = $row["nome"];
$idEditore = $row["idEditore"];
$nomeEditore = $row["nomeEditore"];
$imgUrl = $row["imgUrl"];
$intro = $row["intro"];
// istanziamo l' autore
$autore = new Autore($idAutore, $cognome, $nome);
// istanziamo l'editore
$editore = new Editore( $idEditore, $nomeEditore);
// istanziamo il libro
$libro = new Libro($isbn, $titolo, $imgUrl, $intro, $autore, $editore);
// carico il listro in un vettore
$listaLibri[] = $libro;
}
//mysql_free_result($rs);
return $listaLibri;
} // fine function
// restituisce un libro noto l'isbn
function libro($isbn) {
$libro=null;
$rs = @mysql_query("SELECT * FROM libri_tbl, autori_tbl, editori_tbl WHERE
autori_tbl.idAutore = libri_tbl.idAutore AND editori_tbl.idEditore = libri_tbl.idEditore AND
libri_tbl.isbn = '".$isbn."'",$this->conn);
if ($rs==false) {
return -1;
}
$row = mysql_fetch_array($rs);
if ($row!=null) {
$isbn = $row["isbn"];
$titolo = $row["titolo"];
$idAutore = $row["idAutore"];
$cognome = $row["cognome"];
$nome = $row["nome"];
$idEditore = $row["idEditore"];
$nomeEditore = $row["nomeEditore"];
$imgUrl = $row["imgUrl"];
$intro = $row["intro"];
DAO_mySQL_Php5.pdf
Pag. 5/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
// creo l'autore
$autore = new Autore($idAutore, $cognome, $nome);
// creo l'editore
$editore = new Editore( $idEditore, $nomeEditore);
// creo il libro
$libro = new Libro($isbn, $titolo, $imgUrl, $intro, $autore, $editore);
// carico il libro in un vettore
$listaLibri[] = $libro;
}
//mysql_free_result($rs);
}
return $libro;
// apro la connessione al db
function openConn() {
$this->conn = @mysql_connect("localhost", "root", "");
if ($this->conn) {
$db = @mysql_select_db("biblio_db", $this->conn);
if ($db==false)
return false;
else
return true;
} else
return false;
} // fine metodo openConn
// chiudo la connessione col db
function closeConn() {
$closedConn = @mysql_close($this->conn);
if ($closedConn==false) {
return false;
} else
return true;
} // fine metodo closeConn
} // fine classe DAO
?>
<?php
/**
* Description of Editore
*
* @author maurizio
*/
class Editore {
DAO_mySQL_Php5.pdf
Pag. 6/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
private $idEditore;
private $nomeEditore;
private $indirizzoEditore;
private $cittaEditore;
// costruttore
function __construct($idEditore, $nomeEditore) {
$this->idEditore = $idEditore;
$this->nomeEditore = $nomeEditore;
}
// setter e getter
function set_nomeEditore($nomeEditore) {
$this->nomeEditore = $nomeEditore;
}
function get_nomeEditore() {
return $this->nomeEditore;
}
function set_idEditore($idEditore) {
$this->idEditore = $idEditore;
}
function get_idEditore() {
return $this->idEditore;
}
function set_indirizzoEditore($indirizzoEditore) {
$this->indirizzoEditore = $indirizzoEditore;
}
function get_indirizzoEditore() {
return $this->indirizzoEditore;
}
function set_cittaEditore($cittaEditore) {
$this->cittaEditore = $cittaEditore;
}
function get_cittaEditore() {
return $this->cittaEditore;
}
} // fine classe Editore
?>
<?php
/**
* Description of Libro
* @author maurizio
*/
class Libro {
private $isbn;
private $titolo;
private $prezzo;
DAO_mySQL_Php5.pdf
Pag. 7/13
Cozzetto ©
Laboratorio di sistemi
private
private
private
private
Web Application in Php5
Php
$imgUrl;
$intro;
$editore;
$autore;
// costruttore
function __construct($isbn, $titolo, $imgUrl, $intro, $autore, $editore) {
$this->isbn = $isbn;
$this->titolo = $titolo;
$this->autore = $autore;
$this->editore = $editore;
$this->imgUrl = $imgUrl;
$this->intro = $intro;
}
// setter e getter
function set_isbn($isbn){
$this->isbn = $isbn;
}
function get_isbn() {
return $this->isbn;
}
function set_titolo($titolo){
$this->titolo = $titolo;
}
function get_titolo() {
return $this->titolo;
}
function set_prezzo($prezzo){
$this->prezzo = $prezzo;
}
function get_prezzo() {
return $this->prezzo;
}
function set_editore($editore){
$this->editore = $editore;
}
function get_editore() {
return $this->editore;
}
function set_autore($autore){
$this->autore = autore;
}
function get_autore() {
return $this->autore;
}
DAO_mySQL_Php5.pdf
Pag. 8/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
function get_imgUrl() {
return $this->imgUrl;
}
function get_intro() {
return $this->intro;
}
function set_imgUrl($imgUrl) {
$this->imgUrl=$imgUrl;
}
function set_intro($intro) {
$this->intro=$intro;
}
} // fine classe Libro
?>
<?php
/**
* Description of Utility
* @author maurizio
*/
class Utility {
// metodo statico per la redirezione della url
static function redirect($url,$tempo = FALSE ) {
if(!headers_sent() && $tempo == FALSE ){
header('Location:' . $url);
}elseif(!headers_sent() && $tempo != FALSE ){
header('Refresh:' . $tempo . ';' . $url);
}else{
if($tempo == FALSE ){
$tempo = 0;
}
echo "<meta http-equiv=\"refresh\" content=\"" . $tempo . ";url=" . $url . "\">";
} // fine if
}
} // fine metodo
?>
File index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?php
include("classes/Autore.php");
include("classes/DAO.php");
include("classes/Editore.php");
include("classes/Libro.php");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
DAO_mySQL_Php5.pdf
Pag. 9/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
<title>Libri scritti da un certo autore</title>
<style type="text/css">
body,td,th {
font-family: "Trebuchet MS";
font-size: 16px;
}
</style>
</head>
<body>
<h3>Libri scritti da un certo autore</h3>
<?php
// creo l'oggetto dao
$dao = new DAO();
// apro la connessione col db
// la disconnessione avviene automaticamente quando o chiudo la pagina
// o quando cambio pagina quindi non è riportata esplicatamente
if ($dao->openConn()==false) {
echo("Impossibile aprire la connessione col server di database e con biblio_db");
return;
}
// trovo gli autori e li carico in una combo box
$listaAutori = $dao->trovaListaAutori();
if ($listaAutori==-1) {
echo("Errori nella query: ".mysql_error());
return;
}
if ($listaAutori==null) {
echo ("Non ci sono autori");
return;
}
?>
<form name="provaFrm" action="<?php echo($_SERVER['PHP_SELF']); ?>"
method="GET">
<select name="autoreMnu">
<?php
// caricamento della combo box
for ($i=0; $i<count($listaAutori); $i++)
echo ("<option>".$listaAutori[$i]->anagrafica()."</option>");
?>
</select>
<input type="submit" name="inviaBtn" value="Invia"/>
</form>
DAO_mySQL_Php5.pdf
Pag. 10/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
<?php
// se l'utente non ha premuto il tasto Invia
if ($_GET["inviaBtn"]==null) {
return;
}
// mi faccio dare l'anagrafica
$anagrafica = $_GET["autoreMnu"];
// trovo tutti i libri scritti da un certo autore di cui è nota l'anagrafica
$listaLibri = $dao->trovaListaLibriPerAnagraficaAutore($anagrafica);
if ($listaLibri==-1) {
echo("Errori nella query: ".mysql_error());
return;
} // fine if
if ($listaLibri==null) {
echo("Non ci sono libri scritti da ".$anagrafica);
return;
}
// visualizzo l'elenco dei titoli
for ($i=0; $i<count($listaLibri); $i++) {
$editore = $listaLibri[$i]->get_editore();
$autore = $listaLibri[$i]->get_autore();
echo ($listaLibri[$i]->get_isbn()." | ".$listaLibri[$i]->get_titolo()." | ".$editore>get_nomeEditore()." | ".$autore->anagrafica()." | <a href='index2.php?isbn=".
$listaLibri[$i]->get_isbn()."'>Dettagli</a><br/>");
}
?>
</body>
</html>
File index2.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<?php
include("classes/Autore.php");
include("classes/DAO.php");
include("classes/Editore.php");
include("classes/Libro.php");
include("classes/Utility.php");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
<title>Scheda libro</title>
<style type="text/css">
body,td,th {
font-family: Verdana;
font-size: 16px;
border: 0px;
}
DAO_mySQL_Php5.pdf
Pag. 11/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
.sinistra {
float: left;
}
.testoGrandeCorsivo {
font-style: italic;
font-size: 16px;
}
</style>
</head>
<body>
<h3>Dettagli libro</h3>
<?php
// creo l'oggetto dao
$dao = new DAO();
// apro la connessione col db
if ($dao->openConn()==false) {
echo("Impossibile aprire la connessione col server di database e con biblio_db");
return;
}
// se l'utente ha cliccato sul link Dettagli nella pagina index.php
if ($_GET["isbn"]!=null) {
$isbn = $_GET["isbn"];
// trovo il libro con questo isbn
$l = $dao->libro($isbn);
if ($l==-1) {
echo ("Errori nella query: ".mysql_error());
return;
}
// se c'è un libro
if ($l!=null) {
// se il libro ha una immagine di copertina
if ($l->get_imgUrl()!=null) {
echo("<img src=img/".$l->get_imgUrl()." align=left />");
}
// visualizzo la scheda del libro
echo("<i>Isbn</i>: ".$l->get_isbn());
echo("<br/>");
echo("<i>Titolo</i>: ".$l->get_titolo());
echo("<br/>");
$editore = $l->get_editore();
echo("<i>Editore</i>: ".$editore->get_nomeEditore());
DAO_mySQL_Php5.pdf
Pag. 12/13
Cozzetto ©
Laboratorio di sistemi
Web Application in Php5
Php
echo("<br/>");
$autore = $l->get_autore();
echo("<i>Autore</i>: ".$autore->anagrafica());
echo("<br/><br/>");
echo("<i>Introduzione</i>: ".$l->get_intro());
} else {
echo("Il codice isbn non è valido.<br/>");
echo("Attendere qualche secondo...<br/>");
Utility::redirect("index.php",3);
}
} else {
echo("L'utente non ha selezionato il link Dettagli.<br/>");
echo("Attendere qualche secondo...<br/>");
Utility::redirect("index.php",3);
}
?>
</body>
</html>
DAO_mySQL_Php5.pdf
Pag. 13/13
Cozzetto ©