35
16 2016 NOTA LEGAL El presente documento de trabajo ha sido incluido dentro de nuestro repositorio de literatura gris por solicitud del autor, con fines informativos, educativos o académicos. Asimismo, los argumentos, datos y análisis incluidos en el texto son responsabilidad absoluta del autor y no representan la opinión del Fondo Editorial o de la Universidad. DISCLAIMER This coursework paper has been uploaded to our grey literature repository due to the request of the author. This document should be used for informational, educational or academic purposes only. Arguments, data and analysis included in this document represent authors’ opinion not the Press or the University. DE LA TEORÍA A LA PRÁCTICA EN DISEÑO DE BASES DE DATOS Rubén Enrique Baena Navarro Yulieth Carriazo Regino Universidad Cooperativa de Colombia Sede Montería Documentos de docencia | Course Work coursework.ucc.edu.co N.° 16, noviembre de 2016 doi: http://dx.doi.org/10.16925/greylit.1635

16 Notas De la teoria

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 16 Notas De la teoria

162016

NOTA LEGALEl presente documento de trabajo ha sido incluido dentro de nuestro repositorio de literatura gris por solicitud del autor, con �nes informativos, educativos o académicos. Asimismo, los argumentos, datos y análisis incluidos en el texto son responsabilidad absoluta del autor y no representan la opinión del Fondo Editorial o de la Universidad.

DISCLAIMERThis coursework paper has been uploaded to our grey literature repository due to the request of the author. This document should be used for informational, educational or academic purposes only. Arguments, data and analysis included in this document represent authors’ opinion not the Press or the University.

DE LA TEORÍA A LA PRÁCTICA

EN DISEÑO DE BASES DE DATOS

Rubén Enrique Baena NavarroYulieth Carriazo Regino

Universidad Cooperativa de ColombiaSede Montería

Documentos de docencia | Course Workcoursework.ucc.edu.co

N.° 16, noviembre de 2016doi: http://dx.doi.org/10.16925/greylit.1635

Page 2: 16 Notas De la teoria

BY NC ND

