La tavola CRUD: nozioni di base per la gestione dei dati
Il termine CRUD è strettamente collegato alla gestione dei dati digitali. Detto più precisamente, CRUD è un acronimo, che deriva dalle iniziali dalle quattro operazioni fondamentali compiute nei database:
- Create (creare i dati)
- Read o Retrieve (leggere i dati)
- Update (aggiornare i dati)
- Delete o Destroy (eliminare i dati)
Più semplicemente la tavola CRUD riassume le funzioni di cui un utente ha bisogno per creare e gestire i dati. I diversi processi per la gestione dei dati si basano sul CRUD, dove le operazioni sono adattate specificamente alle richieste del sistema e dell’utente, a prescindere dal fatto che si gestiscano dei database o si usino delle applicazioni. Così le operazioni sono gli strumenti di accesso tipici e irrinunciabili con cui gli esperti possono ad esempio verificare dei problemi del database, mentre con una tavola CRUD un utente può creare (create) un account e utilizzarlo (read) quando vuole, aggiornarlo (update) o eliminarlo (delete). Le operazioni CRUD vengono eseguite in maniera diversa a seconda dell’ambiente di programmazione in cui si trovano, come mostra la tabella seguente:
Operazione CRUD | SQL | RESTful HTTP | XQuery |
Create | INSERT | POST, PUT | insert |
Read | SELECT | GET, HEAD | copy/modify/return |
Update | UPDATE | PUT, PATCH | replace, rename |
Delete | DELETE | DELETE | delete |
- Certificato SSL Wildcard incluso
- Registrazione di dominio sicura
- Indirizzo e-mail professionale da 2 GB
Framework CRUD: livello di accesso per i database
Se i singoli oggetti si visualizzano grazie ad un’interfaccia grafica e si modificano tramite le citate operazioni CRUD, si parla di un framework CRUD o anche di una griglia CRUD. Solitamente si tratta di interfacce HTML. Un framework CRUD prevede diversi passaggi, così che i dati non vengano modificati dopo la loro immissione, ma solo dopo aver cliccato su “Salva” o “Avanti”. Le operazioni di un framework CRUD si possono eseguire anche in diversi momenti, senza che per questo lasso di tempo i dati vengano bloccati per altri utenti. Questa proprietà è molto importante, specialmente per i sistemi con più utenti, perché in questo modo più persone possono avere accesso agli stessi dati in un database contemporaneamente.
Per realizzare le operazioni vengono utilizzati i livelli di persistenza, che solitamente sono compresi nel framework sotto forma di estensioni (moduli) o possono essere implementati successivamente. Queste estensioni suddividono i database nelle forme relazionali, tabellari e li presentano su un livello orientato agli oggetti. I framework CRUD facilitano lo sviluppo e l’utilizzo delle applicazioni tramite un accesso ottimizzato al sistema di database in uso. Esistono innumerevoli framework CRUD, che si basano sulle diverse lingue e piattaforme. Trovate alcuni esempi nella seguente tabella:
Linguaggio die programmazione o piattaforma | Framework |
Java | JDBC (The Java Database Connectivity), Hibernate, JBoss Seam, Isis |
PHP | Yii, CakePHP, Zikula, Symfony, TYPO3 Flow |
Perl | Catalyst, Gantry |
Python | Django, SQLAlchemy, web2py |
Groovy | Grails |
.NET | NHibernate, ADO.NET/Entity Framework |
Ruby | Ruby on Rails |
JavaScript | Backbone.js, AngularJS |
Come sviluppare una griglia CRUD in PHP per il proprio database
Nei paragrafi successivi vi mostriamo come creare un’interfaccia di Bootstrap, a cui si accede tramite operazioni CRUD, per il più conosciuto sistema di database, MySQL. Inoltre verrà anche configurata l’operazione create. Per manipolare opportunamente le tabelle del database, viene utilizzato il linguaggio di scripting lato server PHP tramite l’estensione PHP Data Objects (PDO).
1. Nel primo passaggio si crea una tabella semplice del database, che successivamente verrà manipolata in questo tutorial tramite accesso CRUD. Importate quindi la seguente tabella di esempio nel vostro database MySQL:
CREATE TABLE `customers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 100 ) NOT NULL ,
`email` VARCHAR( 100 ) NOT NULL ,
`mobile` VARCHAR( 100 ) NOT NULL
) ENGINE = INNODB;
La tabella serve per raccogliere informazioni sull’utente, come nome, indirizzo e-mail e numero di cellulare. Ogni voce riceve automaticamente una “primary key” (AUTO_INCREMENT PRIMARY KEY), cioè un ID univoco.
2. Dopo bisogna stabilire come avviene la connessione e la disconnessione al database. Create un file PHP con il nome database.php e aggiungete il seguente script con la classe “Database” per gestire le connessioni al database:
<?php
class Database
{
private static $dbName = 'nome_del_database';
private static $dbHost = 'localhost';
private static $dbUsername = 'nome_utente';
private static $dbUserPassword = 'password';
private static $cont = null;
public function __construct() {
die('funzione Init non consentita');
}
public static function connect() {
//Consentire solo una connessione durante il tempo totale di accesso
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;
}
}
Per poter utilizzare anche qui la classe definita per l’accesso al database con PDO, dovete inserire i valori esatti per le quattro voci $dbName (nome del database in uso), $dbHost (nome dell’host sul quale viene eseguito il database, solitamente localhost, come indicato nell’esempio), $dbUsername (nome dell’utente che accede al database) e $dbUserPassword (password dell’utente che accede al database).
In questo script sono assegnate tre funzioni alla classe “database”: __construct(), il costruttore della classe, che ricorda agli utenti che l’inizializzazione (quindi l’assegnazione di un valore iniziale) non è consentita. Con connect() si indica la funzione principale della classe, che regola la connessione, mentre disconnect() serve per terminarla.
3. Le operazioni CRUD si possono eseguire solo ricorrendo alla giusta interfaccia e per questo deve essere creata la griglia di base con Bootstrap. La versione attuale del framework è disponibile sul sito ufficiale. Decomprimete il programma nella stessa cartella in cui si trova anche il file database.php e create anche un altro file con il nome index.php, dove realizzare la vostra interfaccia:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<h3>La mia griglia CRUD in PHP</h3>
</div>
<div class="row">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Nome</th>
<th>Indirizzo e-mail</th>
<th>Numero di cellulare</th>
</tr>
</thead>
<tbody>
<?php
include 'database.php';
$pdo = Database::connect();
$sql = 'SELECT * FROM customers ORDER BY id DESC';
foreach ($pdo->query($sql) as $row) {
echo '<tr>';
echo '<td>' . $row['name'] . '</td>';
echo '<td>' . $row['email'] . '</td>';
echo '<td>' . $row['mobile'] . '</td>';
echo '</tr>';
}
Database::disconnect();
?>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>
Nell’<head> del documento sono stati inseriti i file CSS e JavaScript di Bootstrap, mentre nel <body> si ritrova il file database.php, precedentemente creato, comprensivo dei comandi per stabilire una connessione con PDO, (Database::connect()), e il riferimento ai dati corrispondenti (SELECT). Inoltre nel file è presente una tabella HTML <table> con tre colonne (nome, indirizzo e-mail e numero di cellulare), che sono anche salvate nel database.
4. Per poter mantenere la struttura di base, bisogna realizzare le diverse operazioni CRUD. Per implementare ad esempio l’operazione create, vi serve un’altra pagina HTML con moduli per l’inserimento dei dati utente, che vengono collegati nel file index.php e che si possono raggiungere tramite un pulsante aggiunto nell’interfaccia di Bootstrap. Per questioni di semplicità potete cominciare con la creazione di questo pulsante, aprendo nuovamente il file index.php e aggiungendo il seguente codice nel secondo elemento <div class="row">, contenuto nella tabella:
<p>
<a href="create.php" class="btn btn-success">Create</a>
</p>
Già in questa parte di codice potete notare che ci si è collegati al file create.php, che prima non esisteva affatto. Un test sulla griglia Bootstrap allo stato attuale mostra quindi il pulsante, ma un click sullo stesso porta solo ad una pagina di errore. Per rendere l’operazione create definitivamente disponibile, create il file create.php già nominato e aggiungete la prima parte del codice seguente:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="span10 offset1">
<div class="row">
<h3>Create a Customer</h3>
</div>
<form class="form-horizontal" action="create.php" method="post">
<div class="form-group <?php echo !empty($nameError)?'has-error':'';?>">
<label class="control-label">Nome</label>
<div class="controls">
<input name="name" type="text" placeholder="Nome" value="<?php echo !empty($name)?$name:'';?>">
<?php if (!empty($nameError)): ?>
<span class="help-inline"><?php echo $nameError;?></span>
<?php endif; ?>
</div>
</div>
<div class="form-group <?php echo !empty($emailError)?'has-error':'';?>">
<label class="control-label">Indirizzo e-mail</label>
<div class="controls">
<input name="email" type="text" placeholder="Indirizzo e-mail" value="<?php echo !empty($email)?$email:'';?>">
<?php if (!empty($emailError)): ?>
<span class="help-inline"><?php echo $emailError;?></span>
<?php endif;?>
</div>
</div>
<div class="form-group <?php echo !empty($mobileError)?'has-error':'';?>">
<label class="control-label">Numero di cellulare</label>
<div class="controls">
<input name="mobile" type="text" placeholder="Numero di cellulare" value="<?php echo !empty($mobile)?$mobile:'';?>">
<?php if (!empty($mobileError)): ?>
<span class="help-inline"><?php echo $mobileError;?></span>
<?php endif;?>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-success">Create</button>
<a class="btn" href="index.php">Back</a>
</div>
</form>
</div>
</div> <!-- /container -->
</body>
</html>
Il codice genera il modulo HTML, dove inserire le singole informazioni sul nome, il numero di cellulare e l’indirizzo e-mail. In aggiunta è stata creata una variabile PHP per ogni campo, che genera un messaggio di errore se combinata con la seguente estensione del codice (da inserire prima del codice HTML nel file create.php), qualora il campo preso in considerazione rimanga vuoto terminata la compilazione:
<?php
require 'database.php';
if ( !empty($_POST)) {
// Rilevare un errore alla conferma
$nameError = null;
$emailError = null;
$mobileError = null;
// Rilevare i valori inseriti
$name = $_POST['name'];
$email = $_POST['email'];
$mobile = $_POST['mobile'];
// Confermare l’inserimento
$valid = true;
if (empty($name)) {
$nameError = 'Inserire un nome';
$valid = false;
}
if (empty($email)) {
$emailError = 'Inserire un indirizzo e-mail';
$valid = false;
} else if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) {
$emailError = 'Inserire un indirizzo e-mail valido';
$valid = false;
}
if (empty($mobile)) {
$mobileError = 'Inserire un numero di cellulare';
$valid = false;
}
// Inserire i dati
if ($valid) {
$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO customers (name,email,mobile) values(?, ?, ?)";
$q = $pdo->prepare($sql);
$q->execute(array($name,$email,$mobile));
Database::disconnect();
header("Location: index.php");
}
}
?>
Così avete creato una pagina create.php, che può essere aperta con un click sul pulsante create e che consente l’inserimento delle informazioni utente. Lo script assicura che vengano rilevati tutti i dati inseriti e gli errori di conferma, che compaiano i messaggi di errore nel caso di inserimento errato e che i dati vengano inoltrati al database indicato. Scoprite come poter utilizzare le altre operazioni CRUD, quali read, update e delete, in questo tutorial, che spiega nuovamente come si crea una griglia con Bootstrap e l’operazione create.