From 3a5e204f665e26f64382fb26689e5c53d9083500 Mon Sep 17 00:00:00 2001 From: "trbureiyan.dev" <111925453+trbureiyan@users.noreply.github.com> Date: Tue, 22 Oct 2024 20:43:53 -0500 Subject: [PATCH] =?UTF-8?q?Implementaci=C3=B3n=20CRUD=20y=20optimizaci?= =?UTF-8?q?=C3=B3n=20OLTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se ha completado un sistema CRUD para gestionar libros, autores, editores y traductores, mejorando la validación de formularios y utilizando prepared statements. Se optimizó la estructura de la base de datos y se ajustó la documentación. --- Database/libros.sql | 191 ++++++++++++++++++ README.md | 71 ++++++- .../Ingresos/ingreso_autores.php | 7 +- .../Ingresos/ingreso_editores.php | 9 +- .../Mantenimiento/Ingresos/ingreso_libros.php | 34 ++++ .../Ingresos/ingreso_traductores.php | 11 +- books/Mantenimiento/libros.php | 2 +- books/index.php | 3 +- 8 files changed, 303 insertions(+), 25 deletions(-) create mode 100644 Database/libros.sql create mode 100644 books/Mantenimiento/Ingresos/ingreso_libros.php diff --git a/Database/libros.sql b/Database/libros.sql new file mode 100644 index 0000000..5fed221 --- /dev/null +++ b/Database/libros.sql @@ -0,0 +1,191 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.1 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Generation Time: Oct 23, 2024 at 03:08 AM +-- Server version: 10.4.32-MariaDB +-- PHP Version: 8.2.12 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `libros` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `autores` +-- + +CREATE TABLE `autores` ( + `ID_autores` int(11) NOT NULL, + `Nombre` varchar(50) DEFAULT NULL, + `Apellidos` varchar(50) DEFAULT NULL, + `telefono` bigint(14) NOT NULL, + `correo` varchar(30) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `autores` +-- + +INSERT INTO `autores` (`ID_autores`, `Nombre`, `Apellidos`, `telefono`, `correo`) VALUES +(9, 'SANTIAGO', 'QUEVEDO', 322334456, 'camila.tovar@usco.edu.co'), +(10, 'Brayan', 'Toro Bustos', 573102984722, 'prueba@test.com'), +(11, 'Don patricio', 'carvajal', 2347672310, 'si@test.com.co.test'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `editores` +-- + +CREATE TABLE `editores` ( + `ID_editores` int(11) NOT NULL, + `Nombre` varchar(50) DEFAULT NULL, + `Apellidos` varchar(50) DEFAULT NULL, + `nombre_editorial` varchar(70) DEFAULT NULL, + `pais` varchar(100) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `editores` +-- + +INSERT INTO `editores` (`ID_editores`, `Nombre`, `Apellidos`, `nombre_editorial`, `pais`) VALUES +(1, 'Pedro', 'Diaz Perea', NULL, NULL), +(2, 'Alejandro', 'Peralta', NULL, NULL), +(3, 'Irene', 'Dussan Pineda', NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `libros` +-- + +CREATE TABLE `libros` ( + `ID_libro` int(11) NOT NULL, + `Titulo` varchar(45) DEFAULT NULL, + `Tipo` varchar(45) DEFAULT NULL, + `ID_autor` int(11) DEFAULT NULL, + `ID_editor` int(11) DEFAULT NULL, + `ID_traductor` int(11) DEFAULT NULL, + `genero` varchar(50) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `libros` +-- + +INSERT INTO `libros` (`ID_libro`, `Titulo`, `Tipo`, `ID_autor`, `ID_editor`, `ID_traductor`, `genero`) VALUES +(7, 'La odisea', 'Novela', 10, 3, 2, 'Romance'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `traductores` +-- + +CREATE TABLE `traductores` ( + `ID_traductores` int(11) NOT NULL, + `Nombre` varchar(50) DEFAULT NULL, + `Apellidos` varchar(50) DEFAULT NULL, + `idioma_nativo` varchar(30) DEFAULT NULL, + `idiomas_traduccion` varchar(50) DEFAULT NULL, + `certificaciones` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `traductores` +-- + +INSERT INTO `traductores` (`ID_traductores`, `Nombre`, `Apellidos`, `idioma_nativo`, `idiomas_traduccion`, `certificaciones`) VALUES +(1, 'Luis', 'Ruiz', NULL, NULL, NULL), +(2, 'Amador', 'Peralta', NULL, NULL, NULL), +(3, 'Alejandra', 'Pineda', NULL, NULL, NULL); + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `autores` +-- +ALTER TABLE `autores` + ADD PRIMARY KEY (`ID_autores`); + +-- +-- Indexes for table `editores` +-- +ALTER TABLE `editores` + ADD PRIMARY KEY (`ID_editores`); + +-- +-- Indexes for table `libros` +-- +ALTER TABLE `libros` + ADD PRIMARY KEY (`ID_libro`), + ADD KEY `ID_autor` (`ID_autor`), + ADD KEY `ID_editor` (`ID_editor`), + ADD KEY `ID_traductor` (`ID_traductor`); + +-- +-- Indexes for table `traductores` +-- +ALTER TABLE `traductores` + ADD PRIMARY KEY (`ID_traductores`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `autores` +-- +ALTER TABLE `autores` + MODIFY `ID_autores` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=18; + +-- +-- AUTO_INCREMENT for table `editores` +-- +ALTER TABLE `editores` + MODIFY `ID_editores` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; + +-- +-- AUTO_INCREMENT for table `libros` +-- +ALTER TABLE `libros` + MODIFY `ID_libro` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; + +-- +-- AUTO_INCREMENT for table `traductores` +-- +ALTER TABLE `traductores` + MODIFY `ID_traductores` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `libros` +-- +ALTER TABLE `libros` + ADD CONSTRAINT `libros_ibfk_1` FOREIGN KEY (`ID_autor`) REFERENCES `autores` (`ID_autores`), + ADD CONSTRAINT `libros_ibfk_2` FOREIGN KEY (`ID_editor`) REFERENCES `editores` (`ID_editores`), + ADD CONSTRAINT `libros_ibfk_3` FOREIGN KEY (`ID_traductor`) REFERENCES `traductores` (`ID_traductores`); +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/README.md b/README.md index af91dc4..62e7546 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,69 @@ -# App web BibliotecaVirtual - Aplicación web transaccional con concepto de biblioteca virtual simple diseñada para gestionar eficientemente transacciones con una base de datos utilizando PHP y MySQL en el backend. Un sistema que se centra en operaciones CRUD, garantizando integridad de los datos mediante el uso de prepared statements, lo que reduce los riesgos de inyección SQL. Aunque su concepción inicial es la de una plataforma OLTP, tiene el potencial de evolucionar hacia una API para permitir la integración con aplicaciones externas, ofreciendo mayor interoperabilidad. Además, se contempla la capacidad de generar informes y/o escalar hacia una implementación OLAP simple para análisis más avanzados. + +# Sistema de Gestión de Biblioteca Virtual Basica (VLMSb) + +## Descripción General + +Este **Sistema de Gestión de Biblioteca Virtual** es una aplicación transaccional web basica diseñada para gestionar el catálogo de una biblioteca, permitiendo realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) de manera segura y eficiente. El sistema cuenta con un backend robusto desarrollado en **PHP** y **MySQL**, con un enfoque en la **integridad de los datos** y la **seguridad**. Al utilizar **sentencias preparadas** y código modularizado, este proyecto garantiza una experiencia fluida tanto para desarrolladores como para los usuarios finales. + +--- + +## Funcionalidades Clave + +### 1. **Manejo Seguro de Datos** + - Se implementaron **sentencias preparadas** en las consultas SQL para proteger contra las vulnerabilidades de **inyección SQL**. Esto asegura la integridad y seguridad de la base de datos, evitando ataques maliciosos que podrían comprometer la información sensible. + +### 2. **Operaciones CRUD Eficientes** + - El sistema maneja de manera eficiente las operaciones **CRUD** para la gestión de los recursos de la biblioteca, incluyendo libros, autores, editores y traductores. Las transacciones en la base de datos se ejecutan de manera fluida, garantizando escalabilidad y confiabilidad del sistema. + +### 3. **Estructura de Código Optimizada** + - El código está estructurado para ser **modular** y **reutilizable**. Al utilizar `include()` de PHP para manejar conexiones a la base de datos y lógica externa, el proyecto se mantiene organizado y fácil de mantener. Por ejemplo, el archivo `conexion.php` se encarga de las conexiones a la base de datos, permitiendo que otros scripts tengan código limpio y conciso. + +### 4. **Retroalimentación para los Usuarios** + - Para una mejor experiencia de usuario, el sistema proporciona retroalimentación visual y textual después de realizar operaciones, como el registro de nuevos libros. Esto incluye mensajes de éxito y error, junto con íconos relevantes (e.g., marcas de verificación para el éxito y cruces rojas para errores). + +--- + +## Ejemplo de Mejoras + +### Antes: Uso Directo de Consultas SQL + ```php + $sql = "INSERT INTO libros (Titulo, Tipo, genero, ID_autor, ID_editor, ID_traductor) + VALUES ('$Titulo', '$Tipo', '$genero', '$ID_autor', '$ID_editor', '$ID_traductor')"; + ``` + + - **Problema**: Este método es vulnerable a **inyecciones SQL** ya que los datos del usuario se insertan directamente en la consulta sin validación ni saneamiento. + +### Después: Uso de Sentencias Preparadas + ```php + $stmt = $conn->prepare("INSERT INTO libros (Titulo, Tipo, genero, ID_autor, ID_editor, ID_traductor) + VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->bind_param("ssssss", $Titulo, $Tipo, $genero, $ID_autor, $ID_editor, $ID_traductor); + ``` + + - **Mejora**: Este método no solo asegura la base de datos, sino que también mejora el rendimiento al **precompilar** la consulta SQL, lo que permite ejecuciones repetidas más rápidas y seguras. + +### Optimización de la Conexión + - Se movió la lógica de conexión a la base de datos a un archivo separado (`conexion.php`) y se reutilizó en diferentes scripts. Esto reduce la redundancia en el código y facilita el mantenimiento en el futuro. + +--- + +## Próximos Pasos + +El proyecto está en su fase inicial, pero se planean las siguientes características y mejoras para futuras versiones: + +- **Opciones avanzadas de búsqueda y filtrado** para facilitar la navegación en la base de datos de la biblioteca. +- Implementación de **funcionalidad API** para integrar operaciones completas de CRUD. +- Capacidades de **informes y análisis de datos** para una mejor toma de decisiones y seguimiento del rendimiento. +- Interfaz grafica mas intuitiva y moderna. + +--- + +## Contribuciones + +Si tienes sugerencias o mejoras, no dudes en hacer un fork del repositorio y enviar un pull request. El proyecto está diseñado para evolucionar con el tiempo, y tus contribuciones pueden ayudar a mejorarlo aún más. + +--- + +## Autor + +Este proyecto fue desarrollado por mi, **@trbureiyan**, en el curso de Bases de Datos con la ayuda del profesor Miller Cerquera Garcia con el objetivo de crear una plataforma eficiente y segura para gestionar una biblioteca virtual. El código está optimizado para ser escalable y facilitar futuras mejoras. \ No newline at end of file diff --git a/books/Mantenimiento/Ingresos/ingreso_autores.php b/books/Mantenimiento/Ingresos/ingreso_autores.php index 85b28a8..69a5cc7 100644 --- a/books/Mantenimiento/Ingresos/ingreso_autores.php +++ b/books/Mantenimiento/Ingresos/ingreso_autores.php @@ -7,12 +7,7 @@ */ //realizamos una conexion al servidor - $servername = "localhost"; - $username = "root"; - $password = ""; - $dbname = "libros"; - - $conn = mysqli_connect($servername, $username, $password, $dbname); + include "../../includes/conexion.php"; // Verificamos si hay conexión if($conn->connect_error){ diff --git a/books/Mantenimiento/Ingresos/ingreso_editores.php b/books/Mantenimiento/Ingresos/ingreso_editores.php index aa3bc7a..a06e304 100644 --- a/books/Mantenimiento/Ingresos/ingreso_editores.php +++ b/books/Mantenimiento/Ingresos/ingreso_editores.php @@ -3,16 +3,11 @@ /** * Pagina de ingreso de autor y conexion a la base de datos * @author @trbureiyan - * @version 1.2 // asegurado contra sql injection + * @version 1.3 // asegurado contra sql injection */ //realizamos una conexion al servidor - $servername = "localhost"; - $username = "root"; - $password = ""; - $dbname = "libros"; - - $conn = mysqli_connect($servername, $username, $password, $dbname); + include "../../includes/conexion.php"; // Verificamos si hay conexión if($conn->connect_error){ diff --git a/books/Mantenimiento/Ingresos/ingreso_libros.php b/books/Mantenimiento/Ingresos/ingreso_libros.php new file mode 100644 index 0000000..3a2d508 --- /dev/null +++ b/books/Mantenimiento/Ingresos/ingreso_libros.php @@ -0,0 +1,34 @@ +prepare("INSERT INTO libros (Titulo, Tipo, genero, ID_autor, ID_editor, ID_traductor) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->bind_param("ssssss", $Titulo, $Tipo, $genero, $ID_autor, $ID_editor, $ID_traductor); + + if($stmt->execute()) { + echo "
Se grabó un registro
"; + echo ""; + } else { + echo "Error al insertar: " . $stmt->error . "
"; + echo ""; + } + + $stmt->close(); + $conn->close(); +?> diff --git a/books/Mantenimiento/Ingresos/ingreso_traductores.php b/books/Mantenimiento/Ingresos/ingreso_traductores.php index 02f89ca..aa7e154 100644 --- a/books/Mantenimiento/Ingresos/ingreso_traductores.php +++ b/books/Mantenimiento/Ingresos/ingreso_traductores.php @@ -3,16 +3,11 @@ /** * Pagina de ingreso de autor y conexion a la base de datos * @author @trbureiyan - * @version 1.2 // asegurado contra sql injection + * @version 1.3 // asegurado contra sql injection */ //realizamos una conexion al servidor - $servername = "localhost"; - $username = "root"; - $password = ""; - $dbname = "libros"; - - $conn = mysqli_connect($servername, $username, $password, $dbname); + include "../../includes/conexion.php"; // Verificamos si hay conexión if($conn->connect_error){ @@ -22,7 +17,7 @@ // Declaramos las variables que se utilizarán para insertar los datos en la tabla $Nombre = $_POST['Nombre']; $Apellidos = $_POST['Apellidos']; - $idioma_nativo = $_POST['idioma_nativo']; + $idioma_nativo = $_POST['idioma_nativo']; $idiomas_traduccion = $_POST['idiomas_traduccion']; $certificaciones = $_POST['certificaciones']; diff --git a/books/Mantenimiento/libros.php b/books/Mantenimiento/libros.php index 528b760..5df0ff2 100644 --- a/books/Mantenimiento/libros.php +++ b/books/Mantenimiento/libros.php @@ -2,7 +2,7 @@ /** * Pagina principal para agregar datos de un libro * @author @trbureiyan - * @version 1.2 + * @version 1.3 */ include "../includes/conexion.php"; diff --git a/books/index.php b/books/index.php index ca56dd8..01e10ca 100644 --- a/books/index.php +++ b/books/index.php @@ -4,7 +4,7 @@ * Esta es la página principal de la aplicación * Proporciona un menú con enlaces a las diferentes partes de la aplicación * @author @trbureiyan & Miller Cercera Garcia - * @version 1.2 + * @version 1.2.1 */ ?> @@ -62,6 +62,7 @@