Download Id - Daniel Gara

Document related concepts
Transcript
Programación por Capas:
Capas gestor de base de Datos y
ORM
Diseño y Construcción de Productos de Software
Daniel Correa Botero
Jeferson David Ossa
Universidad Nacional de Colombia
Sede Medellín 2013
Capa Gestor de Base de Datos
• Esta capa contiene todo el código sql de la base de
datos, contiene la contraseña y datos de conexión a la
base de datos, la función para cerrar conexión, entre
otras.
• Esta capa se encuentra representada por el archivo
glight/modules/db.php
• Nota: La única forma en que se debe acceder a esta
capa y utilizar las funciones de esta capa es mediante la
capa ORM (mediante la variable $this->orm que
contienen todos los controladores).
Variables de conexión
• Dentro del archivo glight/modules/db.php
encontraremos las siguientes variables de
conexión de la base de datos. Estos variables se
modifican desde glight/configs/include.php
var $server Indica que en servidor se encuentra
la base de datos, por defecto es localhost
var $user Indica el nombre de usuario de la base
de datos
var $pass Indica el password de la base de datos
var $db Indica el nombre de la base de datos
Creación de base de datos
• Ingresamos a http://localhost/phpmyadmin/
• Luego a Bases de datos.
• Luego a crear base de datos y le ponemos el
nombre de work
Creación tabla boss
• CREATE TABLE boss
(id bigint(20) not null,
name VARCHAR(30) not null,
charge VARCHAR(30) not null,
PRIMARY KEY(id))
ENGINE=InnoDB;
Nota: Ingresamos a phpmyadmin – luego seleccionamos la tabla creada
anteriormente – después seleccionamos la opción sql y copiamos y pegamos el
código anterior y lo ejecutamos
Creación tabla clerk
• CREATE TABLE clerk
(id bigint(20) not null,
name VARCHAR(30) not null,
salary VARCHAR(30) not null,
boss bigint(20) null,
PRIMARY KEY(id),
CONSTRAINT b_p FOREIGN KEY (boss)
REFERENCES boss (id)) ENGINE=InnoDB;
Creación tabla user
• CREATE TABLE user
(id bigint(20) NOT NULL AUTO_INCREMENT,
name varchar(30) NOT NULL,
user varchar(10) NOT NULL,
password varchar(72) NOT NULL,
type varchar(20) NOT NULL,
email varchar(50) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY user (user),
UNIQUE KEY email (email))
ENGINE=InnoDB;
Insertar Datos en user
• INSERT INTO `user` (`id`, `name`, `user`,
`password`, `type`, `email`) VALUES
(1, 'Admin', 'admin',
'$2a$08$JyL3VzFSY76kMir2oA0mt.0XrccedWc
vt1F/wu6gFjbZgQmCsjJ4W', 'admin',
'[email protected]'),
(2, 'Jorge', 'jorge',
'$2a$08$tndTZZ2T.oGuH.GsRTYpeuvLHJgnXQ2
vCYHE843iaugAIQ6UN3YTe', 'user',
'[email protected]');
Modificación al bd.php
• Buscar la función SELECT (cerca a la linea 120).
• Copiar todo el case user y triplicarlo.
• Modificarlo para los casos boss y clerk.
case "clerk":
switch($option['lvl2'])
{
case "all" :
$info=$this->get_data("SELECT * FROM clerk;"); break;
}
break;
Funciones principales
• Son 4 las funciones principales del gestor de base de
datos:
- insert: aquí deben ir todos los casos de inserción de
todas las tablas de la base de datos.
- delete: aquí deben ir todos los casos de borrado de
todas las tablas de la base de datos.
- update: aquí deben ir todos los casos de editado de
todas las tablas de la base de datos.
- select: aquí deben ir todos los casos de selección de
datos de todas las tablas de la base de datos.
Árbol de switches
Cada una de estas 4 funciones cuenta con 2 niveles de switches
- El primer nivel de switch LVL1 debe tener como cases todas las tablas, esto
quiere decir que si por ejemplo tengo 2 tablas: clerk y boss entonces dentro
del contenido del primer switch de la función select deben estar 2 cases, el
case “clerk" y el case "boss“
- El segundo nivel de switch LVL2 es un switch interno de cada case del switch
anterior, esto quiere decir que por ejemplo dentro del contenido dentro del
case “clrek" (del ejemplo anterior), existirá otro switch que a su vez tendrá
unos cases (propios de cada aplicación) que permitirán extraer diferentes
datos de la tabla clerk.
Ejemplo de árbol de switches
Recordar hacer mysql_real_escape_string a las variables
antes de realizar una consulta
Ejemplo de árbol de switches
Este ejemplo nos muestra que la función select del db.php cuenta con 2 cases
del switch de nivel 1 (case “clerk” y “user”) que corresponde a tabla con esos
mismos nombres, y a su vez nos muestra que para la tabla “clerk” el
programador puede necesitar extraer la información de todas los empleados
(case "all") o de un solo empleado de acuerdo a su id (case "one").
De este modo es muy fácil que cualquier programador pueda navegar a través
de estas funciones y encontrar fácilmente la parte donde debe agregar cases
para extraer o editar o agregar datos de cualquier tabla.
Nota: por lo general son estas funciones las que deberá modificar el
programador y agregar a cada una los cases que se considere necesarios.
Capa ORM (Object to Relational
Mapping)
• Esta capa es la que nos permite mapear u organizar los
datos que vienen de la base de datos en forma relacional a
forma objetual, por esta razón se encuentra ubicada en la
mitad de la capa de clases y del gestor de base de datos.
• Esta capa esta representada por el archivo orm.php
ubicado en la ruta glight/modules/orm.php y es la única
que puede acceder a las funciones de la base de datos.
Nota: todo controlador tiene una variable llamada ($this>orm) que representa esta capa.
Variables del archivo orm.php
- var $db: es una variable que representa una instancia de la capa gestor de base de
datos y mediante esta variable se invocan las funciones de dicha capa.
- var $data: es una variable que se usa cuando se recoge información del gestor (se
usan los selects), esta variable contiene toda esa información en forma relacional
- var $objects_to_return: es una variable que contiene la información del gestor pero
en forma objetual, para este proceso de transformación se usa la función get_objetcs()
- var $numpages: es una variable que se usa para guardar la cantidad de páginas de una
consulta por páginas de una tabla.
- var $last_id: es una variable que se usa para guardar el último id que se registro en la
base de datos de una tabla.
Agregar datos en Phpmyadmin
Id: 1
Nombre: Juan
Cargo: Asistente
Id: 2
Nombre: Daniel
Cargo: Administrador
Id: 3
Nombre: Sebastián
Cargo: Jefe de desarrollo
Agregamos 3 jefes desde
phpmyadmin
Extraer
datos de
una tabla
(extraerbd.php)
Extraer datos de una tabla
(extraerbd.tpl)
<table border="0" width="100%" cellpadding="0" cellspacing="10">
<tr><td><b>JEFES DE LA EMPRESA</b></td></tr>
{section loop=$boss name=i}
<tr><td><b>Id:</b> {$boss[i]->get('id')}<br />
<b>Nombre:</b> {$boss[i]->get('name')}<br />
<b>Cargo:</b> {$boss[i]->get('charge')}
</td></tr>
{/section}
</table>
Función Connect y Close
$this->orm->connect(): esta función realiza una
conexión a la base de datos.
$this->orm->close(): esta función finaliza la
conexión a la base de datos
Función read_data
$this->orm->read_data(par1, par2, par3): esta función
realiza todas las consultas de SELECT de la base de
datos y almacena toda la información recogida en
forma relacional por dentro del orm, recibe 3
parámetros:
- par1: este parámetro es un array con los nombres de
las clases que deseamos leer de la base de datos (en el
caso del ejemplo solo deseamos hacer una lectura de
la clase 'boss', pero pueden darse múltiples lecturas ver tutorial siguiente).
Función read_data
- par2: llamado $options, es una matriz o array de 2 dimensiones, por cada
clase enviada en el par1, debe existir un
$options['nombre_de_la_clase']['lvl2'] = 'valor'; donde valor corresponde al
nombre de la opción de lectura del select del switche de nivel 2 del gestor de
base de datos (en el caso de ejemplo como solo hay una lectura de una clase
entonces options será igual a $options['boss']['lvl2']="all"; lo que indica que
se desea hacer una lectura de la clase boss del caso 'all' donde 'all' representa
extraer todos los datos de la tabla 'boss‘
- par3 (opcional): llamado $cod, también es un array de 2 dimensiones, este
parámetro recoge códigos o información adicional que ayuda con SELECTs que
dependen de códigos adicionales, por ejemplo: cuando se desea hacer un
SELECT de una persona por su id, aquí se enviaría un parámetro cod con el
dato de ese id (en este ejemplo no se envía este parámetro debido a que no
necesitamos seleccionar jefes específicos por códigos si no que los
seleccionamos todos).
Función get_objects
• $this->orm->get_objetcs(par1, par2, par3): esta
función se encarga de transformar los datos
relacionales recogidos por 'read_data' y
convertirlos en objetos, al final retorna un objeto
con toda la información recogida.
• - par1: recibe el nombre de la clase (una sola)
que se quiere transformar a forma objetual (en el
caso del ejemplo solo trabajamos con la clase
'boss' y esa es la que deseamos transformar).
Función get_objects
- par2 (opcional): llamado $components, es un array de 2 dimensiones que
contiene información para "armar" objetos mas complejos, por ejemplo
objetos donde existan relaciones o pegar objetos de un tipo a objetos de
otro tipo (mas adelante encontraremos un ejemplo donde armaremos jefes
y a estos jefes les pegaremos las personas que tienen asignadas).
- par3 (opcional): llamado $auxiliars, es un array, que contiene el nombre de
variables auxiliares adicionales que se desean extraer de la base de datos,
por ejemplo: algunas veces deseamos extraer todos los datos de un
empleado, pero adicionalmente deseamos extraer solo el nombre del jefe y
debido a que el nombre del jefe no es un atributo propio de la clase clerk,
entonces se debe usar esta variable auxiliars (mas adelante mostraremos su
funcionamiento y un ejemplo).
Agregar datos desde phpmyadmin
Id: 101
Nombre: Roger Alvarez
Salario: 20000
Jefe: 1
Agregamos 4 personas
desde phpmyadmin
Id: 102
Nombre: Andres Sossa
Salario: 17000
Jefe: 1
Id: 103
Nombre: Cristhian Garzon
Salario: 22000
Jefe: 1
Id: 104
Nombre: Carlos Vivares
Salario: 37000
Jefe: 2
Modificamos db.php
• Agregamos un case al switche de nivel 2 de
boss
case "one":
$id=mysql_real_escape_string($data['id']);
$info=$this->get_data("SELECT * FROM boss WHERE id='$id';"); break;
• Agregamos un case al switche de nivel 2 de
clerk
case "by_boss":
$boss=mysql_real_escape_string($data['boss']);
$info=$this->get_data("SELECT * FROM clerk WHERE boss='$boss';"); break;