Foros del Web » Programando para Internet » PHP »

Filtrar consulta varias opciones

Estas en el tema de Filtrar consulta varias opciones en el foro de PHP en Foros del Web. Hola tengo desarrollado un scrip de busqueda el cual se que esta mal realizado a pesar de que funciona, EJEMPLO de Formulario Código HTML: <input ...
  #1 (permalink)  
Antiguo 25/02/2009, 19:09
Avatar de midpunto  
Fecha de Ingreso: enero-2004
Ubicación: España Palma de mallorca
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Pregunta Filtrar consulta varias opciones

Hola tengo desarrollado un scrip de busqueda el cual se que esta mal realizado a pesar de que funciona,
EJEMPLO de Formulario
Código HTML:
<input name="id" id="id" type="text">
<select name="situacion" id="buscapor">
<option value="">...</option>
<option value="1">Venta</option>
<option value="2">Alquiler</option> <option value="3">Traspaso</option>
</select> 
<select name="zona" size="1" class="Estilo5" id="zona">
<option value="value">...</option>
<option value="ALCUDIA">ALCUDIA</option></select>

<select name="nombre_zona" id="nombre_zona" >
<option value="" selected="selected">...</option>
</select>
<select name="tipo" size="1" class="Estilo5" id="tipo">
<option value="value" selected="selected">...</option>
<option value="Piso">Piso</option>
<option value="Atico">Atico</option>
<option value="Apartamento">Apartamento</option>
<option value="Estudio">Estudio</option>
<option value="Chalet unifamiliar">Chalet Unifamiliar</option>
<option value="Chalet Adosado">Chalet Adosado</option>
</select>
<input name="dormitorios" id="dormitorios" size="2" type="text">
<input name="ascensor" id="ascensor" value="Y" type="checkbox">
<input name="garage" id="garage" value="Y" type="checkbox">
<input name="terraza" id="terraza" value="Y" type="checkbox">
<input value="Buscar" type="submit"> 
Y luego repito la consulta mysql segun los campos del formulario que traen algo,
el problema es que las condiciones para armar la consulta son miles y
como se ve no solamente temgo input text, si no que son varias las opciones....

Hay alguna manera de hacer esto de forma mas simple?, agradezco la ayuda.

un saludo.
  #2 (permalink)  
Antiguo 25/02/2009, 19:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Filtrar consulta varias opciones

Mmm que duda tienes? No veo código PHP en el formulario que indicas...
  #3 (permalink)  
Antiguo 25/02/2009, 22:29
 
Fecha de Ingreso: febrero-2009
Ubicación: Cusco - Peru
Mensajes: 142
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Filtrar consulta varias opciones

NO se si capte tu pregunta pero supongo lo que deseas es enviar todos tus campos y hacerlo mas simple en ves de concatenar los mil y un campos que tienes.

Una solucion para esto seria q utilices un poco de ajax, esto para estar filtrando los listbox que tienes y asi tener solo unos cuantos campos ya filtrados para realizar tu consulta a tu BD.

Revisa en la red combobox o listbox dependientes, esto te puede ayudar mucho par hacer tus filtraciones.

salu2
  #4 (permalink)  
Antiguo 26/02/2009, 14:50
Avatar de midpunto  
Fecha de Ingreso: enero-2004
Ubicación: España Palma de mallorca
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Filtrar consulta varias opciones

Cita:
Iniciado por GatorV Ver Mensaje
Mmm que duda tienes? No veo código PHP en el formulario que indicas...
Hola , ante todo gracias por responder, aunque no haya codigo php creo que mi pregunta es muy clara y en el ejemplo puse el formulario y como digo luego este formulario es enviado a donde ejecuto la consulta mysql segun los campos que haya seleccionado, se entiende,...?
aproposito, comentando sobre estas respuestas que se dan en el foro y sin animo de ofender a nadie, son muy comunes (estas respuestas) he visto infinidad de consultas y en muchos casos se lo ponen muy dificil a cualquier usuario que pregunta y estoy hablando de consultas faciles y que se entienden perfectamente, yo noto como que en ciertos temas no se comparte toda la informacion y ya que me gusta mucho este foro lo digo, por que no compartimos mas información en este caso si hablo de un buscador , filtros , formulario y muchos criterios de busqueda y que tengo que generar un monton de consultas dada la complejidad del formulario,.... creo que se entiende de sobra, por otra parte si mis conocimientos fueran mas extensos me ofrecería como moderador para poder responder mejor a algunos usuarios que no tengan experiencia. Un saludo y esto es una critica constructiva no destructiva y sobre todo sin animo de ofender a nadie.
  #5 (permalink)  
Antiguo 26/02/2009, 16:40
Avatar de atoBeto  
Fecha de Ingreso: abril-2008
Ubicación: B.C.S., México
Mensajes: 35
Antigüedad: 16 años
Puntos: 2
Respuesta: Filtrar consulta varias opciones

