PHP: PDO e prepared statements
PDO e prepared statements in PHP
L’estensione PDO
(PHP Data Objects) permette di collegarsi a diversi database con un’unica interfaccia. Con i prepared statements possiamo eseguire query più sicure e prevenire attacchi di tipo SQL injection.
Introduzione
PDO è una libreria che consente di lavorare con diversi sistemi di database (MySQL, PostgreSQL, SQLite, ecc.) tramite la stessa interfaccia. Una caratteristica importante di PDO è la possibilità di usare i prepared statements, che separano la struttura della query dai valori da inserire. Questo riduce notevolmente il rischio di SQL injection e rende il codice più sicuro e leggibile.
Esempio di connessione con PDO
Per creare una connessione con PDO usiamo la classe PDO
, passando i parametri di connessione (host, database, utente e password).
Codice Esempio: connessione PDO

<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=scuola", "root", "");
// Imposto la modalità di errore
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connessione stabilita con successo.";
} catch(PDOException $e) {
echo "Connessione fallita: " . $e->getMessage();
}
?>
<!-- Output:
Connessione stabilita con successo.
-->
Esempio di prepared statement per INSERT
In questo esempio usiamo un prepared statement per inserire un nuovo record nella tabella studenti
. I valori vengono passati separatamente con il metodo bindParam()
.
Codice Esempio: prepared statement INSERT

<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=scuola", "root", "");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO studenti (nome, eta) VALUES (:nome, :eta)";
$stmt = $conn->prepare($sql);
$nome = "Marco";
$eta = 21;
$stmt->bindParam(':nome', $nome);
$stmt->bindParam(':eta', $eta);
$stmt->execute();
echo "Nuovo record inserito con successo.";
} catch(PDOException $e) {
echo "Errore: " . $e->getMessage();
}
?>
<!-- Output:
Nuovo record inserito con successo.
-->
Esempio di prepared statement per SELECT
Con un prepared statement possiamo anche leggere dati, usando execute()
e poi fetch()
o fetchAll()
per ottenere i risultati.
Codice Esempio: prepared statement SELECT

<?php
try {
$conn = new PDO("mysql:host=localhost;dbname=scuola", "root", "");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT id, nome, eta FROM studenti WHERE eta > :eta";
$stmt = $conn->prepare($sql);
$eta_minima = 18;
$stmt->bindParam(':eta', $eta_minima);
$stmt->execute();
$result = $stmt->fetchAll();
foreach ($result as $row) {
echo "ID: " . $row["id"] . " - Nome: " . $row["nome"] . " - Età: " . $row["eta"] . "<br>";
}
} catch(PDOException $e) {
echo "Errore: " . $e->getMessage();
}
?>
<!-- Output:
ID: 1 - Nome: Marco - Età: 21
ID: 2 - Nome: Anna - Età: 22
-->
Tabella riassuntiva
Concetto | Descrizione | Uso |
---|---|---|
PDO |
Classe che permette la connessione a diversi tipi di database. | Portabilità e gestione uniforme dei database. |
prepare() |
Crea uno statement pronto da eseguire con parametri. | Separare query e valori, migliorando la sicurezza. |
bindParam() |
Associa variabili ai parametri della query. | Impostare valori dinamici in modo sicuro. |
execute() |
Esegue lo statement preparato. | Inviare la query al database. |
Considerazioni
L’uso di PDO con i prepared statements è una delle migliori pratiche in PHP per la gestione dei database. Permette di lavorare in modo uniforme su diversi sistemi e di proteggere le applicazioni da vulnerabilità comuni come la SQL injection. Ogni query dovrebbe preferibilmente essere preparata e parametrizzata.