Este documento puede ser consultado, descargado o reproduci-do desde nuestro repositorio de documentos de trabajo (http://coursework.ucc.edu.co) para uso de sus contenidos, bajo la li-cencia de Creative Commons Reconocimiento-No Comercial-Sin Obra Derivada 4.0 Internacional. http://creativecommons.org/licenses/by-nc-nd/4.0/

Acerca del autorRubén Enrique Baena Navarro. Doctorando en Pro-yectos, Magíster en Software Libre con especialidad en desarrollo de aplicaciones en entornos libres. Pro-fesor instructor, Programa de Ingeniería de Sistemas, Universidad Cooperativa de Colombia, sede Monte-ría, Colombia.

Correo electrónico: [email protected]

Yulieth Carriazo Regino. Ingeniera de Sistemas y Contadora Pública, candidata a Magíster en Audito-ria y Gestión Empresarial. Profesora catedrática, Uni-versidad Cooperativa de Colombia, sede Montería, Colombia.

Correo electrónico: [email protected]

Cómo citar este documentoBaena-Navarro, R. y Carriazo-Regino, Y. (2016). De la teoría a la práctica en diseño de bases de datos. (Docu-mento de docencia N.° 16). Bogotá: Ediciones Univer-sidad Cooperativa de Colombia. Doi: http://dx.doi.org/10.16925/greylit.1635

Page 3: 16 Notas De la teoria

TABLA DE CONTENIDO

Introducción 5

Objetivo general 5

Entendiendo el mvc con un crud 5

¿Qué es un crud? 5¿Qué es un Framework css? 5¿Qué es php? 5¿Qué es el mvc? 6¿Qué es Atom? 6¿Qué es xampp? 6

Creando un crud con mysql / Mariadb, Framework Twitter Bootstrap y php (mvc) 6

Primeros pasos 6Creando la base de datos 8Actividades 9

Creando carpeta del proyecto y las subcarpetas para el patrón mvc. 11

Actividades 32

Conclusión 33

Referencias 34

Page 4: 16 Notas De la teoria

DE LA TEORÍA A LA PRÁCTICA EN DISEÑO DE BASES DE DATOS

Rubén Enrique Baena NavarroYulieth Carriazo Regino

RESUMEN

Las empresas siempre han requerido del trata-miento, administración de datos e información, organizados y listos para su uso posterior; las solu-ciones para atender esta necesidad utilizadas por las empresas son diversas. Cuando aún no estaban presentes las tecnologías de información de la ac-tualidad, los datos se almacenaban en archivos con cajones, carpetas y fichas. Gracias a las soluciones informáticas, estos datos se guardan en archivos digitales dentro de las unidades de almacenamien-to del computador (bien sea en archivos binarios, o en hojas de cálculo, imágenes, audio, video, entre otros). El objetivo del presente documento es faci-litar el estudio de las técnicas para diseñar bases de datos, su creación en sistemas gestores de bases de datos como mysql/Mariadb para que a través de Crear, Leer, Actualizar y Borrar (crud) que utilice el patrón modelo-vista-controlador (mvc) con php un usuario pueda realizar operaciones con la informa-ción registrada en el mismo.

Palabras clave: bases de datos, controlador, Framework, modelo, php, sql.

16

Page 5: 16 Notas De la teoria

Nota de clase · 5

IntroducciónActualmente, los desarrolladores de software de cualquier nacionalidad centran su aten-ción en lograr construir aplicaciones en menos tiempo, utilizando la mayor cantidad de están-dares en el diseño de las aplicaciones que per-mitan mayor reutilización del código y mejores mantenimientos de los sistemas desarrollados.

Por ello, de los procesos importantes para la construcción de una aplicación que maneje una base de datos, es sin duda, el diseño de la misma. El montaje de esto se logra apoyado en metodologías y herramientas que —con el uso de la programación orientada a objetos— contribuyan a la concepción e implementa-ción de soluciones informáticas que permitan a los usuarios finales el uso intuitivo de apli-caciones que le faciliten el tratamiento de la información.

El presente documento trata sobre las téc-nicas para la creación de diseños de bases de datos, su montaje en un sistema gestor de bases de datos (sgbd) como lo es mysql / Mariadb; para finalmente, orientar la creación de una aplicación que utilice Framework css para facilitar la construcción de interfaces de usuario, el lenguaje de programación orien-tado a objetos php y el uso del patrón mvc que permite tener una separación lógica y física de los componentes de la aplicación. El uso de estos elementos se constituye en un patrón internacionalmente aceptado, faculta a su vez a los diseñadores y desarrolladores de la aplicación y favorece a una excelente organi-zación del trabajo.

Objetivo general

Diseñar bases de datos para la construcción de un crud con aplicaciones Web utilizando el patrón mvc (modelo-vista-controlador).

Entendiendo el mvc con un crud

¿Qué es un crud?

crud es el acrónimo en inglés de Create, Read, Update and Delete que traduciría “Crear, Leer, Actualizar y Borrar”. Se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software, en este caso para el desarrollo Web [1].

¿Qué es un Framework css?

Un framework es simplemente la forma de organizar el desarrollo de una aplicación, es un esquema (un esqueleto, un patrón). Los framework css facilitan el diseño de interfaz de usuario, para que ésta sea capaz de adap-tarse a los distintos navegadores, configura-ciones o incluso dispositivos; la selección de un framework de apoyo puede ahorrar mucho tiempo y esfuerzo, no son un sustituto para saber cómo funciona el css.

Existen diversas alternativas de framework css. En esta práctica se utilizará Twitter Boots-trap, un framework o conjunto de herramien-tas de código abierto para diseño de sitios y aplicaciones Web que se constituye en uno de los más populares de GitHub; cuenta con una gran variedad de plantillas de diseño con tipo-grafía, formularios, botones, cuadros, menús de navegación y otros elementos de diseño basado en html y css, así como también, extensiones de JavaScript [2].

¿Qué es php?

php, acrónimo de Hipertexto PreProcessor, es un lenguaje de programación que se interpreta por un servidor web. Los lenguajes del lado del servidor son aquellos que son reconoci-dos, ejecutados e interpretados por el propio servidor y que se envían al cliente en un for-mato comprensible para él [3].

Page 6: 16 Notas De la teoria

6 · Serie documentos de docencia

Ventajas fundamentales:

• El código se encuentra protegido tanto de la manipulación de los usuarios como de la presencia de virus.

• Se caracteriza por su facilidad de aprendizaje.

• Es multiplataforma y no requiere de recur-sos descomedidos.

¿Qué es el mvc?

El patrón Modelo-Vista-Controlador (mvc) es un paradigma que divide las partes que confor-man una aplicación en el modelo, las vistas y los controladores, permitiendo el desarrollo por separado de cada elemento, garantizando así la actualización y mantenimiento del software de forma sencilla y en un menor espacio de tiempo [4].

• Modelo: datos y reglas de negocio.• Vista: muestra la información del modelo

al usuario.• Controlador: gestiona las entradas del

usuario.

Un ejemplo gráfi co de esto puede verse en la fi gura 1.

FIGURA 1. Modelo grá� co de Modelo-Vista –Controlador.

Nota: Revista Telem@tica (Díaz González).

¿Qué es Atom?

Atom, el editor de texto creado por Github [5] tiene funcionalidades como el sistema

de paquetes que permite instalar fácilmente modifi caciones al programa, desde una visua-lización de los cambios que se realizan en el código hasta la posibilidad de usar los contro-les de Vim, pasando por temas que cambian el aspecto. En el ranking de Github se ubica en la posición 27 [6].

¿Qué es xampp?

xampp es una herramienta de software libre que consiste principalmente en el sistema de gestión de bases de datos mysql, el servidor Web Apache y los intérpretes para lenguajes de script: php y Perl [7]. El nombre proviene del acrónimo de X (para cualquiera de los diferen-tes sistemas operativos es una herramienta multiplataforma), Apache, mysql, php, Perl. Desde la versión 5.6.15, xampp cambió la base de datos de mysql a MariaDB, esta última es un fork de mysql con licencia gpl [8].

Creando un crud con mysql / Mariadb, Framework Twitter Bootstrap y php (mvc)

Primeros pasos

Instalar editor Atom en WindowsDocumentación del sitio ofi cial:http://fl ight-manual.atom.io/getting-started/sections/installing-atom/

Otras fuentes:

• Descubriendo Atom:h t t p s : / / w w w . y o u t u b e . c o m /watch?v=mVrOU-yi5Jg

• Paquetes que se utilizarían en Atom:h t t p s : / / w w w . y o u t u b e . c o m /watch?v=TS_qrEzP9fE

• Los Themes de Atom:h t t p s : / / w w w . y o u t u b e . c o m /watch?v=wRljEKVZALo

Page 7: 16 Notas De la teoria

Nota de clase · 7

Instalando XAMPP en WindowsDocumentación del sitio ofi cial:https://www.apachefriends.org/es/faq_win-dows.html

Otras fuentes:

• Como instalar xampp en Windows:h t t p s : / / w w w . y o u t u b e . c o m /watch?v=7oFXfcPP9CE

Instalando DBdesigner ForkDBdesinger Fork es un programa diseñador de bases de datos de forma visual, enfocado al

desarrollo de Script sql para: Firebird / Inter-Base, Microsoft sql Server, mysql / MariaDB, Oracle, Postgresql o sqlite. Su descarga para Windows se encuentra disponible en: https://sourceforge.net/projects/dbdesigner-fork/

Al descargar la versión, sólo debe descompri-mir el archivo.zip: DBDesignerFork-1.5-bin-i386-win32-beta5.zip y ejecutar el archivo: DBDesignerFork.exe al interior de la carpeta /bin de las carpetas y archivos descomprimidos.

A continuación, en la fi gura 2 puede verse el diseño correspondiente al crud elaborado en este documento:

FIGURA 2. Diseño correspondiente al CRUD.

Nota. Elaboración propia.

Este diseño es posible crearlo iniciando el pro-grama DBdesigner Fork, clic en File -> New para iniciar la creación de las tablas clic en el icono que corresponde a “New Table” (fi gura 3); seguidamente, haga doble clic en “Table” y se podrán agregar los campos deseados (fi gura 4).

FIGURA 3. “New Table”.

Nota. Elaboración propia.

Page 8: 16 Notas De la teoria

8 · Serie documentos de docencia

FIGURA 4. Agregar campos deseados.

Nota. Elaboración propia.

Para la relación entre tablas se debe seleccio-nar en la barra de herramientas, teniendo en cuenta la cardinalidad (fi gura 5).

FIGURA 5. Relación de tablas.

Nota. Elaboración propia.

Para generar el Scriptsql que se utilizará en el sgbd con la ayuda de la herramienta xampp, haga clic en File -> Export -> sql Create Script…(fi gura 6).

FIGURA 6. Generando ScriptSQL.

Nota. Elaboración propia.

Esto abre el cuadro de diálogo que se muestra en la fi gura 7.

FIGURA 7. Cuadro de diálogo.

Nota. Elaboración propia.

Es importante tener en cuenta el sgbd a uti-lizar; una vez defi nido, haga clic en el botón Save Script to fi le, seleccione la ruta donde guardará el Scriptsql: ScriptSQL Ejemplo.sql y cierre los cuadros de diálogo.

Creando la base de datos

Para realizar este proceso conforme a los apartados anteriores utilice las herramientas xamppp, el ScriptSQL realizado ScriptSQL Ejem-plo.sql así: (fi gura 8).

FIGURA 8. Inicio el control panel.

Nota. Elaboración propia.

Page 9: 16 Notas De la teoria

Nota de clase · 9

A continuación, inicie los servicios Apache y mysql (fi gura 9) en el botón Start para cada uno.

FIGURA 9. Inicio de servicios Apache y MySQL.

Nota. Elaboración propia.

Al iniciar los servicios, puede iniciar phpmyAd-min (fi gura 10) para crear la base de datos; abrir un browser e iniciar xampp de forma local vía localhost:

FIGURA 10. Inicio de PHPMyAdmin.

Nota. Elaboración propia.

Al hacer clic en el enlace phpMyAdmin de la fi gura 10, podrá ingresar a la interfaz que le permitirá crear la base de datos que para el ejemplo de este documento se llamará: MVC_PHP; luego se importará el archivo Scriptsql generado en apartado anterior (fi gura 11).

FIGURA 11. Creación de base de datos.

Nota. Elaboración propia.

FIGURA 12. Importando ScriptSQL con tablas.

Nota. Elaboración propia.

FIGURA 13. Base de Datos en la interfaz de phpMyAdmin.

Nota. Elaboración propia.

Actividades

Para cada ejercicio, realizar modelo entidad relación utilizando la herramienta DBdesigner Fork normalizado en 3fn, para cada ejercicio ingrese tres tuplas por cada tabla utilizando la herramienta phpMyAdmin.

Ejercicio 1Una tienda especializada en componentes electrónicos compra sus existencias a una serie de proveedores, vendiéndolas posterior-mente a sus clientes, a la vez que lleva a cabo el control de almacén adecuado para contro-lar sus existencias en todo momento.

La gestión de proveedores tiene unida la ges-tión de los datos administrativos de estos más la información de los componentes que cada proveedor hace. La gestión de proveedores, además, del rutinario mantenimiento de los datos relacionados, se encarga de generar los listados de las piezas hechas por un determi-nado proveedor o los proveedores que sirven una determinada pieza.

Page 10: 16 Notas De la teoria

10 · Serie documentos de docencia

Cuando un cliente solicita un determinado componente, se comprueba que haya existen-cias y se le informa de su precio. Si el cliente adquiere el producto, se actualizará el alma-cén y se le emitirá una factura. Si no hay exis-tencias del componente, pero el cliente está interesado, se procederá a almacenar la peti-ción con objeto de realizar el correspondiente pedido al proveedor. El control del almacén se encarga de tener actualizado el almacén de existencias dando de alta los componentes que llegan, eliminando componentes defec-tuosos, asimismo, realizando los listados de componentes disponibles en el almacén y de los componentes pendientes de ser pedidos a un proveedor.

Ejercicio 2Cree o Sea es una empresa dedicada al alqui-ler de cd-rom de audio. Dicha empresa tiene un local de atención al público, donde están expuestas las carátulas de los cd más deman-dados y las últimas novedades, aunque tam-bién existen listados en papel de todos los títulos que se podrían alquilar.

Cuando un cliente solicita en alquiler un título, se comprueba si hay ejemplares dispo-nibles y si el cliente no tiene problemas por ejemplares no devueltos, quedando constan-cia de la fecha de alquiler y la fecha máxima de entrega; de forma que cuando el cliente devuelva el ejemplar, se podrá comprobar si se le tiene que imponer una sanción. Cada cliente puede solicitar una relación de los cd que ha alquilado previamente. Cada ejemplar de cada título debe quedar plenamente iden-tificado (incluyendo la información necesaria para su rápida localización física).

Ejercicio 3Se tienen clientes de los que se guarda un número de identificación del cliente, nombre,

apellidos, lista de teléfonos, fax y correo elec-trónico. Los clientes realizan pedidos (un pedido no puede ser realizado por dos clientes simul-táneamente). Cada pedido tiene un número de pedido, una fecha asociada y una persona de contacto. E igualmente, cada pedido aglu-tina varias líneas de detalle, cada línea con una cantidad y referencia a un artículo. Los artí-culos tienen un descriptor, un identificador de familia y un identificador de modelo. Varias líneas de detalle correspondientes a uno o varios pedidos (bien en su totalidad, bien en parte) constituyen un albarán.

Los albaranes contienen una fecha de entrega, una dirección de entrega y el nombre com-pleto del receptor. Varias líneas de detalle correspondientes a uno o varios albaranes (bien en su totalidad, bien en parte) constitu-yen una factura, la cual contiene un número de factura, una fecha de cobro y un modo de pago.

Ejercicio 4Un centro de instalaciones deportivas quiere hacer una aplicación de reservas. En el cen-tro existen instalaciones deportivas (piscinas, gimnasios, frontones, etc.). El centro en cues-tión tiene socios de los cuales se almacenan su nombre, dirección, ciudad, provincia, telé-fono y estado. Existen una serie de artículos que se pueden alquilar junto con las reservas (balones, redes, raquetas, etc.).

Cada instalación es reservada por un socio en una fecha dada desde una hora de inicio hasta una hora de fin, siempre y cuando este al día en sus cuotas. Cada reserva puede tener asociada uno o varios artículos deportivos que se alquilan por separado. Por ejemplo, si yo quiero hacer una reserva para jugar voleibol, tengo que reservar una instalación como el polideportivo más un artículo red, más un artículo: balón.

Page 11: 16 Notas De la teoria

Nota de clase · 11

Ejercicio 5Una empresa avícola desea llevar el control de la alimentación diaria de las aves en cada una de las etapas básicas de crecimiento (polluelo, joven y consumo). Cada ración de alimento tiene una composición con base en tres elementos, la cual es diferente en cada una de las etapas. Cada etapa tiene defi nido un periodo.

Todo empieza con la fecha de nacimiento del ave-polluelo y fi naliza con la fecha de venta del ave de consumo. Las aves se identifi can desde su nacimiento y con base en el número de lote de incubación. Cada lote posee un tamaño de población y una fecha de entrega para el inicio de crianza. El control de alimen-tación de cada población de un lote de crianza a lo largo de cada etapa incluye la cantidad total de la ración de alimento que se le da, la población de aves al inicio del día y el control de la merma con base al número de aves que mueren el día anterior.

Creando carpeta del proyecto y las subcarpetas para el patrón mvcCrear la carpeta del proyecto llamada primer-mvc en la ruta: c:/xampp/htdocs/ (fi gura 14).

FIGURA 14. Creando carpeta.

Nota. Elaboración propia.

Distribución de subcarpetas (fi gura 15).

Controller. Contendrá los controladores. Compuesto por acciones que en código son métodos / funciones.

Model. Contendrá las y entidades de negocio.

View. Contendrá las vistas (código html).

FIGURA 15. Subcarpetas.

Nota. Elaboración propia.

Además, crear la carpeta y archivo (fi gura 16).

Assets. Contendrá el diseño css, código JavaS-cript (js) y fuentes del proyecto.

index.php. Será el FrontController.

FIGURA 16. Creación carpeta y archivo.

Nota. Elaboración propia.

FrontController (index.php)El proyecto comienza ejecutando el archivo index.php, que va a hacer el papel de un Front-Controller, encargado de validar que contro-lador y acción se está ejecutando mientras que el usuario navega. La lógica dice que mediante la queryString habrá 2 (dos) paráme-tros esenciales para saber que controlador y acción ejecutar el cual es “c” de controlador y “a” de acción.

Page 12: 16 Notas De la teoria

12 · Serie documentos de docencia

Código del index.php:

<?php //Se incluye la configuración de conexión a datos en el //SGBD: MariaDB. require_once ‘model/database.php’;

//Para registrar productos es necesario iniciar los proveedores //de los mismos, por ello la variable controller para este //ejercicio se inicia con el ‘proveedor’. $controller = ‘proveedor’;

// Todo esta lógica hará el papel de un FrontController if(!isset($_REQUEST[‘c’])) { //Llamado de la página principal require_once “controller/$controller.controller.php”; $controller = ucwords($controller) . ‘Controller’; $controller = new $controller; $controller->Index(); } else { // Obtiene el controlador a cargar $controller = strtolower($_REQUEST[‘c’]); $accion = isset($_REQUEST[‘a’]) ? $_REQUEST[‘a’] : ‘Index’;

// Instancia el controlador require_once “controller/$controller.controller.php”; $controller = ucwords($controller) . ‘Controller’; $controller = new $controller;

// Llama la acción call_user_func( array( $controller, $accion ) ); }

ModeloA continuación, crear los modelos:

database.php: Se define la conexión a la base de datos.

<?phpclass Database{

Page 13: 16 Notas De la teoria

Nota de clase · 13

//Esta función permite la conexión al SGBD: MariaDB. //host = tipo de conexión local - ‘localhost’. //dbname = nombre de la base de datos. //charset = utf8, indica la codificación de caracteres utilizada. //root = nombre de usuario (solo para fines académicos=root). //’’ = contraseña del root (solo para fines académicos).

public static function Conectar() { $pdo = new PDO(‘mysql:host=localhost;dbname=mvc_php;charset=utf8’, ‘root’, ‘’); //Filtrando posibles errores de conexión. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; }}

proveedor.php: Atributos y métodos para el modelo proveedor.

<?phpclass proveedor{ //Atributo para conexión a SGBD private $pdo;

//Atributos del objeto proveedor public $nit; public $razonS; public $dir; public $tel;

//Método de conexión a SGBD. public function __CONSTRUCT() { try { $this->pdo = Database::Conectar(); } catch(Exception $e) { die($e->getMessage()); } }

//Este método selecciona todas las tuplas de la tabla //proveedor en caso de error se muestra por pantalla.

Page 14: 16 Notas De la teoria

14 · Serie documentos de docencia

public function Listar() { try { $result = array(); //Sentencia SQL para selección de datos. $stm = $this->pdo->prepare(“SELECT * FROM proveedor”); //Ejecución de la sentencia SQL. $stm->execute(); //fetchAll — Devuelve un array que contiene todas las filas del conjunto //de resultados return $stm->fetchAll(PDO::FETCH_OBJ); } catch(Exception $e) { //Obtener mensaje de error. die($e->getMessage()); } }

//Este método obtiene los datos del proveedor a partir del nit //utilizando SQL. public function Obtener($nit) { try { //Sentencia SQL para selección de datos utilizando //la cláusula Where para especificar el nit del proveedor. $stm = $this->pdo->prepare(“SELECT * FROM proveedor WHERE nit = ?”); //Ejecución de la sentencia SQL utilizando el parámetro nit. $stm->execute(array($nit)); return $stm->fetch(PDO::FETCH_OBJ); } catch (Exception $e) { die($e->getMessage()); } }

//Este método elimina la tupla proveedor dado un nit. public function Eliminar($nit) { try { //Sentencia SQL para eliminar una tupla utilizando //la cláusula Where. $stm = $this->pdo

Page 15: 16 Notas De la teoria

Nota de clase · 15

->prepare(“DELETE FROM proveedor WHERE nit = ?”);

$stm->execute(array($nit)); } catch (Exception $e) { die($e->getMessage()); } }

//Método que actualiza una tupla a partir de la cláusula //Where y el nit del proveedor. public function Actualizar($data) { try { //Sentencia SQL para actualizar los datos. $sql = “UPDATE proveedor SET razonS = ?, dir = ?, tel = ? WHERE nit = ?”; //Ejecución de la sentencia a partir de un arreglo. $this->pdo->prepare($sql) ->execute( array( $data->razonS, $data->dir, $data->tel, $data->nit ) ); } catch (Exception $e) { die($e->getMessage()); } } //Método que registra un nuevo proveedor a la tabla. public function Registrar(proveedor $data) { try { //Sentencia SQL. $sql = “INSERT INTO proveedor (nit,razonS,dir,tel) VALUES (?, ?, ?, ?)”; $this->pdo->prepare($sql) ->execute(

Page 16: 16 Notas De la teoria

16 · Serie documentos de docencia

array( $data->nit, $data->razonS, $data->dir, $data->tel, ) ); } catch (Exception $e) { die($e->getMessage()); } }}

