Un'operazione di routine che viene effettuata a partire da una lista di record, è la visualizzazione del dettaglio di ciascun record. Per questo abbiamo inserito un link che richiama la stessa pagina passando via querystring due parametri, l'azione da compiere, il dettaglio, e l'id del record da visualizzare. Ricaricando la stessa pagina, il parametro dell'azione permette di essere catturati dallo switch
e chiamare l'apposita funzione dettaglio()
, l'id invece sarà recuperato a inizio pagina e ripulito tramite le filter_var
con il parametro SANITIZE_NUMBER_INT
.
function dettaglio() {
global $id, $connection;
$sql="SELECT * FROM utenti WHERE id=:id";
$stmt = $connection->prepare($sql);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$out='
Nome: '.$row['nome'].'
';
$out.='
Cognome: '.$row['cognome'].'
';
$out.='
Email: '.$row['email'].'
';
return($out);
}
A dettaglio()
passiamo le variabili $connection
e $id
tramite global
e poi impostiamo la query SELECT
parametrica che recupererà i campi della tabella dell'utente quando l'id è uguale al valore ottenuto tramite la lettura della querystring.
Prepariamo la query parametrica, associamo al parametro :id
la variabile $id
e specifichiamo che si tratta di un numero intero. Quindi eseguiamo la query e nella variabile $row
inseriamo i dati del record restituito tramite fetch()
, usiamo il FETCH_ASSOC
per poter usare i nomi dei campi come etichette. Infine costruiamo la stringa HTML da restituire come output della funzione e stampare nella pagina.
Modifica dei dati
La modifica di un record è un'operazione che prevede il caricamento di un form pre-compilato con i dati inseriti, nel nostro caso sarà uguale al form di inserimento e i dati verranno presi sfruttando la stessa query che abbiamo usato per il dettaglio.
La regola della modifica è che se l'utente salva senza modificare nulla dovrà trovare gli stessi dati di partenza. Pertanto possiamo riciclare la query della funzione dettaglio()
e l'ouput HTML usato per il form di creazione degli utenti. L'unica modifica sarà inserire il valore del value dei campi di input che dovrà essere valorizzato con i dati estratti.
function form() {
global $id, $connection;
$sql = "SELECT * FROM utenti WHERE id=:id";
$stmt = $connection->prepare($sql);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$out='';
$out.='<form name="info" action="?" method="post">';
$out.='<input type="hidden" id="id" name="id" value="'.$id.'">';
$out.='<input type="hidden" id="azione" name="azione" value="salva">';
$out.='<label for="nome">Nome</label><br /><input type="text" id="nome" name="nome" value="'.$row['nome'].'"><br />';
$out.='<label for="cognome">Cognome</label><br /><input type="text" id="cognome" name="cognome" value="'.$row['cognome'].'"><br />';
$out.='<label for="email">Email</label><br /><input type="email" id="email" name="email" value="'.$row['email'].'"><br />';
$out.='<input type="submit" class="btn btn-success" value="Salva">';
$out.='</form>';
return($out);
}
Come nel caso dell'INSERT avremo i due campi nascosti per memorizzare l'azione e l'id che questa volta sarà valorizzato. Usando la stessa funzione ci si può chiedere che cosa accade nel caso dell'INSERT: in realtà la query non estrae dati dal database e quindi i campi del form continuano a rimanere vuoti.
A questo punto possiamo inviare il form e ricaricare nuovamente la nostra pagina con azione salva()
, la stessa usata precedentemente per l'INSERT in modo da poter riutilizzare, o meglio scrivere una sola volta, il codice necessario per leggere i dati provenienti dal form ed eventualmente effettuare i controlli del caso.
Il codice della funzione salva() dovrà essere integrato con la query d'UPDATE; possiamo utilizzare l'id come gestore del flusso: se l'id è uguale a zero ci troviamo di fronte ad un INSERT, viceversa se l'id è diverso da zero procederemo con un UPDATE. Nel nostro caso la query di UPDATE ha un parametro in più, l'id che ci serve da clausola WHERE
e aggiungiamo anche un LIMIT 1
in modo che, sebbene lavoriamo sulla chiave primaria, venga comunque aggiornato un solo record.
function salva() {
global $id, $connection;
$nome=$_REQUEST["nome"];
$cognome=$_REQUEST["cognome"];
$email=$_REQUEST["email"];
if($id==0){
$sql = 'INSERT INTO utenti(nome, cognome, email) VALUES(:nome, :cognome, :email)';
$stmt = $connection->prepare($sql);
$stmt->bindParam(':nome',$nome,PDO::PARAM_STR);
$stmt->bindParam(':cognome',$cognome,PDO::PARAM_STR);
$stmt->bindParam(':email',$email,PDO::PARAM_STR);
$stmt->execute();
}
else{
$sql='UPDATE utenti SET nome=:nome, cognome=:cognome, email=:email WHERE id=:id LIMIT 1 ';
$stmt = $connection->prepare($sql);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->bindParam(':nome',$nome,PDO::PARAM_STR);
$stmt->bindParam(':cognome',$cognome,PDO::PARAM_STR);
$stmt->bindParam(':email',$email,PDO::PARAM_STR);
$stmt->execute();
}
}
Eliminazione dei record
Per completare il nostro pannello di controllo manca un'ultima funzione: la possibilità di eliminare record. La costruzione del link dovrà essere simile alla modifica ma con diversa azione. Per evitare complicazioni è necessario prevedere una funzione di conferma JavaScript onde evitare cancellazioni accidentali: l'eliminazione di un record è un'operazione irreversibile, pertanto dobbiamo essere sicuri che un utente non possa eliminare un dato perché ha cliccato accidentalmente su un bottone:
function elimina(id){
var scelta = window.confirm('Sei sicuro di voler eliminare il record?');
if(scelta){location.href='?azione=elimina&id='+id;}
}
Per quanto riguarda la funzione elimina()
avremo bisogno delle variabili relative a connessione e all'id che passeremo tramite global
. Prepareremo la query parametrica dove l'id sarà l'unico parametro e inseriremo la clausola LIMIT a 1. L'esecuzione della query causerà l'eliminazione definitiva del record.
function elimina() {
global $id, $connection;
$sql='DELETE FROM utenti WHERE id=:id LIMIT 1 ';
$stmt = $connection->prepare($sql);
$stmt->bindParam(':id',$id,PDO::PARAM_INT);
$stmt->execute();
}
Una volta eliminato il record verrà proposta nuovamente la lista paginata dei record e con quest'ultima operazione il nostro pannello di controllo sarà terminato.