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
).
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>
|
<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.
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.
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.
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
.
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.
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.
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.
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");
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:
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.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
trabajo con php nativo,pero me parece muy interezante y quiero aprender , muy amable,,gracias
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.
Hola. Un framework que me ha gustado mucho es Laravel.
Saludos :)