W3docs

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 clausola WHERE. UPDATE users SET active = 0 disattiva ogni utente nella tabella, non solo uno. Controlla sempre la condizione WHERE prima 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:

  1. mysqli_prepare() invia il template della query (con segnaposto ?) a MySQL.
  2. 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.
  3. mysqli_stmt_execute() esegue la query, restituendo true in caso di successo e false in 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 WHERE a 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.

Esercitazione

Pratica
Cosa è importante sapere quando si aggiornano i dati con PHP in MySQL?
Cosa è importante sapere quando si aggiornano i dati con PHP in MySQL?
Was this page helpful?