Guida completa all'aggiornamento dei dati in un database MySQL con PHP
Aggiornare i dati in un database è un'operazione essenziale. Questa guida passo dopo passo mostra come usare UPDATE in PHP con prepared statement.
L'aggiornamento dei dati è una delle quattro operazioni fondamentali sui database (insieme a inserimento, selezione e cancellazione di righe). Qualsiasi applicazione che consente agli utenti di modificare un profilo, contrassegnare un'attività come completata o cambiare un prezzo ne fa uso. Questo capitolo mostra come eseguire una query UPDATE da PHP in modo sicuro — con prepared statement — e come verificare esattamente quante righe sono state modificate.
Questo capitolo presuppone che tu abbia già una connessione al database funzionante. Gli esempi utilizzano mysqli; una versione equivalente con PDO è inclusa alla fine.
Comprendere la sintassi UPDATE di PHP con MySQL
L'istruzione UPDATE modifica i valori delle righe esistenti. La sua struttura è la stessa sia che venga eseguita dalla console MySQL sia da PHP:
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE some_column = some_value;table_name— la tabella le cui righe si desidera modificare.SET— le colonne da modificare e i loro nuovi valori. Le colonne non elencate rimangono invariate.WHERE— quali righe modificare. Questa clausola è fondamentale. Se la si omette, ogni riga della tabella viene aggiornata.
L'errore più comune — e più dannoso — con
UPDATEè dimenticare la clausolaWHERE.UPDATE users SET active = 0disattiva ogni utente nella tabella, non solo uno. Controlla sempre la condizioneWHEREprima di eseguire un aggiornamento su dati reali.
Aggiornare i dati con un prepared statement
Non costruire mai una query UPDATE concatenando direttamente l'input dell'utente nella stringa SQL — questo espone a SQL injection. Usa invece un prepared statement: scrivi la query con segnaposto ?, quindi associa i valori separatamente in modo che il database li tratti strettamente come dati.
<?php
// Reuse your connection — in practice: require 'db_connect.php';
$conn = mysqli_connect("localhost", "username", "password", "database_name");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$sql = "UPDATE users SET email = ?, age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
$email = "[email protected]";
$age = 31;
$id = 1;
// Type string: s = string, i = integer, d = double, b = blob.
// One letter per placeholder, in order.
mysqli_stmt_bind_param($stmt, "sii", $email, $age, $id);
if (mysqli_stmt_execute($stmt)) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>Come funziona passo dopo passo:
mysqli_prepare()invia il template della query (con segnaposto?) a MySQL.mysqli_stmt_bind_param()associa le variabili PHP a quei segnaposto. Il primo argomento,"sii", dichiara il tipo di ciascun valore nell'ordine: una stringa, poi due interi. Il numero e l'ordine delle lettere devono corrispondere esattamente ai segnaposto.mysqli_stmt_execute()esegue la query, restituendotruein caso di successo efalsein caso di errore.
Verificare quante righe sono state modificate
mysqli_stmt_execute() che restituisce true significa solo che la query è stata eseguita senza errori — non significa che una riga sia stata effettivamente modificata. Se la condizione WHERE non ha corrisposto a nessuna riga (o i nuovi valori erano identici a quelli precedenti), zero righe sono interessate. Usa mysqli_stmt_affected_rows() per scoprirlo:
<?php
$conn = mysqli_connect("localhost", "username", "password", "database_name");
$sql = "UPDATE users SET age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);
$age = 40;
$id = 1;
mysqli_stmt_bind_param($stmt, "ii", $age, $id);
mysqli_stmt_execute($stmt);
$rows = mysqli_stmt_affected_rows($stmt);
if ($rows > 0) {
echo "Updated {$rows} row(s).";
} else {
echo "No row matched, or the value was already up to date.";
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>Questa distinzione è importante nelle applicazioni reali: un pulsante "Salva" che riporta successo anche quando non è stato trovato nulla può nascondere bug agli utenti.
Aggiornare i dati con PDO
PDO è l'alternativa più portabile a mysqli — lo stesso codice funziona con MySQL, PostgreSQL, SQLite e altri, e i segnaposto con nome rendono le query più lunghe più facili da leggere:
<?php
$pdo = new PDO(
"mysql:host=localhost;dbname=database_name;charset=utf8mb4",
"username",
"password",
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$stmt = $pdo->prepare(
"UPDATE users SET email = :email, age = :age WHERE id = :id"
);
$stmt->execute([
':email' => '[email protected]',
':age' => 31,
':id' => 1,
]);
echo "Updated " . $stmt->rowCount() . " row(s).";
?>Con PDO::ERRMODE_EXCEPTION impostato, una query fallita lancia un'eccezione che puoi intercettare, invece di fallire silenziosamente. rowCount() è l'equivalente PDO di mysqli_stmt_affected_rows().
Best practice
- Includi sempre una clausola
WHEREa meno che non intenda davvero aggiornare ogni riga. - Usa i prepared statement per qualsiasi valore che proviene dall'input dell'utente — mai la concatenazione di stringhe.
- Fai corrispondere la stringa del tipo di bind (
"sii", ecc.) ai tipi effettivi delle variabili per evitare conversioni silenziose. - Racchiudi gli aggiornamenti su più tabelle in una transazione in modo che abbiano tutti successo o vengano tutti annullati.
- Fai un backup dei dati importanti prima di eseguire aggiornamenti di grandi dimensioni o una-tantum in produzione.