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:
| matr | nome | cognome | nascita | cf |
|---|---|---|---|---|
| 000AAA1 | Mirko | Agrati | 06/12/1975 | zzzaaaag7887dhsg |
| 000AAA2 | Pippo | Rossi | 26/11/1990 | z44rsaag5811dhsk |
| 000AA02 | Luca | Bianchi | 11/03/1980 | j77ssrtm3321azpp |
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:
| matr | nome | cognome | nascita | cf |
|---|---|---|---|---|
| 000AAA1 | Mirko | Agrati | 06/12/1975 | zzzaaaag7887dhsg |
| 000AAA2 | Pippo | Rossi | 26/11/1990 | z44rsaag5811dhsk |
| 000AA02 | Luca | Bianchi | 11/03/1980 | j77ssrtm3321azpp |
| SW4080DD | Pino | Petruzzo | 11/12/1974 | PNPTRZ1710180009 |
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!