Está en la página 1de 63

https://www.robertsallent.

com
LinkedIn v.23.06

PHP26: Base de datos


Implementación de las clases del modelo
(sin magia… por ahora)
Índice
 Simplificando la conexión
 La clase DB.
 Ejemplo de uso de la clase DB (test de la clase).

 Clases del modelo.


 Creación de una clase del modelo (Libro) y pruebas.
 Métodos para realizar búsquedas y filtros.

2
Simplificando la conexión
 En la anterior presentación vimos cómo conectar con una base de
datos MySQL o MariaDB mediante el conector mysqli y realizar
consultas sobre ella.

 Desde nuestras aplicaciones deberemos conectar múltiples veces


y desde muchos puntos diferentes para hacer peticiones de todo
tipo.

 Resulta obvio que, si no organizamos bien el código, podemos tener


problemas cuando modifiquemos los datos de conexión o al editar
nuestros programas (cosas que dejan de funcionar).

3
Simplificando la conexión
 Lo ideal será separar la configuración y la conexión:

 Indicaremos los parámetros de conexión en un fichero de


configuración.
 Para interactuar con la BDD, usaremos una clase llamada DB que he
desarrollado, y que permite conectar y ejecutar consultas de forma
sencilla.
 La usaremos de ahora en adelante en todos nuestros proyectos (he
creado varias versiones en función de si vamos a trabajar con mysqli o
PDO).

4
La clase DB
 Esta es la clase DB que usa mysqli. Dispone de los métodos
estáticos: get(), query(), select(), selectAll(), insert(), update(),
delete(), total() y escape(). El método selectOne() es alias de
select().

5
La clase DB
 El método estático DB::get():

 Permite recuperar el objeto mysqli (la conexión con la BDD).


 La primera vez que se usa, conecta con la base de datos y retorna el
objeto mysqli creado.
 Las siguientes veces, no conecta sino que devuelve la conexión que
se había establecido anteriormente, garantizando una única instancia
de la conexión (patrón singleton).

 El método estático DB::query() permite realizar consultas de


cualquier tipo, pero para consultas SELECT, INSERT, DELETE y
UPDATE dispondremos de métodos más específicos.

6
La clase DB
 Los métodos estáticos select() (o selectOne()) selectAll(), insert(),
update() y delete() son una forma rápida y fácil de ejecutar
consultas SELECT, INSERT, UPDATE y DELETE.

 Para consultas SELECT con múltiples resultados, el método


DB::selectAll() recuperará un array de objetos del tipo deseado.
 Para SELECT de un solo resultado, los métodos DB::select() y
DB::selectOne() recuperan un objeto del tipo que indiquemos.
 Para consultas INSERT, usaremos el método DB::insert(), que
retorna el ID autonumérico generado en la BDD.
 Para consultas UPDATE o DELETE, usaremos DB::update() o
DB::delete(), que devuelven el número de filas afectadas.

7
La clase DB
 El método estático total() permite realizar consultas SELECT para
cálculos de totales de una forma muy sencilla.

 El método escape() nos permitirá hacer un saneado de los


caracteres especiales en las consultas para evitar (en parte)
ataques de SQLInjections.

 De la validación y saneado de las entradas hablaremos más adelante


en el curso.

8
Ejemplo
Probando la clase DB.
La clase DB
 Bien, ahora que tenemos la clase DB, tenemos que probarla.

 Siempre es muy importante asegurarnos de que las cosas que


hacemos funcionan antes de comenzar a utilizarlas en nuestros
proyectos.
 Yo ya la he probado, pero estas pruebas os servirán a vosotros para
entender cómo funciona. Testearemos cada método y observaremos
los resultados obtenidos.
 A continuación se detalla el fichero de Test que he utilizado y los
resultados de cada prueba.
 Esta clase DB la vamos a usar constantemente de ahora en adelante.

10
La clase DB
 Para el ejemplo:

 Necesitaremos también el autoload, la clase SQLException y la interfaz


DatabaseConnection que tenéis en el Drive.
 Es muy importante respetar la estructura de carpetas del ejemplo.

 Los ficheros autoload, DB, SQLException y DatabaseConnection


se corresponden con la versión 0.8.6 del framework FastLight.

11
Ejemplo estructura de ficheros

Editar

En el Drive

Nuevo

12
Ejemplo el fichero de configuración

Nos ayudará a depurar los errores en nuestras consultas mostrando más


detalles. Cuando publiquemos el sitio, cambiaremos el valor a false.

13
Ejemplo pruebas de select() o selectOne()

14
Ejemplo resultado

15
Ejemplo pruebas de selectAll()

16
Ejemplo resultado

17
Ejemplo prueba de insert()

18
Ejemplo resultado

19
Ejemplo prueba de update()

20
Ejemplo resultado

21
Ejemplo prueba de delete()

22
Ejemplo resultado

23
Ejemplo pruebas de totales

24
Ejemplo resultado

25
Consultas erróneas
 Y finalmente vamos a probar qué pasa cuando se producen errores
en las consultas.

 En esta versión de la clase DB, he tratado de mostrar los errores lo


más detallados posibles (si estamos en modo DEBUG) para que
nos faciliten la depuración de nuestras aplicaciones.

 Observad lo que pasa si realizamos una consulta errónea en el


