03/11/16
1
CRUD cycle
Ing. Lucia [email protected]
Architettura
2
� Tipicamente i dati sono memorizzati in un DB MySQL� PHP è il linguaggio server-side che manipola le tabelle MySQL per
consentire all’utente nel front-end di eseguire azioni (CRUD) suidati
03/11/16
2
Prepariamo la sorgente dati
3
Person
IDNameSurnameCityBirthdate
CREATE TABLE `Person` (ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,`Name` VARCHAR(45) NOT NULL ,`Surname` VARCHAR(45) NOT NULL ,`City` VARCHAR(45) NOT NULL,`Birthdate` DATE, ) ENGINE = INNODB;
Classe php per la connessione al DB
4
<?phpclass Database{
private static $dbName = ’ClienteAcquistaProdotto' ;private static $dbHost = 'localhost' ;private static $dbUsername = 'root';private static $dbUserPassword = 'root';private static $cont = null;public function __construct() {
die('Init function is not allowed');}public static function connect(){
if ( null == self::$cont ){try {
self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
} catch(PDOException $e) {die($e->getMessage());
}}return self::$cont;
}public static function disconnect(){
self::$cont = null;}
}?>
03/11/16
3
PDO (Php Data Objects)
� PDO è un’estensione (introdotta nell'implementazione della versione 5di PHP) che definisce un’interfaccia unica, leggera e consistente peraccedere alle basi di dati e che offre allo sviluppatore una classe ingrado di fornire metodi utilizzabili indipendentemente dal DBMS diriferimento.
� PDO fornisce un data-access abstraction layer, cioè un livello diastrazione per l'accesso ai dati; si tratta infatti di una classe, definitaforse impropriamente anche come "libreria", che mette a disposizioneun insieme di sotto-classi derivate che agiscono in modo trasparenterispetto all'utente
5
PDO (Php Data Objects)
� Se PDO non è abilitato: aprire il file di configurazione php.ini edecommentare
� Decommentare poi le righe relative alle DLL di supporto per i DBMSche si desidera utilizzare
6
03/11/16
4
Classe php per la connessione al DB
7
<?phpclass Database{
private static $dbName = ’ClienteAcquistaProdotto' ;private static $dbHost = 'localhost' ;private static $dbUsername = 'root';private static $dbUserPassword = 'root';private static $cont = null;public function __construct() {
die('Init function is not allowed');}public static function connect(){
if ( null == self::$cont ){try {
self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
} catch(PDOException $e) {die($e->getMessage());
}}return self::$cont;
}public static function disconnect(){
self::$cont = null;}
}?>
Classe php per la connessione al DB
8
<?phpclass Database{
private static $dbName = ’ClienteAcquistaProdotto' ;private static $dbHost = 'localhost' ;private static $dbUsername = 'root';private static $dbUserPassword = 'root';private static $cont = null;public function __construct() {
die('Init function is not allowed');}public static function connect(){
if ( null == self::$cont ){try {
self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
} catch(PDOException $e) {die($e->getMessage());
}}return self::$cont;
}public static function disconnect(){
self::$cont = null;}
}?>
Costruttore della classe DatabaseEssendo una classe statica, l’inizializzazione della classe non è consentita. Per impedire l’abuso della classe, inseriamo un die() per ricordarlo all’utente
03/11/16
5
Classe php per la connessione al DB
9
<?phpclass Database{
private static $dbName = ’ClienteAcquistaProdotto' ;private static $dbHost = 'localhost' ;private static $dbUsername = 'root';private static $dbUserPassword = 'root';private static $cont = null;public function __construct() {
die('Init function is not allowed');}public static function connect(){
if ( null == self::$cont ){try {
self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
} catch(PDOException $e) {die($e->getMessage());
}}return self::$cont;
}public static function disconnect(){
self::$cont = null;}
}?>
Funzione principale della classe. Usa il pattern Singleton per assicurarsi che esista una sola connessione PDO per l’intera applicazione
Classe php per la connessione al DB
10
<?phpclass Database{
private static $dbName = ’ClienteAcquistaProdotto' ;private static $dbHost = 'localhost' ;private static $dbUsername = 'root';private static $dbUserPassword = 'root';private static $cont = null;public function __construct() {
die('Init function is not allowed');}public static function connect(){
if ( null == self::$cont ){try {
self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword);
} catch(PDOException $e) {die($e->getMessage());
}}return self::$cont;
}public static function disconnect(){
self::$cont = null;}
}?>
Imposta a NULL la connessione. Viene chiamata per chiudere la connessione al database
03/11/16
6
Grid per le operazioni CRUD
11
� Bootstrap: una raccolta di strumenti liberi per lacreazione di siti e applicazioni per il Web
� Contiene modelli di progettazione basati su HTML e CSS,sia per la tipografi a, che per le varie componentidell'interfaccia, come moduli, pulsanti e navigazione, cosìcome alcune estensioni opzionali di JavaScript
� È compatibile con le ultime versioni di tutti i principalibrowser
� Dalla versione 2.0 supporta anche il responsive webdesign: il layout delle pagine web si regola dinamicamente,tenendo conto delle caratteristiche del dispositivoutilizzato, sia esso desktop, tablet o smartphone
� A partire dalla versione 3.0, Bootstrap ha adottato ilresponsive design come impostazione predefinita,sottolineando il suo essere nata come libreriamultidispositivo e multipiattaforma
Bootstrap
12
Scarichiamo Bootstrap dal sito ufficialehttp://getbootstrap.com/getting-started/#download
ver 3.3.7
03/11/16
7
Nuovo progetto php
13
Oltre ai file di Bootstrap necessitiamo di:• 4 file php per le operazioni CRUD
(create.php, read.php, update.php, delete.php)
• 1 classe database.php per la connessioneal database (classe Database vista prima)
• 1 file index.php che contiene la grigliaBootstrap
14
<!DOCTYPE html><html lang="en">
<head><meta charset="utf-8"><link href="css/bootstrap .min .css” rel="stylesheet"><script src="js/bootstrap .min .js"></script>
</head><body>
<div class="container"><div class="row">
<h3>My PHP CRUD</h3></div><div class="row">
<table class="table table-striped table-bordered"><thead>
<tr><th>Name</th><th>Surname</th><th>City</th><th>Birthdate</th><th>Action</th>
</tr></thead><tbody>
<?phpinclude 'database.php ';$pdo = Database::connect();$sql = 'SELECT * FROM Person ORDER BY ID DESC';
foreach ($pdo->query($sql) as $row ) {echo '<tr>';echo '<td>'. $row [’Name'] . '</td>';echo '<td>'. $row [’Surname'] . '</td>';echo '<td>'. $row [’City'] . '</td>';echo '<td>'. $row [’Birthdate'] . '</td>';echo '</tr>';
}Database::disconnect();
?></tbody>
</table></div>
</div></body>
</html>
index.php
03/11/16
8
15
index.php
16
Aggiungiamo alla index il bottone Create…
….....<div class="row">
<p><ahref="create .php" class="btn btn-success">Create</a>
</p><table class="table table-striped table-bordered">
<thead><tr>
<th>Name</th><th>Surname</th><th>City</th><th>Birthdate</th>
</tr></thead>…...
03/11/16
9
17
...e i bottoni per le operazioni CRUD….....<tbody>
<?phpinclude 'database.php ';$pdo = Database::connect();$sql = 'SELECT * FROM Person ORDER BY ID DESC';foreach ($pdo->query($sql) as $row ) {
echo '<tr>';echo '<td>'. $row [’Name'] . '</td>';echo '<td>'. $row [’Surname'] . '</td>';echo '<td>'. $row [’City'] . '</td>';echo '<td>'. $row [’Birthdate'] . '</td>';echo '<td width=250>';echo '<aclass="btn" href="read.php?id='.$row['ID'] .'">Read</a>';echo ' ';echo '<aclass="btn btn-success" href="update .php?id='.$row['ID'] .'">Update</a>';echo ' ';echo '<aclass="btn btn-danger" href="delete.php?id='.$row['ID'] .'">Delete</a>';echo '</td>';echo '</tr>';
}Database::disconnect();
?></tbody>….....
18
create.php
03/11/16
10
19
create.php
20
read.php
03/11/16
11
21
read.php
22
update.php
03/11/16
12
23
update.php
24
delete.php
03/11/16
13
Navighiamo nell’applicazione…
25
26
03/11/16
14
27