Skip to content

Commit

Permalink
Implementación CRUD y optimización OLTP
Browse files Browse the repository at this point in the history
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
trbureiyan committed Oct 23, 2024
1 parent e913681 commit 3a5e204
Show file tree
Hide file tree
Showing 8 changed files with 303 additions and 25 deletions.
191 changes: 191 additions & 0 deletions Database/libros.sql
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 */;
71 changes: 69 additions & 2 deletions README.md
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.
7 changes: 1 addition & 6 deletions books/Mantenimiento/Ingresos/ingreso_autores.php
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand Down
9 changes: 2 additions & 7 deletions books/Mantenimiento/Ingresos/ingreso_editores.php
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand Down
34 changes: 34 additions & 0 deletions books/Mantenimiento/Ingresos/ingreso_libros.php
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();
?>
11 changes: 3 additions & 8 deletions books/Mantenimiento/Ingresos/ingreso_traductores.php
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand All @@ -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'];

Expand Down
2 changes: 1 addition & 1 deletion books/Mantenimiento/libros.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/**
* Pagina principal para agregar datos de un libro
* @author @trbureiyan
* @version 1.2
* @version 1.3
*/

include "../includes/conexion.php";
Expand Down
3 changes: 2 additions & 1 deletion books/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
?>

Expand Down Expand Up @@ -62,6 +62,7 @@
<li class="topmenu"><a href="Mantenimiento/autores.php?pag=mto_ef">Autores</a></li>
<li class="topmenu"><a href="Mantenimiento/editores.php?pag=mto_ef" >Editores</a></li>
<li class="topmenu"><a href="Mantenimiento/traductores.php?pag=mto_ef" >Traductores</a></li>
<li class="topmenu"><a href="Mantenimiento/libros.php?pag=mto_ef" >Libros</a></li>

<!-- <li class="topmenu"><a href="pag_codeudor.php?pag=mto_ef">CODEUDOR</a></li>
<li class="topmenu"><a href="pag_lineas.php?pag=mto_ef" >LINEAS CREDITOS</a></li>
Expand Down

0 comments on commit 3a5e204

Please sign in to comment.