W3docs

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 UPDATE es olvidar la cláusula WHERE. UPDATE users SET active = 0 desactiva a todos los usuarios de la tabla, no solo a uno. Comprueba siempre la condición WHERE antes 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:

  1. mysqli_prepare() envía la plantilla de la consulta (con marcadores de posición ?) a MySQL.
  2. 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.
  3. mysqli_stmt_execute() ejecuta la consulta y devuelve true en caso de éxito y false en 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 WHERE a 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.

Práctica

Práctica
¿Qué es importante tener en cuenta al actualizar datos con PHP en MySQL?
¿Qué es importante tener en cuenta al actualizar datos con PHP en MySQL?
Was this page helpful?