php

CRUD con PHP y MySQLi – Conexión

En este post te mostraré cómo realizar las 4 operaciones de bases de datos usando el lenguaje PHP con la extensión MySQLi (MySQL improved, mejorado) y obviamente el motor MySQL o MariaDB.

Al final verás cómo insertar, obtener, actualizar y eliminar con este ejemplo sencillo que además usa Bootstrap como framework de diseño. En otras palabras veremos cómo hacer una conexión PHP y MySQL con mysqli.

Por cierto, este tutorial también usa sentencias preparadas para evitar inyecciones SQL y así agregar una capa de seguridad (te recomiendo encarecidamente que leas ese post del enlace, pues en él explico el uso de bind_param).

Plantilla

He decidido separar el encabezado y pie del contenido, así se evita la duplicidad del código. En este caso definimos el encabezado:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CRUD de PHP con MySQLi by parzibyte</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>

<body>
    <main class="container-fluid">

Aquí en el encabezado importamos Bootstrap y definimos el inicio del body. Luego en el pie tenemos lo siguiente:

</main>
<footer class="px-2 py-2 fixed-bottom bg-dark">
        <span class="text-muted">CRUD de MySQLi con PHP creado por
            <a class="text-white" href="//parzibyte.me/blog">Parzibyte</a>
            &nbsp;|&nbsp;
            <a target="_blank" class="text-white" href="https://github.com/parzibyte/crud-php-mysqli">
                Ver código fuente
            </a>
        </span>
</footer>
</body>
</html>

De este modo vamos a poder reutilizar estos dos elementos y poner el contenido real entre los mismos, incluyéndolos con include_once.

Nota: en este caso vamos a gestionar videojuegos, es decir, una tabla de videojuegos. La tabla necesita únicamente el nombre y la descripción.

Conexión con la base de datos

Recuerda crear una base de datos llamada videojuegos. Dentro de ella, importa el siguiente esquema:

CREATE TABLE videojuegos(
    id bigint unsigned not null  primary key auto_increment,
    nombre varchar(255),
    descripcion varchar(255)
);

En caso de que cambies algo recuerda modificar el archivo de conexión:

