Ejercicio práctico de PHP – MySql
Para realizar esta práctica, vamos a desarrollar una pequeña aplicación para entornos LAMP que, dándole las tres primeras letras de un producto, devuelva todas las coincidencias de productos que existan en nuestra base de datos , debe devolverlos ordenados por el nombre, incluyendo todas las características y su situación en el mapa.
Tenemos dos tipos de productos, Cruceros (A) y Barcos (B), cada uno con sus características específicas. En el caso del producto A, además de su nombre, necesitamos conocer el número de estrellas y el tipo al que pertenecen (dejamos a tu elección proponer unos cuantos tipos pueden tener, …). En el caso del producto B y además de su nombre, queremos saber de cada producto el numero de pasajeors que pueden viajar y para cuantos adultos tienen espacio, sabiendo que solo existe un tipo de habitaciones.
Para conocer la ubicación de cualquier producto nos basta con indicar la ciudad y provincia.
Nos debe devolver, un listado del siguiente tipo:
.Crucero Mediterraneo, 4 estrellas, habitación doble con vistas, Barcelona, Barcelona
.Barco Vigo, 10 pasajeros, 4 adultos, Vigo, Vigo
.Crucero Italia, 3 estrellas, habitación doble, Mojacar, Almeria
.Crucero islas, 4 estrellas, habitación sencilla, Sanlucar, Cádiz
.Barco Andalucia Sol y playa, 50 pasajeros, 4 adultos, Almeria, Almeria
Esta práctica la realice como test de conocimientos PHP-MySql, seguramente encontréis mil formas de solucionarlo, con clases, utilizando la arquitectura modelo-vista-controlador, etc. En mi caso no me compliqué demasiado y aún así me llevo más de 2 o 3 horas.
La solución contiene el código PHP así como la creación de las tablas MySql que eran necesarias:
La solución
Fichero conexion.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // creamos la función que utilizaremos para conectarnos en la bd. // Si cambia la bd solo tendremos que cambiarlo en un sitio. // El archivo se llamara conexion.php que luego llamaremos desde el script que hará // la consulta en la bd. function Conectarse() { if (!($conectado=mysql_connect("host.com","user","password1"))) { echo "Error de conexion a la base de datos."; exit(); } if (!mysql_select_db("basededatos",$conectado)) { echo "Error al seleccionar la base de datos."; exit(); } return $conectado; } ?> |
Fichero consulta.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | <?php include("conexion.php"); // Llamamos al fichero que tiene la función que nos permite conectarnos a la bd. // Realizamos la conexión $conectado=Conectarse(); // Recogemos el parámetro $consultaCiudad= $_REQUEST["consultaCiudad"]; if($conectado){ $sqlCiudad= "select * from ( select hos.nombre, h.estrellas || 'estrellas', h.tiphab, u.ciudad, u.provincia from crucero h, barco hos, ubicacion u where hos.idUbi = u.id and hos.id = h.idHos and (u.ciudad like '%$consultaCiudad%' or u.provincia like '%$consultaCiudad%') union select hos.nombre, a.disponibles || ' apartamentos', a.capacidad || ' adultos', u.ciudad, u.provincia from apartamento a, barco hos, ubicacion u where hos.idUbi = u.id and hos.id = a.idHos and (u.ciudad like '%$consultaCiudad%' or u.provincia like '%$consultaCiudad%') ) t order by nombre"; $resSqlCiudad = mysql_query($sqlCiudad) or mysql_error(); if (!$resSqlCiudad) { echo "Fallo la consulta: ".$resSqlCiudad; mysql_close($conectado); return 0; } else { echo "<ul>"; // creamos la lista while ($result_rowCiudad = mysql_fetch_row(($resSqlCiudad))) { echo "<li> ".$result_rowCiudad["0"].", ".$result_rowCiudad["1"].",".$result_rowCiudad["2"].",".$result_rowCiudad["3"].",".$result_rowCiudad["4"]." "; // mostramos cada resultado de la lista. } echo "</ul>"; // cerramos la lista } } else { die("Fallo en la conexión al servidor."); } ?> |
Fichero de creación de tablas MySql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | --Tabla ubicacion(id, ciudad, provincia) CREATE TABLE ubicacion (id INT PRIMARY KEY, ciudad VARCHAR(30), provincia VARCHAR(30)); --Tabla hospedaje(id, nombre, idUbi) --idUbi FK ubicacion.id CREATE TABLE hospedaje (id INT PRIMARY KEY, nombre VARCHAR(30), idUbi INT, FOREIGN KEY (idUbi) REFERENCES ubicacion (id)); --Tabla Crucerohotel(idHos, estrellas, tiphab) --idHos FK hospedaje.id CREATE TABLE cruecero (idHos INT, estrellas INT, tiphab VARCHAR(50), FOREIGN KEY (idHos) REFERENCES hospedaje (id)); --Tabla apartamento(idHos, disponibles, capacidad) --idHos FK hospedaje.id CREATE TABLE barco (idHos INT, disponibles INT, capacidad INT, FOREIGN KEY (idHos) REFERENCES hospedaje (id)); SELECT * FROM ( SELECT hos.nombre, h.estrellas || 'estrellas', h.tiphab, u.ciudad, u.provincia FROM crucero h, hospedaje hos, ubicacion u WHERE hos.idUbi = u.id AND hos.id = h.idHos AND (u.ciudad LIKE '%$consultaCiudad%' OR u.provincia LIKE '%$consultaCiudad%') UNION SELECT hos.nombre, a.disponibles || ' apartamentos', a.capacidad || ' adultos', u.ciudad, u.provincia FROM barco a, hospedaje hos, ubicacion u WHERE hos.idUbi = u.id AND hos.id = a.idHos AND (u.ciudad LIKE '%$consultaCiudad%' OR u.provincia LIKE '%$consultaCiudad%') ) t ORDER BY nombre |