siguiente ejemplo.

26
Ejemplo consulta con errores

27
Ejemplo resultado (DEBUG true)

DEBUG true

28
Ejemplo resultado (DEBUG false)

DEBUG false

29
La clase DB
 Ventajas que tiene usar la clase DB respecto a no usarla:

 No hay que repetir código, las operaciones para conectar, comprobar


si hubo error, establecer el charset… están en un solo lugar.
 Permite cambiar la configuración fácilmente para toda la aplicación,
simplemente modificándola en el fichero config.php.
 Se garantiza crear una única conexión con la base de datos,
reduciendo el número de recursos usados.
 Simplifica la realización de consultas de selección, inserción,
actualización, borrado y totales.
 Gracias a las herramientas de depuración, podemos comprobar
fácilmente si nuestras consultas contienen errores.

30
El modelo (M de MVC)
Cómo son las clases que conforman el
modelo en la arquitectura MVC
Clases del modelo
 En ejemplos de días anteriores, hemos trabajado con pequeños
scripts que conectaban a la base de datos, recuperaban
información y mostraban el resultado

 Cuando usemos la arquitectura Modelo – Vista - Controlador,


veremos que esto no se implementará así.
 Se debe separar la lógica (controlador) y el acceso a datos (modelo) de
la presentación (vista).
 Las clases que conforman el Modelo (Libro, Socio, Tema…) serán
las responsables de gestionar la información en la base de datos.
Son las entidades que forman parte del dominio de la solución.

32
El modelo Libro
 A modo de ejemplo, vamos a implementar la clase Libro, que
pertenece al modelo.

 Gracias a ella se podrán introducir nuevos libros en la BDD, eliminarlos


y modificar o recuperar sus datos de una forma sencilla.
 Hará uso de la clase DB mostrada en el ejemplo anterior.
 Estas operaciones, se conocen habitualmente con el nombre de
CRUD: create, read, update, delete).

 En las presentaciones sobre MVC veremos cómo se integra el


modelo Libro en el proyecto de la biblioteca.

33
Ejemplo tabla libros en la BDD

34
Ejemplo estructura de los ficheros

Editar

Nuevo

35
Ejemplo el fichero de configuración

36
La clase Libro
 Esta es la sinopsis de la clase Libro del modelo:

Propiedades

Métodos

37
Ejemplo el modelo Libro (1/5 recuperar)

38
Ejemplo el modelo Libro (2/5 guardar)

39
Ejemplo el modelo Libro (3/5 actualizar)

40
Ejemplo el modelo Libro (4/5 borrar)

41
Ejemplo el modelo Libro (5/5 totales y toString())

42
Pruebas del modelo Libro
 Ahora que ya tenemos la clase Libro del modelo, vamos a proceder
a probarla.

 Vamos a ir probando los métodos uno a uno y comprobando que


funcionan correctamente.
 Observad lo fácil que resultará trabajar con libros una vez que
tengamos esta clase del modelo.
 Pensad también en cómo podríamos implementar y trabajar con otras
clases como Socio, Tema, Prestamo…

43
Ejemplo TEST: recuperar todos los libros

44
Ejemplo resultado

45
Ejemplo TEST: recuperar un libro

46
Ejemplo resultado

47
Ejemplo TEST: guardar un libro

48
Ejemplo resultado

49
Ejemplo TEST: actualizar un libro

50
Ejemplo resultado

51
Ejemplo TEST: borrar un libro

52
Ejemplo resultado

53
Ejemplo TEST: cálculo de totales

54
Ejemplo resultado

55
Ejercicio la clase Socio
 Implementa la clase Socio del modelo.

 Debe tener las propiedades adecuadas y los métodos get(), getbyId(),


save(), update(), deleter(), total() y __toString() tal y como lo hemos
hecho en el modelo Libro.
 Tanto al guardar como al actualizar, no se debe indicar ni el id ni la
fecha de alta, puesto que se asignan automáticamente en la BDD y no
se cambiarán nunca.

 Implementa un testSocio.php para probar cada uno de los


métodos de la clase, tal y como se ha hecho en el fichero
testLibro.php.

56
Filtrado de resultados
Recuperar un conjunto de resultados
aplicando un filtro en la consulta
Aplicar un filtro
 Vamos a crear ahora un método que nos permita filtrar por el
campo que queramos, pudiendo además ordenar los datos.

 Nos servirá para los formularios de búsqueda.


 También nos puede servir para listar todos los resultados (en lugar de
Libro::get()) si colocamos bien los valores por defecto de los
parámetros.

 Debo advertir que este método funcionará bien para los campos de
texto, pero no para los numéricos, debido a la consulta SQL con un
LIKE.

58
Ejemplo filtros avanzados

59
Ejemplo método Libro::getFiltered()

60
Ejemplo prueba de Libro::getFiltered()

61
Ejemplo resultado

62
Ejercicio buscando socios
 Incorpora el método getFiltered() a la clase Socio del modelo que
hiciste en el ejercicio anterior.

 Incorpora un par de pruebas adicionales en el fichero testSocio


para comprobar que funciona correctamente.

63

También podría gustarte