Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 24 di 56
  • livello intermedio
Indice lezioni

Dettaglio, modifica ed eliminazione di un record

Finiamo di sviluppare la nostra applicazione CRUD con PHP e PDO implementando le funzionalità per la visualizzazione dei record in dettaglio, la loro modifica e la loro eliminazione.
Finiamo di sviluppare la nostra applicazione CRUD con PHP e PDO implementando le funzionalità per la visualizzazione dei record in dettaglio, la loro modifica e la loro eliminazione.
Link copiato negli appunti

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.

Ti consigliamo anche