back to top

PHP: UPDATE e DELETE in una tabella MySQL con PDO

In questa lezione tratteremo, congiuntamente, l’ipotesi di aggiornamento dei dati contenuti in una tabella MySQL e della loro cancellazione.

Aggiornamento (UPDATE) dei record mediante PDO

Sostanzialmente aggiornare i valori di uno o più campi e di uno o più record presenti in una tabella creata all’interno di un database MySQL, significa eseguire delle istruzioni SQL basate sul comando UPDATE; queste ultime prevedono una sintassi nella quale il comando iene seguito dal nome della tabella coinvolta e dall’opzione SET: quest’ultima associa ai campi che si desidera modificare ai nuovi valori da memorizzare al loro interno. La clausola WHERE consentirà, infine, di specificare con esattezza in corrispondenza di quali record dovranno essere eseguiti gli aggiornamenti.

Se per esempio volessimo aggiornare il contenuto del campo "nome" della tabella "contatti" corrispondente all’"id = 1" con il nuovo valore "Anita", dovremmo utilizzare un’istruzione SQL come la seguente:

"UPDATE contatti SET nome = 'Anita' WHERE id = 1"

In PDO tale istruzione può essere eseguita una volta passata come parametro al metodo exec(). Il codice proposto tramite l’esempio riportato di seguito non presenta particolari novità rispetto ai sorgenti proposti in precedenza, anche in questo caso infatti vengono prima definiti i parametri per la connessione, successivamente questi ultimi vengono utilizzati per l’istanza dell’oggetto di classe PDO in modo da disporre di un handle ($connessione) con cui richiamare i metodi setAttribute(), per la gestione di errori ed eccezioni, e il già citato metodo exec() per l’esecuzione dell’istruzione SQL.

<?php
/*
  blocco dei parametri di connessione
*/
// nome di host
$host = "localhost";
// nome del database
$db = "nominativi";
// username dell'utente in connessione
$user = "mrwebmaster";
// password dell'utente
$password = "...";

/*
  blocco try/catch di gestione delle eccezioni
*/
try {
  // stringa di connessione al DBMS
  $connessione = new PDO("mysql:host=$host;dbname=$db", $user, $password);
  // imposto l'attributo per il report degli errori
  $connessione->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // istruzione per l'aggiornamento
  $aggiorna_dati = $connessione->exec("UPDATE contatti SET nome = 'Anita' WHERE id = 1");
  // chiusura della connessione
  $connessione = null;
}
catch(PDOException $e)
{
  // notifica in caso di errore nel tentativo di connessione
  echo $e->getMessage();
}
?>

Anche in questo caso si noti l’utilizzo di un blocco try/catch che consentirà di accedere alle informazioni messe a disposizione dalla classe PDOException per la notifica e la visualizzazione di eventuali eccezioni.

Si noti che il metodo exec() può essere accompagnato con la clausola di salvaguardia or die() al fine di interrompere l’esecuzione del codice qualora la query sia "ineseguibile" (una query sbagliata). Nel caso specifico, però, è necessario fare una puntualizzazione: le istruzioni per l’aggiornamento dei dati (ma il medesimo discorso vale anche per le procedure di cancellazione) potrebbero non avere effetto su alcun record (si supponga, ad esempio, che nel nostro esempio l’ID 1 non esista)! in questo caso la query restituirà "0" (FALSE) ma non si tratterebbe cero ti un comando "ineseguibile", motivo per il quale un’istruzione come la seguente non potrebbe avere alcun senso:

$aggiorna_dati = $connessione->exec("UPDATE contatti SET nome = 'Anita' WHERE id = 1") or die("Nessuna modifica eseguita.");

Per gestire simili situazioni, quindi, dovremo adottare una sintassi che prevede l’utilizzo dell’operatore "===" per verificare il valore di ritorno restituito dall’esecuzione, in questo modo:

$aggiorna_dati = $connessione->exec("UPDATE contatti SET nome = 'Anita' WHERE id = 1");
if ($aggiorna_dati === FALSE) {
  die("Nessuna modifica eseguita.");
}

Nel prossimo capitolo verrà invece analizzata la procedura prevista da PDO per eseguire cancellazioni di record.

Cancellazione (DELETE) di record con PDO

Concettualmente un’operazione destinata a cancellare un record svolge un compito profondamente diverso rispetto ad un’altra il cui fine è invece quello di alterarne i valori tramite un aggiornamento. Dal punto di vista sintattico, quindi, cambierà l’istruzione SQL utilizzata, mentre PDO consente di sfruttare in generale i medesimi costrutti.

Per cancellare un record da una tabella di un database MySQL tramite SQL si utilizza il comando DELETE FROM seguito dal nome della tabella coinvolta e dalla clausola WHERE che specifica il record (o i record) da rimuovere; l’eliminazione avrà effetto irreversibile (come accade anche per le procedure di aggiornamento).

Quindi, se volessimo cancellare il record in corrispondenza del valore "id = 1" dalla tabella "contatti" del nostro database "nominativi" dovremo utilizzare un’istruzione SQL come la seguente:

"DELETE FROM contatti WHERE id = 1";

Detto questo, per quanto riguarda PDO anche le istruzioni basate sul comando DELETE potranno essere passate al metodo exec() che si occuperà di eseguirle cancellando (in caso di successo) i record interessati; motivo per il quale l’esempio seguente differirà soltanto per una riga:

$cancella_dati = $connessione->exec("DELETE FROM contatti WHERE id = 1");

da quello proposto poco sopra in merito alla procedura per l’aggiornamento dei dati:

<?php
/*
  blocco dei parametri di connessione
*/
// nome di host
$host = "localhost";
// nome del database
$db = "nominativi";
// username dell'utente in connessione
$user = "mrwebmaster";
// password dell'utente
$password = "...";

/*
  blocco try/catch di gestione delle eccezioni
*/
try {
  // stringa di connessione al DBMS
  $connessione = new PDO("mysql:host=$host;dbname=$db", $user, $password);
  // imposto l'attributo per il report degli errori
  $connessione->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // istruzione per la cancellazione
  $cancella_dati = $connessione->exec("DELETE FROM contatti WHERE id = 1");
  // chiusura della connessione
  $connessione = null;
}
catch(PDOException $e)
{
  // notifica in caso di errore nel tentativo di connessione
  echo $e->getMessage();
}
?>

Anche in questo caso bisognerà ricordare che una query che non dovesse eliminare alcun record sarà destinata a restituire "0" (FALSE). Valgono, pertanto, in merito le stesse considerazioni svolte in precedenza relativamente alle query di UPDATE.

Una volta descritta anche la sintassi necessaria per le cancellazioni, nel prossimo capitolo verrà affrontato il discorso riguardante i Prepared statements in PDO, dei costrutti ideali per incrementare il livello di sicurezza delle query, in particolare quando si deve lavorare con parametri prodotti dinamicamente (perché inviati per esempio tramite un form) e quindi non definiti a priori dal programmatore.

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.