-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implementación CRUD y optimización OLTP
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.
- Loading branch information
1 parent
e913681
commit 3a5e204
Showing
8 changed files
with
303 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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, '[email protected]'), | ||
(10, 'Brayan', 'Toro Bustos', 573102984722, '[email protected]'), | ||
(11, 'Don patricio', 'carvajal', 2347672310, '[email protected]'); | ||
|
||
-- -------------------------------------------------------- | ||
|
||
-- | ||
-- 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 */; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
<?php | ||
|
||
/** | ||
* Pagina de ingreso de libros y conexion a la base de datos | ||
* @author @trbureiyan | ||
* @version 1.2 // asegurado contra sql injection | ||
*/ | ||
|
||
//realizamos una conexion al servidor | ||
include "../../includes/conexion.php"; | ||
|
||
// Declaramos las variables que se utilizarán para insertar los datos en la tabla | ||
$Titulo = $_POST['Titulo']; | ||
$Tipo = $_POST['Tipo']; | ||
$genero = $_POST['genero']; | ||
$ID_autor = $_POST['ID_autor']; | ||
$ID_editor = $_POST['ID_editor']; | ||
$ID_traductor = $_POST['ID_traductor']; | ||
|
||
// Usamos prepared statements para evitar SQL Injection | ||
$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); | ||
|
||
if($stmt->execute()) { | ||
echo "<p>Se grabó un registro</p>"; | ||
echo "<img src='resources/images/accept.png' alt='Registro exitoso'>"; | ||
} else { | ||
echo "<p>Error al insertar: " . $stmt->error . "</p>"; | ||
echo "<img src='resources/images/delete.png' alt='Error en el registro'>"; | ||
} | ||
|
||
$stmt->close(); | ||
$conn->close(); | ||
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters