🔐 Prepared Statements in PHP

Quando si lavora con database e dati inseriti dagli utenti, uno dei rischi più grandi è la SQL Injection.

Per evitare questo problema si utilizzano i Prepared Statements (query preparate).


🧠 Cos’è una SQL Injection

La SQL Injection è un attacco in cui un utente inserisce codice SQL malevolo nei campi di input.

⚠ Esempio pericoloso

$sql = "SELECT * FROM utenti WHERE nome = '$nome'";

Se l’utente inserisce:

' OR 1=1 --

👉 la query diventa sempre vera e può restituire tutti i dati 😱


🛡️ Soluzione: Prepared Statements

I Prepared Statements separano:

👉 In questo modo i dati NON vengono interpretati come codice SQL.


🔧 Come funzionano

Il processo avviene in 3 passaggi:

  1. 📝 preparare la query

  2. 🔗 associare i parametri

  3. ▶️ eseguire la query


📌 Esempio con SELECT

<?php

$conn = mysqli_connect("localhost", "root", "", "miodatabase");
$stmt = mysqli_prepare($conn, "SELECT * FROM utenti WHERE nome = ?");
mysqli_stmt_bind_param($stmt, "s", $nome);
$nome = "Paolo";
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_assoc($result)){
    echo $row["nome"] . "<br>";
}
?>

📖 Spiegazione


🔤 Tipi di dati

Tipo Significato
s stringa
i intero
d decimale
b blob

➕ Esempio con INSERT

<?php

$conn = mysqli_connect("localhost", "root", "", "miodatabase");

$stmt = mysqli_prepare($conn, "INSERT INTO utenti (nome, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $nome, $email);
$nome = "Paolo";
$email = "paolo@email.it";
mysqli_stmt_execute($stmt);
echo "Dati inseriti in modo sicuro 🔐";
?>

✏️ Esempio con UPDATE

<?php

$stmt = mysqli_prepare($conn, "UPDATE utenti SET nome = ? WHERE id = ?");
mysqli_stmt_bind_param($stmt, "si", $nome, $id);
?>

❌ Esempio con DELETE

<?php

$stmt = mysqli_prepare($conn, "DELETE FROM utenti WHERE id = ?");
mysqli_stmt_bind_param($stmt, "i", $id);
?>

🛡️ Vantaggi dei Prepared Statements


⚠ Errori comuni


🧪 Esempio completo

<?php

$conn = mysqli_connect("localhost", "root", "", "miodatabase");
$nome = $_POST["nome"];
$stmt = mysqli_prepare($conn, "SELECT * FROM utenti WHERE nome = ?");
mysqli_stmt_bind_param($stmt, "s", $nome);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_assoc($result)){
    echo $row["nome"];
}
?>

🎯 Riassunto


📚 Conclusione

I Prepared Statements sono uno degli strumenti più importanti in PHP quando si lavora con database.

👉 Se vuoi fare le cose “per bene”, questo è il metodo da usare sempre.


🎉 Con questo articolo il tuo tutorial ha fatto un bel salto di qualità!