Hola midpunto, como veo en el código del formulario tienes varios inputs, sin embargo estos consisten en cuadros de texto y elementos select que unicamente capturan un valor, por lo que del lado de PHP solo se recibirá un valor por cada uno de estos inputs, entonces podemos decir que tendremos 10 campos para realizar la consulta:

<input name="id" id="id" type="text">
<select name="situacion" id="buscapor">
<select name="zona" size="1" class="Estilo5" id="zona">
<select name="nombre_zona" id="nombre_zona" >
<select name="tipo" size="1" class="Estilo5" id="tipo">
<input name="dormitorios" id="dormitorios" size="2" type="text">
<input name="ascensor" id="ascensor" value="Y" type="checkbox">
<input name="garage" id="garage" value="Y" type="checkbox">
<input name="terraza" id="terraza" value="Y" type="checkbox">

Si los datos se envian por POST del lado de PHP serán recogidos con la variable predefinida $_POST, ahora bien, una forma que se me ocurre para hacer más rápido el proceso de recoger los datos para armar tu consulta puede ser la siguiente:

1.-Crea un arreglo asociativo que tenga como llaves los campos que se pueden consultar en la tabla de la base de datos, y como valores cada uno de estos datos enviados desde el formulario por post, es decir:

Código PHP:
/*Ojo, desconosco los nombres de los campos de la tabla que usas así que los inventaré*/
$consulta = array(); //Creamos el arreglo
$consulta['Id'] = $_POST['id'];//Llenamos los campos
$consulta['Situacion'] = $_POST['situacion'];
$consulta['Zona'] = $_POST['zona'];
...
$consulta['Terraza'] = $_POST['terraza'
Y así hasta que tengas todos los datos recibidos en este arreglo asociativo llamado $consulta. Entonces podemos acelerar las cosas...

2.-Para elaborar la consulta puedes tomar este arreglo y utilizando un ciclo foreach recorrer cada uno de los campos y agregarlos a una consulta:

Código PHP:
$filtro = array();//Arreglo que funcionará como un filtro para los campos recibidos
foreach($consulta as $campo=>$valor) {
    if(
$valor!="" && $valor!="...") { //Checamos que el campo contenga algún valor válido
         
$filtro []= "$campo='$valor'";//Agregamos  el campo con el valor al arreglo $filtro
   
}
}
$condicion implode(" AND "$filtro); //Juntamos todas las condiciones dentro del arreglo en una sola cadena 
3.- De esta forma formamos una cadena llamada $condicion que contendrá la parte de la condición que llevará tu consulta SQL, separando cada una de las condiciones con la palabra AND para al final obtener una cadena como la siguiente:

Id = '4' AND Situacion = 'Disponible' AND Zona = 'Centro' AND ...


que podrías utilizar dentro de tu consulta SQL.

Saludos.

Última edición por atoBeto; 26/02/2009 a las 16:53
  #6 (permalink)  
Antiguo 26/02/2009, 18:04
Avatar de midpunto  
Fecha de Ingreso: enero-2004
Ubicación: España Palma de mallorca
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Filtrar consulta varias opciones

Hola y muchas gracias por responder, esto funciona bien lo unico que me da este error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY precio ASC LIMIT 0, 10' at line 1

La consulta la genero de la siguiente forma:
Código PHP:
$maxRows_busca 10;
$pageNum_busca 0;
if (isset(
$_GET['pageNum_busca'])) {
  
$pageNum_busca $_GET['pageNum_busca'];
}
$startRow_busca $pageNum_busca $maxRows_busca;

mysql_select_db($database_conect$conect);
$query_busca "SELECT * FROM propiedades WHERE '$condicion' ORDER BY precio ASC";
$query_limit_busca sprintf("%s LIMIT %d, %d"$query_busca$startRow_busca$maxRows_busca);
$busca mysql_query($query_limit_busca$conect) or die(mysql_error());
$row_busca mysql_fetch_assoc($busca);

if (isset(
$_GET['totalRows_busca'])) {
  
$totalRows_busca $_GET['totalRows_busca'];
} else {
  
$all_busca mysql_query($query_busca);
  
$totalRows_busca mysql_num_rows($all_busca);
}
$totalPages_busca ceil($totalRows_busca/$maxRows_busca)-1
No puedo encontrar el por que de este error alguna idea? ya no se mas que provar.
saludos y gracias.
  #7 (permalink)  
Antiguo 26/02/2009, 19:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Filtrar consulta varias opciones

El error te lo da ya que la consulta SQL esta mal, de donde sacas $consulta?, prueba imprimir directamente $query_busca y ve como te genera la consulta, y ejecutala en tu gestor de BDD, una vez que se ejecute correctamente ahí puedes programarla.

Saludos
  #8 (permalink)  
Antiguo 26/02/2009, 19:32
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: Filtrar consulta varias opciones

Justo después de asignarle el valor a $query_limit_busca mostra la cadena que se generó para chequear si hay algún error de sintaxis. Es la única forma que tenés de saber que es lo que realmente se está enviando a mysql.
__________________
Add, never Remove
  #9 (permalink)  
Antiguo 26/02/2009, 19:36
Avatar de midpunto  
Fecha de Ingreso: enero-2004
Ubicación: España Palma de mallorca
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Respuesta: Filtrar consulta varias opciones

hola , la consulta la he provado y eso es lo raro mira, la consulta se crea de la siguiente forma:

Código PHP:
mysql_select_db($database_conect$conect);
$query_busca "SELECT * FROM propiedades WHERE";
if (
$_POST['id']!=""$query_busca.=" id = '".$_POST['id']."' AND ";
if (
$_POST['situacion']!=""$query_busca.=" situacion = '".$_POST['situacion']."'";
echo 
"$query_busca";
$query_limit_busca sprintf("%s LIMIT %d, %d"$query_busca$startRow_busca$maxRows_busca);
$busca mysql_query($query_limit_busca$conect) or die(mysql_error());
$row_busca mysql_fetch_assoc($busca); 
lo cual una vez generado queda asi:
Código PHP:
$query_busca "SELECT * FROM propiedades WHERE id = '".$_POST['id']."' AND  situacion = '".$_POST['situacion']."'"
Esto lo he ejecutado manualmente y lo ejecuta sin problema, ahora cuando la consulta se forma dinamicamente no hay manera de hacerlo.... QUe comida de cabeza por diosss!!! si a alguien se le ocurre algo se lo agradezco.
  #10 (permalink)  
Antiguo 26/02/2009, 20:43
Avatar de bLEx  
Fecha de Ingreso: mayo-2008
Ubicación: Villa Alemana, Chile
Mensajes: 181
Antigüedad: 15 años, 11 meses
Puntos: 5
Respuesta: Filtrar consulta varias opciones

te en cuenta que le estas agregando al final LIMIT.... trata de imprimir $query_limit_busca que es lo que al final ejecutas y ve como te funciona.


Ojo, que max row busca siempre es 10, encambio el otro start_row-busca aumenta siempre... Te puede llegar a dar LIMIT 20, 10 ???

Otra consulta, este codigo lo bajaste de algun lado o lo creaste tu??, seria bueno que por tu salud mental, los ordenes un poco, lo comentes y si bien te acomoda, que el nombre de las variables sea mas significativo...

Última edición por bLEx; 26/02/2009 a las 20:50
  #11 (permalink)  
Antiguo 26/02/2009, 20:54
Avatar de midpunto  
Fecha de Ingreso: enero-2004
Ubicación: España Palma de mallorca
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Filtrar consulta varias opciones

SOLUCIONADO por el momento, aqui dejo el ejemplo por si le sirve a alguien, esta es la única forma que me funciono sin ningún tipo de error:

Código PHP:
mysql_select_db($database_conect$conect);
//limpio valores,.. precios.
$prec_desde=str_replace(".","",$_POST['prec_desde']);
$prec_hasta=str_replace(".","",$_POST['prec_hasta']);

//chequeo las variables POST que llegan
if ($_POST['id']!="") {$filtro1="AND id = '".$_POST['id']."'";}
if (
$_POST['zona']!="") {$filtro2="AND zona = '".$_POST['zona']."'";}
if (
$_POST['nombre_zona']!="") {$filtro3="AND nombre_zona = '".$_POST['nombre_zona']."'";}
if (
$_POST['tipo']!="") {$filtro4="AND tipo = '".$_POST['tipo']."'";}
if (
$_POST['dormitorios']!="") {$filtro5="AND dormitorios = '".$_POST['dormitorios']."'";}
if (
$_POST['ascensor']!="") {$filtro6="AND ascensor = '".$_POST['ascensor']."'";}
if (
$_POST['garage']!="") {$filtro7="AND garage = '".$_POST['garage']."'";}
if (
$_POST['terraza']!="") {$filtro8="AND terraza = '".$_POST['terraza']."'";}
if (
$_POST['prec_desde']!="") {$filtro9="AND precio >= '$prec_desde'";}
if (
$_POST['prec_hasta']!="") {$filtro10="AND precio <='$prec_hasta'";}

//a continuacion genero la consulta dinamicamente segun los valores que lleguen desde el formulario y concatenando las variables
$query_busca "SELECT * FROM propiedades WHERE situacion='".$_POST['situacion']."' $filtro1 $filtro2 $filtro3 $filtro4 $filtro5 $filtro6 $filtro7 $filtro8 $filtro9 $filtro10";
$query_limit_busca sprintf("%s LIMIT %d, %d"$query_busca$startRow_busca$maxRows_busca);
echo 
"$query_busca"// con esto veo la consulta que realmente se esta ejecutando
$busca mysql_query($query_limit_busca$conect) or die(mysql_error());
$row_busca mysql_fetch_assoc($busca); 
Bueno me alegro por dos cosas , la primera es por haber conseguido solucionarlo y la segunda es por poder compartirlo.
Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:26.