producto.php: Atributos y métodos para el modelo producto (Su lógica es similar al modelo anterior).

<?phpclass producto{ private $pdo;

public $idProducto; public $nit; public $nomprod; public $precioU; public $descrip;

public function __CONSTRUCT() { try { $this->pdo = Database::Conectar(); } catch(Exception $e) { die($e->getMessage()); } }

public function Listar() { try { $result = array();

Page 17: 16 Notas De la teoria

Nota de clase · 17

$stm = $this->pdo->prepare(“SELECT * FROM producto”); $stm->execute();

return $stm->fetchAll(PDO::FETCH_OBJ); } catch(Exception $e) { die($e->getMessage()); } }

public function Obtener($idProducto) { try { $stm = $this->pdo->prepare(“SELECT * FROM producto WHERE idProducto = ?”); $stm->execute(array($idProducto)); return $stm->fetch(PDO::FETCH_OBJ); } catch (Exception $e) { die($e->getMessage()); } }

public function Eliminar($idProducto) { try { $stm = $this->pdo ->prepare(“DELETE FROM producto WHERE idProducto = ?”); $stm->execute(array($idProducto)); } catch (Exception $e) { die($e->getMessage()); } }

public function Actualizar($data) { try { $sql = “UPDATE producto SET nomprod = ?, precioU = ?, descrip = ? WHERE idProducto = ?”; $this->pdo->prepare($sql)

Page 18: 16 Notas De la teoria

18 · Serie documentos de docencia

->execute( array( $data->nomprod, $data->precioU, $data->descrip, $data->idProducto ) ); } catch (Exception $e) { die($e->getMessage()); } }

public function Registrar(producto $data) { try { $sql = “INSERT INTO producto (idProducto,nit,nomprod,precioU,descrip) VALUES (?, ?, ?, ?,?)”; $this->pdo->prepare($sql) ->execute( array( $data->idProducto, $data->nit, $data->nomprod, $data->precioU, $data->descrip ) ); } catch (Exception $e) { die($e->getMessage()); } }}

