Share |

martedì 5 ottobre 2010

PHP: Insert e Update di records con PDO

In questo articolo PHP verrà mostrata una tecnica standard per l'inserimento e la modifica di records che si fonda sull'utilizzo del componente PDO.

Questo articolo va a completare l'overview che ho voluto dedicare all'argomento.

Se non conosci PDO, per poter seguire questa discussione ti consiglio una lettura veloce ai seguenti post:

Prima di analizzare gli script di esempio, è necessario che ti mostri la base dati scelta.

La tabella Dipendenti

Come base dati di esempio per il proseguio dell'articolo sarà utilizzata una tabella fittizia di possibili dipendenti, di una qualunque società, residente in un database MySQL.

La tabella scelta si chiama Dipendenti, è composta di soli campi stringa ed è così strutturata:

Tabella Dipendenti
matrnomecognomenascitacf
000AAA1MirkoAgrati06/12/1975zzzaaaag7887dhsg
000AAA2PippoRossi26/11/1990z44rsaag5811dhsk
000AA02LucaBianchi11/03/1980j77ssrtm3321azpp

Nota

Entrambi gli script che seguono danno per scontata la conoscenza della corretta struttura e sintassi di un DSN (o Data Source Name) e la conoscenza delle differenze che vi sono tra l'utilizzo del metodo query e dei metodi prepare ed execute.

Tutti questi argomenti sono stati affrontati e spiegati negli articoli suggeriti nell'introduzione di questo post.

Inserire nuovi records in tabella

Per inserire nuovi records in una tabella di un DB relazionale qualunque è utilizzato il comando SQL INSERT.

Il componente PDO consente di eseguire questo tipo di istruzione SQL sia attraverso il comando PDO->query() sia attraverso l'accoppiata PDO->prepare() e PDO->execute(); in questo articolo esporrò solo la tecnica che fa uso degli ultimi due metodi.

<?php
$matr = 'SW4080DD';
$name = 'Pino';
$sname = 'Petruzzo';
$birthday = '11/12/1974';
$cf = 'PNPTRZ1710180009';

try{
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $sql = 'INSERT INTO dipendenti'
      . ' (matr, nome, cognome, nascita, cf)' 
      . ' VALUES (:matr, :name, :sname, :birthday, :cf)';
  $stmt = $dbh->prepare($sql);
  $stmt->bindParam(':matr', $matr);
  $stmt->bindParam(':name', $name);
  $stmt->bindParam(':sname', $sname);
  $stmt->bindParam(':birthday', $birthday);
  $stmt->bindParam(':cf', $cf);
  $stmt->execute();
}
catch (PDOException $e) {
  echo 'Si è verificata una PDO Exception.';
  echo 'SQL Query: ', $sql;
  echo 'Errore: ' . $e->getMessage();
}
?>

Al termine dell'esecuzione di questo script, se non sono state sollevate PDOException, la tabella Dipendenti figurerà come segue:

Tabella Dipendenti
matrnomecognomenascitacf
000AAA1MirkoAgrati06/12/1975zzzaaaag7887dhsg
000AAA2PippoRossi26/11/1990z44rsaag5811dhsk
000AA02LucaBianchi11/03/1980j77ssrtm3321azpp
SW4080DDPinoPetruzzo11/12/1974PNPTRZ1710180009

Aggiornare i dati presenti in tabella

Per modificare records presenti in tabella si deve fare uso del comando SQL UPDATE.

Tramite un'istruzione di update è possibile modificare un solo record come pure un set di records diversi: ciò che filtra i dati da aggiornare è la clausola di WHERE.

Nell'esempio scelto verrà modificato il nome del dipendente Petruzzo che si chiama Piero, ma per errore in tabella è stato inserito Pino.

<?php
$matr = 'SW4080DD';
$name = 'Piero';

try{
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $sql = 'UPDATE dipendenti'
      . ' SET nome = :name' 
      . ' WHERE matr = :matr';
  $stmt = $dbh->prepare($sql);
  $stmt->bindParam(':name', $name);
  $stmt->bindParam(':matr', $matr);
  $stmt->execute();
}
catch (PDOException $e) {
  echo 'Si è verificata una PDO Exception.';
  echo 'SQL Query: ', $sql;
  echo 'Errore: ' . $e->getMessage();
}
?>

Finalmente il dipendente Petruzzo ha ri-ottenuto il suo vero nome: Piero!

Come si nota, la vera differenza tra i due script sta nell'istruzione SQL e non nel modo in cui si risolve il problema!

Tra l'altro, utilizzando i metodi PDO->prepare() e PDO->execute() siamo liberi di non preoccuparci del controllo delle stringhe: questa tecnica è essenziale per evitare problemi dovuti ad attacchi portati tramite SQL Injection.

Per chi come me sviluppa molto in ambiente Java avrà sicuramente notato una certa assomiglianza tra PDO e JDBC.

Alla prossima,
MA.

0 commenti:

Posta un commento

Non ti è chiaro qualcosa?
No problem, posta il tuo dubbio ;)

..... e ricordati di firmarlo!