Editar datos en MySQL usando PDO en PHP

23/06/2024 | MySQL, PHP | 0 comentarios

Actualiza datos en MySQL con PDO en PHP de forma segura. Implementa prácticas como consultas preparadas, validación de datos y manejo de excepciones.

Descargar archivos


El uso de PDO (PHP Data Objects) en PHP es una práctica recomendada para interactuar con bases de datos debido a su flexibilidad, seguridad y facilidad de uso. En este artículo veremos cómo editar datos en una base de datos MySQL utilizando PDO en PHP.

Requisitos Previos

  • Un servidor web con soporte para PHP (Ejemplo: XAMPP, WAMP, Docker).
  • Una base de datos MySQL con una tabla users de ejemplo.
  • Conocimientos básicos de PHP y SQL.

Lo primero es crear la conexión con la base de datos, para mas detalle de esta conexión puedes leer Guía para conectar PHP a una base de datos con PDO.


<?php
// parameters
$dsn = 'mysql:host=localhost;port=3306;dbname=dbname';
$username = 'dbuser';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo $e->getMessage();
    die();
}

Editar datos en MySQL

Lo siguiente es entender como se editan los datos en MySQL, se usa una sentencia SQL:


UPDATE users SET name='Louis', email='lous@gmain.com', phone=99999999 WHERE id=3

Donde se usa la sentencia UPDATE que permite actualizar datos. Llevando este script a PHP podríamos hacerlo usando el método prepare que prepara una consulta SQL y bindParam para asociar el valor de un parámetro:


$name = 'Louis';
$email = 'lous@gmail.com';
$phone = 99999999;
$id = 3;

$stmt = $pdo->prepare("UPDATE users SET name=:name, email=:email phone=:phone WHERE id=:id");
$stmt->bindParam('name', $name);
$stmt->bindParam('email',  $email);
$stmt->bindParam('phone',  $phone);
$stmt->bindParam('id', $id, PDO::PARAM_INT);
$stmt->execute();

Ejemplo Completo

Vamos a editar un registro que ya existe en nuestra tabla, para ello se debe consultar primero estos datos, esto lo haremos mediante el siguiente ejemplo donde hemos agregado una verificación del registro que queremos consultar.


// Query data of current id
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
if ($id <= 0) {
    echo 'Debe seleccionar un usuario valido';
    die();
}

// query data
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam('id',  $id, PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch();

if (!$user) {
    echo 'Usuario no encontrado';
    die();
}

Con esta información podemos crear el formulario para modificar los datos:


<form name="insertar" method="post" action="update.php?action=update&id=<?php echo $user->id; ?>">
  Nombre: <input type="text" name="name" placeholder="Nombres" value="<?php echo $user->name; ?>" />
  Email: <input type="text" name="email" placeholder="Correo" value="<?php echo $user->email; ?>" />
  Phone: <input type="text" name="phone" placeholder="Phone" value="<?php echo $user->phone; ?>" />
  <button type="submit">Enviar</button>
</form>

Lo siguiente es recibir los datos del formulario, filtrar los datos y enviarlo a MySQL utilizando el método prepare de la siguiente manera:


// update data
$action = $_GET['action'];
if ($action == 'update') {
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $phone = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_NUMBER_INT);
    try {
       $stm = $pdo->prepare("UPDATE users SET name=:name, email=:email, phone=:phone WHERE id=:id");
       $stm->bindParam('name', $name);
       $stm->bindParam('email', $email);
       $stm->bindParam('phone',  $phone);
       $stm->bindParam('id',  $id, PDO::PARAM_INT);
        $stm->execute();

       echo "Datos actualizados correctamente";
    } catch (PDOException $e) {
       echo "Error al actualizar: " . $e->getMessage();
    }
}

Notar que que se filtran los datos antes de poder utilizarlos en la consulta, también tenemos un capturador de errores (try, catch) para mostrar un mensaje de error entendibles.

Uniendo los bloques de código (conexión a base de datos, consultar el registro y actualizar el registro) tendríamos el siguiente script completo:


<?php
// file: register.php

// prepare connection
$dsn = 'mysql:host=localhost;port=3306;dbname=dbname';
$username = 'dbuser';
$password = 'password';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION
);

try {
    $pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
    echo $e->getMessage();
    die();
}

// Query data of current id
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
if ($id <= 0) {
    echo 'Debe seleccionar un usuario valido';
    die();
}

// update data
$action = $_GET['action'];
if ($action == 'update') {
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $phone = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_NUMBER_INT);
    try {
       $stm = $pdo->prepare("UPDATE users SET name=:name, email=:email, phone=:phone WHERE id=:id");
       $stm->bindParam('name', $name);
       $stm->bindParam('email', $email);
       $stm->bindParam('phone',  $phone);
       $stm->bindParam('id',  $id, PDO::PARAM_INT);
       $stm->execute();

       echo "Datos actualizados correctamente";
    } catch (PDOException $e) {
       echo "Error al actualizar: " . $e->getMessage();
    }
}

// query data
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam('id',  $id, PDO::PARAM_INT);
$stmt->execute();
$user = $stmt->fetch();

if (!$user) {
    echo 'Usuario no encontrado';
    die();
}

Recomendaciones

  • Usa Consultas Preparadas y Vinculación de Parámetros:
    Las consultas preparadas (prepare) y la vinculación de parámetros (bindParam) protegen contra inyecciones SQL.
  • Sanitizar y Validar Datos de Entrada:
    Antes de usar datos de entrada sanitízalos y valídalos. Esto incluye verificar que los datos sean del tipo esperado. Puedes usar filter_var().
  • Manejo de Errores y Excepciones:
    Maneja las excepciones para evitar que los errores no controlados expongan información sensible. Evita mostrar mensajes de error detallados al usuario final.
  • Configuración Segura de Base de Datos:
    El usuario de la base de datos debe tener los permisos mínimos necesarios. No uses cuentas con privilegios de administrador para operaciones rutinarias.

Conclusiones

Editar datos en MySQL usando PDO en PHP es un proceso sencillo y seguro siempre y cuando se sigan las mejores prácticas de seguridad. Al implementar las consideraciones de seguridad mencionadas, puedes proteger tu aplicación contra diversas amenazas y garantizar una operación segura y eficiente.

Referencias

Envíar Comentario

En este sitio los comentarios se publican previa aprobación del equipo de Kodetop. Evita los comentarios ofensivos, obscenos o publicitarios. Si deseas publicar código fuente puedes hacerlo entre las etiquedas <pre></pre>