A continuación, se especifican los controladores del proyecto:

En la carpeta Controller del proyecto, cree:

proveedor.controller.php<?php//Se incluye el modelo donde conectará el controlador.require_once ‘model/proveedor.php’;

Page 19: 16 Notas De la teoria

Nota de clase · 19

class ProveedorController{

private $model;

//Creación del modelo public function __CONSTRUCT(){ $this->model = new proveedor(); }

//Llamado plantilla principal public function Index(){ require_once ‘view/header.php’; require_once ‘view/proveedor/proveedor.php’; require_once ‘view/footer.php’; }

//Llamado a la vista proveedor-editar public function Crud( ){ $pvd = new proveedor();

//Se obtienen los datos del proveedor a editar. if(isset($_REQUEST[‘nit’])){ $pvd = $this->model->Obtener($_REQUEST[‘nit’]); }

//Llamado de las vistas. require_once ‘view/header.php’; require_once ‘view/proveedor/proveedor-editar.php’; require_once ‘view/footer.php’; }

//Llamado a la vista proveedor-nuevo public function Nuevo(){ $pvd = new proveedor();

//Llamado de las vistas. require_once ‘view/header.php’; require_once ‘view/proveedor/proveedor-nuevo.php’; require_once ‘view/footer.php’; }

//Método que registrar al modelo un nuevo proveedor. public function Guardar(){ $pvd = new proveedor();

//Captura de los datos del formulario (vista).

Page 20: 16 Notas De la teoria

20 · Serie documentos de docencia

$pvd->nit = $_REQUEST[‘nit’]; $pvd->razonS = $_REQUEST[‘razonS’]; $pvd->dir = $_REQUEST[‘dir’]; $pvd->tel = $_REQUEST[‘tel’];

//Registro al modelo proveedor. $this->model->Registrar($pvd);

//header() es usado para enviar encabezados HTTP sin formato. //”Location:” No solamente envía el encabezado al navegador, sino que //también devuelve el código de status (302) REDIRECT al //navegador header(‘Location: index.php’); }

//Método que modifica el modelo de un proveedor. public function Editar(){ $pvd = new proveedor();

$pvd->nit = $_REQUEST[‘nit’]; $pvd->razonS = $_REQUEST[‘razonS’]; $pvd->dir = $_REQUEST[‘dir’]; $pvd->tel = $_REQUEST[‘tel’];

$this->model->Actualizar($pvd);

header(‘Location: index.php’); }

