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 ©