<?php
$host = "localhost";
$usuario = "root";
$contrasenia = "";
$base_de_datos = "videojuegos";
$mysqli = new mysqli($host, $usuario, $contrasenia, $base_de_datos);
if ($mysqli->connect_errno) {
    echo "Falló la conexión a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
return $mysqli;

Este archivo que ves es el que será incluido en todos los demás archivos para interactuar con la base de datos.

Formulario de registro

Formulario de registro para MySQLi y PHP – Insert

Comenzamos diseñando el formulario para registrar datos. Únicamente solicitamos el nombre y la descripción:

<?php include_once "encabezado.php"; ?>
<div class="row">
    <div class="col-12">
        <h1>Registrar videojuego</h1>
        <form action="registrar.php" method="POST">
            <div class="form-group">
                <label for="nombre">Nombre</label>
                <input placeholder="Nombre" class="form-control" type="text" name="nombre" id="nombre" required>
            </div>
            <div class="form-group">
                <label for="descripcion">Descripción</label>
                <textarea placeholder="Descripción" class="form-control" name="descripcion" id="descripcion" cols="30" rows="10" required></textarea>
            </div>
            <div class="form-group"><button class="btn btn-success">Guardar</button></div>
        </form>
    </div>
</div>
<?php include_once "pie.php"; ?>

Fíjate en que el action del formulario está en registrar.php, es decir, todos los datos serán enviados a ese archivo.

Insertando registros

Ahora en registrar.php obtenemos los datos y hacemos el INSERT a la base de datos usando MySQLi y PHP:

<?php
$mysqli = include_once "conexion.php";
$nombre = $_POST["nombre"];
$descripcion = $_POST["descripcion"];
$sentencia = $mysqli->prepare("INSERT INTO videojuegos
(nombre, descripcion)
VALUES
(?, ?)");
$sentencia->bind_param("ss", $nombre, $descripcion);
$sentencia->execute();
header("Location: listar.php");

Lo que hacemos es incluir el archivo de conexión, después declaramos las variables en las líneas 3 y 4. Más tarde preparamos y ejecutamos la sentencia para finalmente redireccionar a listar.php.

Mostrar registros

Mostrar datos en tabla usando MySQLi y PHP – Operación SELECT

Veamos la opción de hacer un SELECT a MySQL usando MySQLi. En este caso vamos a crear una tabla con PHP por cada registro que haya.

Lo primero que hacemos es obtener todos los registros como arreglo, así podemos recorrerlos y más adelante acceder a ellos con $valor["columna"]. Para obtener los registros como arreglo usamos fetch_all indicando la constante MYSQLI_ASSOC para devolverlos como un arreglo asociativo.

<?php
$mysqli = include_once "conexion.php";
$resultado = $mysqli->query("SELECT id, nombre, descripcion FROM videojuegos");
$videojuegos = $resultado->fetch_all(MYSQLI_ASSOC);

Después definimos la tabla y le agregamos filas por cada registro que encontremos.

<table class="table">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Nombre</th>
                    <th>Descripción</th>
                    <th>Editar</th>
                    <th>Eliminar</th>
                </tr>
            </thead>
            <tbody>
                <?php
                foreach ($videojuegos as $videojuego) { ?>
                    <tr>
                        <td><?php echo $videojuego["id"] ?></td>
                        <td><?php echo $videojuego["nombre"] ?></td>
                        <td><?php echo $videojuego["descripcion"] ?></td>
                        <td>
                            <a href="editar.php?id=<?php echo $videojuego["id"] ?>">Editar</a>
                        </td>
                        <td>
                            <a href="eliminar.php?id=<?php echo $videojuego["id"] ?>">Eliminar</a>
                        </td>
                    </tr>
                <?php } ?>
            </tbody>
        </table>

También es aquí cuando definimos dos enlaces para editar y eliminar. A ambos les pasamos el id del videojuego a partir de la URL.

Formulario para editar

Formulario para Update en MySQL usando PHP y MySQLi

Ahora veamos el formulario que sirve para editar un registro. En este caso debemos obtener el valor de la base de datos haciendo un SELECT de nuevo, pues necesitamos rellenar el formulario con los datos ya existentes. El Id viene en la URL dentro de $_GET["id"].

Para obtener solo un registro hacemos una sentencia preparada con un WHERE, la ejecutamos y finalmente obtenemos un único registro (pues no necesitamos todos) usando fetch_assoc.

Además, necesitamos colocar un campo oculto que llevará el ID del videojuego que se edita, pues es necesario para hacer el WHERE de la consulta. En este caso usamos un input de tipo hidden.

<?php
include_once "encabezado.php";
$mysqli = include_once "conexion.php";
$id = $_GET["id"];
$sentencia = $mysqli->prepare("SELECT id, nombre, descripcion FROM videojuegos WHERE id = ?");
$sentencia->bind_param("i", $id);
$sentencia->execute();
$resultado = $sentencia->get_result();
# Obtenemos solo una fila, que será el videojuego a editar
$videojuego = $resultado->fetch_assoc();
if (!$videojuego) {
    exit("No hay resultados para ese ID");
}

?>
<div class="row">
    <div class="col-12">
        <h1>Actualizar videojuego</h1>
        <form action="actualizar.php" method="POST">
            <input type="hidden" name="id" value="<?php echo $videojuego["id"] ?>">
            <div class="form-group">
                <label for="nombre">Nombre</label>
                <input value="<?php echo $videojuego["nombre"] ?>" placeholder="Nombre" class="form-control" type="text" name="nombre" id="nombre" required>
            </div>
            <div class="form-group">
                <label for="descripcion">Descripción</label>
                <textarea placeholder="Descripción" class="form-control" name="descripcion" id="descripcion" cols="30" rows="10" required><?php echo $videojuego["descripcion"] ?></textarea>
            </div>
            <div class="form-group">
                <button class="btn btn-success">Guardar</button>
                <a class="btn btn-warning" href="listar.php">Volver</a>
            </div>
        </form>
    </div>
</div>
<?php include_once "pie.php"; ?>

Los datos se enviarán a actualizar.php. Fíjate en que el input oculto que mencioné está en la línea 20.

Hacer update

Al recibir los datos hacemos una consulta preparada; en ella hacemos un UPDATE usando un WHERE para el id.

<?php
$mysqli = include_once "conexion.php";
$id = $_POST["id"];
$nombre = $_POST["nombre"];
$descripcion = $_POST["descripcion"];

$sentencia = $mysqli->prepare("UPDATE videojuegos SET
nombre = ?,
descripcion = ?
WHERE id = ?");
$sentencia->bind_param("ssi", $nombre, $descripcion, $id);
$sentencia->execute();
header("Location: listar.php");

Como se puede notar, ahora bind_param recibe 3 argumentos que son el nuevo nombre, la nueva descripción y el id, en el orden que aparecen los signos de interrogación en la consulta.

De este modo hacemos un update a MySQL desde PHP usando la extensión MySQLi. Finalmente redireccionamos a listar.php.

Eliminar

Finalmente veamos el archivo que se encarga de eliminar un registro. En este caso debido a que es un ejemplo sencillo vamos a eliminar sin pedir confirmación leyendo un valor de la URL. Queda así:

<?php
if (!isset($_GET["id"])) {
    exit("No hay id");
}
$mysqli = include_once "conexion.php";
$id = $_GET["id"];
$sentencia = $mysqli->prepare("DELETE FROM videojuegos WHERE id = ?");
$sentencia->bind_param("i", $id);
$sentencia->execute();
header("Location: listar.php");

Poniendo todo junto

El código completo actualizado lo encuentras en mi GitHub. Recuerda dejarle una estrella si te ha gustado.

También he grabado un vídeo que explica el código y muestra el uso del software:

Conclusión

Así es como termina este tutorial de conexión a MySQL con PHP usando MySQLi. Recuerda que esta extensión se creó porque todas las funciones de mysql (no la base de datos, sino las funciones de PHP) ya son obsoletas.

Ahora bien, yo te recomendaría usar PDO en lugar de MySQLi pues así puedes cambiar de base de datos sin problema y podrías usar otros métodos más interesantes.

Al final de todo es tu decisión, pero yo prefiero PDO en caso de que me preguntes. Como sea, te invito a leer más sobre PHP o MySQL.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Recomiendas algún framework en especial para el tratamiento de la BD? Hacerlo a pelo creo que es un poco tedioso y no he encontrado ninguno que me guste.

    Un saludo.

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.