//Método que elimina la tupla proveedor con el NIT dado. public function Eliminar(){ $this->model->Eliminar($_REQUEST[‘nit’]); header(‘Location: index.php’); }}

producto.controller.php: Contiene una lógica similar al apartado anterior.

<?phprequire_once ‘model/producto.php’;

class ProductoController{

private $model;

Page 21: 16 Notas De la teoria

Nota de clase · 21

public function __CONSTRUCT(){ $this->model = new producto(); }

//Llamado plantilla principal public function Index(){ require_once ‘view/header.php’; require_once ‘view/producto/producto.php’; require_once ‘view/footer.php’; }

public function Crud(){ $prod = new producto();

if(isset($_REQUEST[‘idProducto’])){ $prod = $this->model->Obtener($_REQUEST[‘idProducto’]); }

require_once ‘view/header.php’; require_once ‘view/producto/producto-editar.php’; require_once ‘view/footer.php’; }

public function Nuevo(){ $prod = new producto();

require_once ‘view/header.php’; require_once ‘view/producto/producto-nuevo.php’; require_once ‘view/footer.php’; }

public function Guardar(){ $prod = new producto();

$prod->idProducto = $_REQUEST[‘idProducto’]; $prod->nit = $_REQUEST[‘nit’]; $prod->nomprod = $_REQUEST[‘nomprod’]; $prod->precioU = $_REQUEST[‘precioU’]; $prod->descrip = $_REQUEST[‘descrip’];

$this->model->Registrar($prod);

header(‘Location: index.php?c=producto’); }

public function Editar(){

Page 22: 16 Notas De la teoria

22 · Serie documentos de docencia

$prod = new producto(); $prod->idProducto = $_REQUEST[‘idProducto’]; $prod->nit = $_REQUEST[‘nit’]; $prod->nomprod = $_REQUEST[‘nomprod’]; $prod->precioU = $_REQUEST[‘precioU’]; $prod->descrip = $_REQUEST[‘descrip’];

$this->model->Actualizar($prod);

header(‘Location: index.php?c=producto’); }

public function Eliminar(){ $this->model->Eliminar($_REQUEST[‘idProducto’]); header(‘Location: index.php’); }}

En apartados anteriores, se describe la carpeta Assets, que contendrá el diseño css, código JavaScript (js) y fuentes (letras) del proyecto. Para este crud, se utilizará un Framework css que facilita la construcción de las vistas.

¿Por qué usar Framework CSS Bootstrap? • Facilita crear una Web responsive, además

de que podrá verse la interfaz en todos los dispositivos, compatibilidad con la mayo-ría de navegadores y ayudará al posicio-namiento en buscadores.

• Dispone de gran cantidad de funcionali-dades creadas.

• Permite que la velocidad de carga de la Web sea rápida.

• Se encuentra en constante desarrollo, porque cuenta con una gran comunidad de desarrolladores que contribuyen a su funcionalidad.

Para poder instalar el proyecto, debe ir a la url http://getbootstrap.com y realizar la des-carga, existen tres opciones de descarga:

• Descargar el código compilado. Es la ideal para comenzar a trabajar con Bootstrap.

• Descargar código fuente. Contiene todos los archivos originales de Bootstrap, para poder usarlo requiere compilarlo.

• Descargar código fuente en Sass. Esta versión del código fuente está convertida a Sass para facilitar la implementación con apli-caciones como Ruby.

En caso de no cargar al servidor los archivos de Bootstrap, puede utilizar el cdn (conjunto de servidores ubicados en diferentes puntos de una red que contienen copias locales de ciertos contenidos, en este caso, los archivos de Bootstrap) disponible para ello. Con esto se consigue mejorar la carga de la Web.

