Guía completa para actualizar datos en una base de datos MySQL con PHP
Actualizar datos en una base de datos es una operación esencial para las aplicaciones web que manejan datos dinámicos. Esta guía explica cómo hacerlo paso a paso.
Actualizar datos es una de las cuatro operaciones fundamentales de base de datos (junto con insertar, seleccionar y eliminar filas). Cualquier aplicación que permita a los usuarios editar un perfil, marcar una tarea como completada o cambiar un precio depende de ella. Este capítulo muestra cómo ejecutar una consulta UPDATE desde PHP de forma segura — con sentencias preparadas — y cómo confirmar exactamente cuántas filas cambiaron.
Este capítulo asume que ya tienes una conexión a la base de datos funcionando. Los ejemplos usan mysqli; al final se incluye una versión equivalente con PDO.
Comprender la sintaxis de MySQL UPDATE en PHP
La sentencia UPDATE cambia los valores de las filas existentes. Su estructura es la misma tanto si la ejecutas desde la consola de MySQL como desde PHP:
UPDATE table_name
SET column1 = value1, column2 = value2
WHERE some_column = some_value;table_name— la tabla cuyas filas deseas modificar.SET— las columnas a modificar y sus nuevos valores. Las columnas que no se mencionen quedarán sin cambios.WHERE— qué filas modificar. Esta cláusula es crítica. Si la omites, todas las filas de la tabla serán actualizadas.
El error más común — y más perjudicial — con
UPDATEes olvidar la cláusulaWHERE.UPDATE users SET active = 0desactiva a todos los usuarios de la tabla, no solo a uno. Comprueba siempre la condiciónWHEREantes de ejecutar una actualización sobre datos reales.
Actualizar datos con una sentencia preparada
Nunca construyas una consulta UPDATE concatenando la entrada del usuario directamente en la cadena SQL — eso te expone a inyección SQL. En su lugar, utiliza una sentencia preparada: escribe la consulta con marcadores de posición ?, luego vincula los valores por separado para que la base de datos los trate estrictamente como datos.
<?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);
?>Cómo funciona paso a paso:
mysqli_prepare()envía la plantilla de la consulta (con marcadores de posición?) a MySQL.mysqli_stmt_bind_param()vincula tus variables PHP a esos marcadores. El primer argumento,"sii", declara el tipo de cada valor en orden: una cadena y luego dos enteros. El número y el orden de las letras deben coincidir exactamente con los marcadores de posición.mysqli_stmt_execute()ejecuta la consulta y devuelvetrueen caso de éxito yfalseen caso de error.
Verificar cuántas filas cambiaron
Que mysqli_stmt_execute() devuelva true solo significa que la consulta se ejecutó sin errores — no significa que una fila haya cambiado realmente. Si la condición WHERE no coincidió con ninguna fila (o los nuevos valores eran idénticos a los anteriores), cero filas se ven afectadas. Usa mysqli_stmt_affected_rows() para averiguarlo:
<?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);
?>Esta distinción importa en aplicaciones reales: un botón "Guardar" que reporta éxito aunque no se haya encontrado nada puede ocultar errores a tus usuarios.
Actualizar datos con PDO
PDO es la alternativa más portable a mysqli — el mismo código funciona con MySQL, PostgreSQL, SQLite y otros, y los marcadores con nombre hacen que las consultas más largas sean más fáciles de leer:
<?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 configurado, una consulta fallida lanza una excepción que puedes capturar, en lugar de fallar silenciosamente. rowCount() es el equivalente PDO de mysqli_stmt_affected_rows().
Buenas prácticas
- Incluye siempre una cláusula
WHEREa menos que genuinamente quieras actualizar todas las filas. - Usa sentencias preparadas para cualquier valor que provenga de la entrada del usuario — nunca concatenación de cadenas.
- Haz coincidir la cadena de tipos de vinculación (
"sii", etc.) con los tipos reales de tus variables para evitar conversiones silenciosas. - Envuelve las actualizaciones de múltiples tablas en una transacción para que todas tengan éxito o todas se reviertan.
- Haz una copia de seguridad de los datos importantes antes de ejecutar actualizaciones grandes o de una sola vez en producción.