Web de Bienes Raíces o Inmobiliarias - Parte 7, Búsqueda Avanzada PHP MySQLFormulario de Busqueda Avanzada, para consultas con PHP y MySQLTutorial por Jorge Oyhenard (elQuique) de Developers Live En esta entrega, elQuique avanza un poco mas en las búsquedas, modificando el formulario, para realizar una búsqueda avanzada en nuestro reporte de propiedades ingresadas. Ustedes, con esta iniciativa podrán personalizar aun mas su formulario para cada caso. Si bien, ya realizamos en la entrega anterior (Sexta Entrega), una búsqueda, ahora veremos como ampliar este formulario para que nos sea útil como Búsqueda Avanzada, indicando además la Ciudad con una Lista Desplegable.
Lo primero, es ubicarnos en el formulario, antes del botón IR (1), e insertar una Caja de Lista Desplegable, donde aparecerán las Ciudades, ver la imágen:

Los pasos, luego de ubicarnos delante del botón IR, son: Insert (Insertar), Form (Formulario), List/Menu (Lista/Menu), le indicamos un Label (Descripción), a ese campo, le diremos "Ciudad:", y presionamos OK.
A esa lista, la vamos a seleccionar (imagen pto 1), y le vamos a indicar de nombre: selCiudad (imagen pto 2), ya que será esa la identificación que usaremos mas adelante en PHP.

Luego vamos a seleccionar el botón List Values... (Lista de Valores, imagen pto 3), y vamos a definir el valor por defecto, que sera identificado como "Todas" (imagen pto 4) valor -1 (imagen pto 5), y presionamos OK (imagen pto 6). De esta forma definiremos el valor por defecto en la lista, o sea que funciona como si no existiera, si no seleccionamos ciudad, mostrara TODAS.
Desde el punto de vista de diseño, hasta acá llega nuestro trabajo, ahora vamos a modificar un poco, el código, pero antes vamos a ver como quedo hasta ahora el código del formulario de busqueda, así de paso, lo comparan con el de la Sexta Entrega.
...
<form name="form1" method="post" action="busquedapropiedades.php">
<label>Buscar:
<input type="text" name="txtBusqueda" id="txtBusqueda">
Ciudad:
<select name="selCiudad" id="selCiudad">
<option value="-1" selected>Todas</option>
</select>
</label>
<input type="submit" name="cmdBuscar" id="cmdBuscar" value="IR">
</form>
...
Se agrego, la parte en negrita.
Lo primero que debemos automatizar, en nuestro formulario es que se deben mostrar en la lista desplegable, todas las ciudades disponibles en nuestra Tabla de ciudades de la base de datos, para eso vamos a agregar un poco de código PHP, quedando así:
...
<select name="selCiudad" id="selCiudad">
<option value="-1" selected>Todas</option>
<?php
$tablaciudades = mysql_query("SELECT * FROM ciudades ORDER BY nombre ASC"); // Seleccionamos las ciudades de la tabla ciudades
while ($registrociudad = mysql_fetch_array($tablaciudades)) { // Vamos a repetir una Option (opción), de la Lista Desplegable, por cada ciudad en la tabla
?>
<option value="<?php echo $registrociudad['id']; ?>"><?php echo $registrociudad['nombre']; ?></option>
<?php
} // termina la zona de repeticion
mysql_free_result($tablaciudades); // se libera la memoria usada por la tabla
?>
</select>
...
Se agrego la parte en negrita, debajo de la línea del option Todas, y hasta antes de </select>.
Las lineas estan explicadas dentro del código, pero básicamente, lo que se hace es, seleccionar las ciudades de la tabla, realizar un bucle while que repita 1 renglón de la lista de ciudades, por cada ciudad en la tabla, y listo.
El resultado, cuando lo veamos en ejecución, sera similar a la imagen, donde se ven todas la ciudades ingresadas.

Luego de finalizado el formulario, nos resta modificar, el código PHP, del reporte, para que permita tener en cuenta si seleccionamos o no una ciudad, el código hasta ahora es:
if (isset($_POST['txtBusqueda'])) {
$tabla = mysql_query("SELECT propiedades.*, ciudades.* FROM propiedades, ciudades WHERE propiedades.idciudad = ciudades.id AND propiedades.titulo LIKE '%" . $_POST['txtBusqueda'] . "%' ORDER BY ciudades.nombre ASC");
} else {
$tabla = mysql_query("SELECT propiedades.*, ciudades.* FROM propiedades, ciudades WHERE propiedades.idciudad = ciudades.id ORDER BY ciudades.nombre ASC");
}
En ese código, ya vemos que hay partes similares, por ejemplo desde SELECT .... hasta ... WHERE es todo igual, solo cambia la condición, recordemos que el WHERE es justamente el que hace el filtro, por tanto es momento de optimizar un poco el mismo código para que sea mas sencillo de comprender, lo vamos a dividir en 3 partes:
- Seleccion de campos y WHERE que relaciona ambas tablas
- Condición, de acuerdo a los parametros del formulario (esta es la que cambia mas)
- Orden de los registros
por tanto, al mismo código, y sin agregarle lo nuevo de esta séptima entrega, lo vamos a optimizar, y lo dejaremos así:
$sql = "SELECT propiedades.*, ciudades.* FROM propiedades, ciudades WHERE propiedades.idciudad = ciudades.id "; // esta parte siempre es igual, por tanto la guardamos en una nueva variable.
if (isset($_POST['txtBusqueda'])) { // si se envio desde el formulario
$sql .= " AND propiedades.titulo LIKE '%" . $_POST['txtBusqueda'] . "%' "; // se le agrega esta nueva parte a la condición
}
$sql .= " ORDER BY ciudades.nombre ASC"; // sea o no desde el formulario, se le agrega esta parte del orden
$tabla = mysql_query($sql); // y elegimos la tabla, según la sentencia SELECT que hemos formado y esta guardada en la variable $sql
Ahora, es mas facil, agregar la parte de la ciudad seleccionada. Por tanto el codigo queda asi:
$sql = "SELECT propiedades.*, ciudades.* FROM propiedades, ciudades WHERE propiedades.idciudad = ciudades.id ";
if (isset($_POST['txtBusqueda'])) {
$sql .= " AND propiedades.titulo LIKE '%" . $_POST['txtBusqueda'] . "%' ";
if (intval($_POST['selCiudad']) > 0) { // si seleccionamos una ciudad, el id sera mayor a 0 (si son todas es -1)
$sql .= " AND propiedades.idciudad = '" . intval($_POST['selCiudad']) . "'"; // por tanto debemos agregar un filtro que diga que la ciudad, sea igual al numero elegido en el formulario
} // fin de la condicion
}
$sql .= " ORDER BY ciudades.nombre ASC";
$tabla = mysql_query($sql);
Y listo, hemos finalizado. Les dejo el codigo final para descargar: click aca Puedes realizar consultas o sugerencias sobre este tutorial en nuestro foro de soporte, click aqui |