En este documento se utilizará la opción 1, una vez descargado, descomprimir el fra-mework en la carpeta Assets del proyecto, la estructura de la carpeta debe quedar como se muestra en la figura 17.

Page 23: 16 Notas De la teoria

Nota de clase · 23

FIGURA 17. Carpeta Assets.

Nota. Elaboración propia.

La estructura más básica de Bootstrap la visua-lizaremos a continuación, los archivos aca-bados en *.min.css o *.min.js son versiones comprimidas.

Para ver ejemplos de los tipos de Web que puede crear utilizando este framework, en la Web ofi cial hay una galería de webs creadas con Bootstrap.

Con estos archivos ya es posible crear las vis-tas del proyecto; estas contendrán el código html junto a algo de php para mostrarle al usuario sus interfaces de navegación. En este caso se han creado archivos para listar la data en una tabla html, para crear y actualizar información.

FIGURA 18. Estructura más básica de Bootstrap.

Nota. Tomado del sitio web: http://getbootstrap.com/.

Vista > header.php y footer.phpEn mvc existe el concepto de layout, para no tener que agregar el código html de la cabecera y footer se crean por separados y desde el controlador se invoca de la siguiente manera:

//Llamado plantilla principal public function Index(){ require_once ‘view/header.php’; require_once ‘view/producto/producto.php’; require_once ‘view/footer.php’; }

Código de la vista header ubicada en la ruta view->header.php:<!DOCTYPE html><html lang=”es”> <head> <title>CRUD MVC PHP + MySQL</title> <meta charset=”utf-8” />

Page 24: 16 Notas De la teoria

24 · Serie documentos de docencia

<meta name=”viewport” content=”width=device-width, initial-scale=1”> <link rel=”stylesheet” href=”assets/css/bootstrap.min.css” /> <link rel=”stylesheet” href=”assets/css/bootstrap-theme.min.css” /> <link rel=”stylesheet” href=”assets/js/jquery-ui/jquery-ui.min.css” /> <link rel=”stylesheet” href=”assets/css/style.css” /> <link rel=”stylesheet” href=”assets/css/demo.css”> <link rel=”stylesheet” href=”assets/css/footer-distributed.css”> <link rel=”stylesheet” href=”http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css”> </head> <body> <div class=”container”>

Código de la vista footer ubicada en la ruta view->footer.php: <div class=”row”>

<div class=”col-xs-12”> <hr /> <footer class=”footer-distributed”> <div class=”footer-right”> <a href=”#”><i class=”fa fa-twitter”></i></a> <a href=”#”><i class=”fa fa-github”></i></a> </div> <div class=”footer-left”> <p class=”footer-links”> <a href=”index.php”>Inicio</a> </p> <p>Diseño de Bases de Datos &copy; 2016</p> </div> </footer> </div> </div> </div> <script src=”assets/js/jquery-1.11.2.min.js”></script> <script src=”assets/js/bootstrap.min.js”></script> <script src=”assets/js/jquery-ui/jquery-ui.min.js”></script> <script src=»assets/js/ini.js»></script> <script src=»assets/js/jquery.anexsoft-validator.js»></script> </body></html>

Vistas para el modelo Proveedor, ubicado en View->proveedor:

Page 25: 16 Notas De la teoria

Nota de clase · 25

proveedor.php*Como el header y footer de la maquetación del proyecto existen en las vistas del mismo, solo se genera el contenido para la vista proveedor.php que lista de la tabla las tuplas registradas.

<h1 class=”page-header”>Proveedores</h1><div class=”well well-sm text-right”> <a class=”btn btn-primary” href=”?c=proveedor&a=Nuevo”>Nuevo Proveedor</a> <a class=”btn btn-primary” href=”?c=producto&a=Nuevo”>Nuevo Producto</a></div><table class=”table table-striped”> <thead> <tr> <th style=”width:180px;”>NIT</th> <th style=”width:120px;”>Razón Social</th> <th style=”width:120px;”>Dirección</th> <th style=”width:120px;”>Teléfono</th> </tr> </thead> <tbody> <?php foreach($this->model->Listar() as $r): ?> <tr> <td><?php echo $r->nit; ?></td> <td><?php echo $r->razonS; ?></td> <td><?php echo $r->dir; ?></td> <td><?php echo $r->tel; ?></td> <td> <a href=”?c=proveedor&a=Crud&nit=<?php echo $r->nit; ?>”>Editar</a> </td> <td> <a onclick=”javascript:return confirm(‘¿Seguro de eliminar este registro?’);” href=”?c=pro-veedor&a=Eliminar&nit=<?php echo $r->nit; ?>”>Eliminar</a> </td> </tr> <?php endforeach; ?> </tbody></table>

proveedor-nuevo.php*Como el header y footer de la maquetación del proyecto existen en las vistas del mismo, sólo se genera el contenido para la vista proveedor-nuevo.php que contiene el formulario para el registro de un nuevo proveedor.

<h1 class=”page-header”> Nuevo Registro</h1>

Page 26: 16 Notas De la teoria

26 · Serie documentos de docencia

<ol class=”breadcrumb”> <li><a href=”?c=proveedor”>Proveedores</a></li> <li class=”active”>Nuevo Registro</li></ol><form id=”frm-proveedor” action=”?c=proveedor&a=Guardar” method=”post” enctype=”multipart/form-data”> <div class=”form-group”> <label>Nit</label> <input type=”text” name=”nit” value=”<?php echo $pvd->nit; ?>” class=”form-control” place-holder=”Ingrese Nit Proveedor” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Razón Social</label> <input type=”text” name=”razonS” value=”<?php echo $pvd->razonS; ?>” class=”form-control” placeholder=”Ingrese Razón Social” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Dirección</label> <input type=”text” name=”dir” value=”<?php echo $pvd->dir; ?>” class=”form-control” place-holder=”Ingrese dirección proveedor” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Teléfono</label> <input type=”text” name=”tel” value=”<?php echo $pvd->tel; ?>” class=”form-control” place-holder=”Ingrese teléfono proveedor” data-validacion-tipo=”requerido|min:10” /> </div> <hr /> <div class=”text-right”> <button class=”btn btn-success”>Guardar</button> </div></form><script> $(document).ready(function(){ $(“#frm-proveedor”).submit(function(){ return $(this).validate(); }); })</script>

proveedor-editar.php* Como el header y footer de la maquetación del proyecto existen en las vistas del mismo, solo se genera el contenido para la vista proveedor-nuevo.php que contiene el formulario para el registro de un nuevo proveedor.

Page 27: 16 Notas De la teoria

Nota de clase · 27

<h1 class=”page-header”> <?php echo $pvd->nit != null ? $pvd->razonS : ‘Nuevo Registro’; ?></h1><ol class=”breadcrumb”> <li><a href=”?c=proveedor”>Proveedores</a></li> <li class=”active”><?php echo $pvd->nit != null ? $pvd->razonS : ‘Nuevo Registro’; ?></li></ol><form id=”frm-proveedor” action=”?c=proveedor&a=Editar” method=”post” enctype=”multipart/form-data”> <input type=”hidden” name=”nit” value=”<?php echo $pvd->nit; ?>” /> <div class=”form-group”> <label>Razón Social</label> <input type=”text” name=”razonS” value=”<?php echo $pvd->razonS; ?>” class=”form-control” placeholder=”Ingrese Razón Social” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Dirección</label> <input type=”text” name=”dir” value=”<?php echo $pvd->dir; ?>” class=”form-control” place-holder=”Ingrese dirección proveedor” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Teléfono</label> <input type=”text” name=”tel” value=”<?php echo $pvd->tel; ?>” class=”form-control” place-holder=”Ingrese teléfono proveedor” data-validacion-tipo=”requerido|min:10” /> </div> <hr /> <div class=”text-right”> <button class=”btn btn-success”>Actualizar</button> </div></form><script> $(document).ready(function(){ $(“#frm-proveedor”).submit(function(){ return $(this).validate(); }); })</script>

Considerando una lógica similar de las vistas anteriores, se generan para el modelo producto en la ruta view->producto del proyecto:

producto.php<h1 class=”page-header”>Productos </h1><div class=”well well-sm text-right”> <a class=”btn btn-primary” href=”?c=proveedor&a=Nuevo”>Nuevo Proveedor</a>

Page 28: 16 Notas De la teoria

28 · Serie documentos de docencia

<a class=”btn btn-primary” href=”?c=producto&a=Nuevo”>Nuevo Producto</a></div><table class=”table table-striped”> <thead> <tr> <th style=”width:180px;”>Código Producto</th> <th style=”width:120px;”>NIT Proveedor</th> <th style=”width:120px;”>Nombre Producto</th> <th style=”width:120px;”>Precio Unitario</th> <th style=”width:120px;”>Descripción</th> </tr> </thead> <tbody> <?php foreach($this->model->Listar() as $r): ?> <tr> <td><?php echo $r->idProducto; ?></td> <td><?php echo $r->nit; ?></td> <td><?php echo $r->nomprod; ?></td> <td><?php echo $r->precioU; ?></td> <td><?php echo $r->descrip; ?></td> <td> <a href=”?c=producto&a=Crud&idProducto=<?php echo $r->idProducto; ?>”>Editar</a> </td> <td> <a onclick=”javascript:return confirm(‘¿Seguro de eliminar este registro?’);” href=”?c=pro-ducto&a=Eliminar&idProducto=<?php echo $r->idProducto; ?>”>Eliminar</a> </td> </tr> <?php endforeach; ?> </tbody></table>

producto-nuevo.php<h1 class=”page-header”> Nuevo Registro</h1><ol class=”breadcrumb”> <li><a href=”?c=producto”>Productos</a></li> <li class=”active”>Nuevo Registro</li></ol><form id=”frm-producto” action=”?c=producto&a=Guardar” method=”post” enctype=”multipart/form-data”> <div class=”form-group”> <label>Código Producto</label>

Page 29: 16 Notas De la teoria

Nota de clase · 29

<input type=”text” name=”idProducto” value=”<?php echo $prod->idProducto; ?>” class=”-form-control” placeholder=”Ingrese Código Producto” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Nit Proveedor</label> <input type=”text” name=”nit” value=”<?php echo $prod->nit; ?>” class=”form-control” place-holder=”Ingrese NIT Proveedor” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Nombre Producto</label> <input type=”text” name=”nomprod” value=”<?php echo $prod->nomprod; ?>” class=”-form-control” placeholder=”Ingrese nombre producto” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Precio Unitario</label> <input type=”text” name=”precioU” value=”<?php echo $prod->precioU; ?>” class=”form-con-trol” placeholder=”Ingrese precio unitario” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Descripción del Producto</label> <input type=”text” name=”descrip” value=”<?php echo $prod->descrip; ?>” class=”form-con-trol” placeholder=”Ingrese descripción producto” data-validacion-tipo=”requerido|min:240” /> </div> <hr /> <div class=”text-right”> <button class=”btn btn-success”>Guardar</button> </div></form><script> $(document).ready(function(){ $(“#frm-producto”).submit(function(){ return $(this).validate(); }); })</script>

producto-editar.php<h1 class=”page-header”> <?php echo $prod->idProducto != null ? $prod->nomprod : ‘Nuevo Registro’; ?></h1><ol class=”breadcrumb”> <li><a href=”?c=producto”>Productos</a></li> <li class=”active”><?php echo $prod->idProducto != null ? $prod->nomprod : ‘Nuevo Registro’; ?></li>

Page 30: 16 Notas De la teoria

30 · Serie documentos de docencia

</ol><form id=”frm-producto” action=”?c=producto&a=Editar” method=”post” enctype=”multipart/form-data”> <input type=”hidden” name=”idProducto” value=”<?php echo $prod->idProducto; ?>” /> <div class=”form-group”> <label>Nit Proveedor</label> <input type=”text” name=”nit” value=”<?php echo $prod->nit; ?>” class=”form-control” place-holder=”Ingrese NIT Proveedor” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Nombre Producto</label> <input type=”text” name=”nomprod” value=”<?php echo $prod->nomprod; ?>” class=”-form-control” placeholder=”Ingrese nombre producto” data-validacion-tipo=”requerido|min:100” /> </div> <div class=”form-group”> <label>Precio Unitario</label> <input type=”text” name=”precioU” value=”<?php echo $prod->precioU; ?>” class=”form-con-trol” placeholder=”Ingrese precio unitario” data-validacion-tipo=”requerido|min:20” /> </div> <div class=”form-group”> <label>Descripción del Producto</label> <input type=”text” name=”descrip” value=”<?php echo $prod->descrip; ?>” class=”form-con-trol” placeholder=”Ingrese descripción producto” data-validacion-tipo=”requerido|min:240” /> </div> <hr /> <div class=”text-right”> <button class=”btn btn-success”>Actualizar</button> </div></form><script> $(document).ready(function(){ $(“#frm-producto”).submit(function(){ return $(this).validate(); }); })</script>

Page 31: 16 Notas De la teoria

Nota de clase · 31

Una vez generado todo el código para el proyecto, con el servidor Apache, php y mysql en ejecución de forma local, puede probar el proyecto en el browser:

FIGURA 19. Proveedores.

Nota. Elaboración propia.

FIGURA 20. Nuevo registro I.

Nota. Elaboración propia.

FIGURA 21. Nuevo registro II.

Nota. Elaboración propia.

Page 32: 16 Notas De la teoria

32 · Serie documentos de docencia

FIGURA 22. Productos.

Nota. Elaboración propia.

*Las fuentes de este proyecto están disponibles en: https://github.com/rbaena/mvcPHP

Actividades

Realice crud utilizando mvc + php + Framework css Bootstrap + mysql, para los siguientes casos:

Ejercicio 1Una empresa vende productos a varios clien-tes. Se necesita conocer los datos personales de los clientes: nombre, apellidos, dni, direc-ción y fecha de nacimiento. Cada producto tiene un nombre y un código, así como un pre-cio unitario. Un cliente puede comprar varios productos a la empresa y un mismo producto puede ser comprado por varios clientes. Los productos son suministrados por diferentes proveedores. Se debe tener en cuenta que un producto sólo puede ser suministrado por un proveedor, y que un proveedor puede suminis-trar diferentes productos. De cada proveedor se desea conocer el nif, nombre y dirección.

Ejercicio 2Se desea informatizar la gestión de una empresa de transportes que reparte paque-tes. Los encargados de llevar los paquetes son

los camioneros, de los que se quiere guardar: el dni, nombre, teléfono, dirección, salario y población en la que vive. De los paquetes transportados interesa conocer el código de paquete, descripción, destinatario y dirección del destinatario. Un camionero distribuye muchos paquetes, y un paquete sólo puede ser distribuido por un camionero. De las pro-vincias a las que llegan los paquetes interesa guardar el código de provincia y el nombre. Un paquete sólo puede llegar a una provin-cia, sin embargo, a una provincia pueden llegar varios paquetes. De los camiones que conducen los camioneros interesa conocer la matrícula, modelo, tipo y potencia; un camio-nero puede conducir diferentes camiones en fechas diferentes y un camión puede ser con-ducido por varios camioneros.

Ejercicio 3Se desea informatizar la base de datos de un instituto. En la base de datos se requiere guardar los datos de los profesores del insti-tuto: dni, nombre, dirección y teléfono. Los profesores imparten módulos, y cada módulo tiene un código y un nombre. Cada alumno

Page 33: 16 Notas De la teoria

Nota de clase · 33

está matriculado en uno o varios módulos. De cada alumno se demanda guardar el N.º de expediente, nombre, apellidos y fecha de nacimiento. Los profesores pueden impartir varios módulos, pero un módulo sólo puede ser impartido por un profesor. Cada curso tiene un grupo de alumnos, uno de los cuales es el delegado del grupo.

Ejercicio 4Se desea informatizar una base de datos para almacenar y gestionar la información empleada por una empresa dedicada a la venta de automóviles y dispone de una serie de coches para su venta. Para la realización de esta base de datos, se tiene en cuenta los siguientes aspectos: se necesita conocer la matrícula, marca, modelo, el color y el precio de venta de cada coche. Los datos que interesa conocer de cada cliente son el nif, nombre, dirección, ciudad y número de teléfono; ade-más, los clientes se diferencian por un código interno de la empresa que se incrementa automáticamente cuando un cliente se da de alta de ella. Un cliente puede comprar tan-tos coches como desee a la empresa, pero un coche determinado solo puede ser comprado por un único cliente. El concesionario también se encarga de llevar a cabo las revisiones que se realizan cada coche y cada una de revisión tiene asociado un código que se incrementa automáticamente por cada revisión que se haga. De cada revisión se desea saber si se ha hecho cambio de filtro, de aceite, de frenos u otros. Los coches pueden pasar por varias revisiones en el concesionario.

Ejercicio 5La clínica San Jerónimo necesita llevar un con-trol informatizado de su gestión de pacientes y médicos. De cada paciente se desea guar-dar: el código, nombre, apellidos, dirección, población, provincia, código postal, teléfono y fecha de nacimiento. De cada médico se desea

guardar: el código, nombre, apellidos, telé-fono y especialidad. Se desea llevar el control de cada uno de los ingresos que el paciente hace en el hospital. Cada ingreso que realiza el paciente queda registrado en la base de datos. De cada ingreso se guarda el código de ingreso (que se incrementará automáti-camente cada vez que el paciente realice un ingreso), el número de habitación y cama en la que el paciente realiza el ingreso y la fecha de ingreso. Un médico puede atender varios ingresos, pero el ingreso de un paciente solo puede ser atendido por un único médico. Un paciente puede realizar varios ingresos en el hospital.

ConclusiónLas bases de datos se constituyen en el nucleó de las principales aplicaciones y servicios cor-porativos. En la actualidad existen herramien-tas de gestión y control que permiten verificar su funcionamiento y realizar las correcciones donde sea necesario, brindando una elevada capacidad y solidez para administrar la infor-mación con mínimos o nulos errores.

Es importante considerar que las bases de datos deben responder a consultas y ejecutar transacciones que son aplicadas por admi-nistradores de datos, desarrolladores y usua-rios finales, a quienes, para estos últimos, los desarrolladores de forma transparente deben construir aplicaciones que faciliten el acceso a la información apoyados en estándares que contribuyan a cada una de las etapas del ciclo de vida del software. Es por ello que la utiliza-ción del paradigma del mvc (Model-View-Con-troller) se constituye en una herramienta que ayuda a lograr lo antes mencionado y que el aprendiz pueda pasar de la teoría a la práctica en el diseño de bases de datos, obteniendo una división de las diferentes partes que confor-man una aplicación, permitiendo además la actualización y mantenimiento del software de una forma sencilla.

Page 34: 16 Notas De la teoria

34 · Serie documentos de docencia

Referencias[1] J. L. Rico Guevara y J. F. Rondon Betancourt, “Desarrollo de un framework orientado a la Web basado en

los patrones de diseño mvc y dao en el lenguaje de programación php”, Trabajo de grado, Corporación

Universitaria Minuto de Dios, Bogotá, Colombia, 2013.

[2] D. Cochran, Twitter bootstrap web development how-to, Birmingham, UK: Packt Publishing Ltd., 2012.

[3] L. Welling y L. Thomson, Desarrollo wb con php y mysql, Madrid, España: Anaya Multimedia, 2005.

[4] Y. Díaz González y Y. Fernández Romero, “Patrón modelo-vista-controlador”, Revista Telem@tica, vol. 11, no.

1, pp. 47-57, ene-abr. 2012.

[5] Github. Editor Atom, [en línea], Disponible en Internet: https://atom.io/

[6] Github, Ranking Github, [en línea], Disponible en Internet: https://github-ranking.com/atom

[7] D. D. Dvorski, Installing, confi guring, and developing with xampp, Ontario, Canada: Skills, 2007.

[8] S. Luján Mora. (2013). idesweb: Práctica 8: Administración de un servidor web y php 1 (formularios) [en

línea]. Disponible en: http://hdl.handle.net/10045/33475

Page 35: 16 Notas De la teoria