Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema con busqueda de varios campos

Estas en el tema de Problema con busqueda de varios campos en el foro de PHP en Foros del Web. Buenas Tardes foreros, tengo un problema con la búsqueda que estoy realizando con diferentes campos, les pego el código a ver que problema le ven. ...
  #1 (permalink)  
Antiguo 12/05/2009, 14:17
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
Busqueda Problema con busqueda de varios campos

Buenas Tardes foreros, tengo un problema con la búsqueda que estoy realizando con diferentes campos, les pego el código a ver que problema le ven.

Código PHP:
$seccion $_POST['seccion'];
$tipo $_POST['tipo'];
$estatus $_POST['estatus'];
$pais $_POST['pais'];
$estado $_POST['estado'];
$ciudad $_POST['ciudad'];
$precio1 $_POST['precio1'];
$precio2 $_POST['precio2'];
    
// Escape User Input to help prevent SQL Injection
$seccion mysql_real_escape_string($seccion);
$tipo mysql_real_escape_string($tipo);
$estatus mysql_real_escape_string($estatus);
$pais mysql_real_escape_string($pais);
$estado mysql_real_escape_string($estado);
$ciudad mysql_real_escape_string($ciudad);
$precio1 mysql_real_escape_string($precio1);
$precio2 mysql_real_escape_string($precio2);
    
//build query
    
if ($seccion!="Seleccione una opcion...")
{
    
$where_seccion "seccion LIKE '".$seccion."'";
}
else
{
    
$where_seccion "seccion LIKE %";
}

if (
$tipo!="Seleccione un Tipo...")
{
    
$where_tipo "tipo LIKE '".$tipo."'";
}
else
{
    
$where_tipo "tipo LIKE %";
}

if (
$estatus!="Seleccione el Status...")
{
    
$where_estatus "estatus LIKE '".$estatus."'";
}
else
{
    
$where_estatus "estatus LIKE %";
}

if (
$pais!="")
{
    
$where_pais " pais LIKE '".$pais."' ";
}
else
{
    
$where_pais " pais LIKE %";
}

if (
$estado!="")
{
    
$where_estado " estado LIKE '".$estado."' ";
}
else
{
    
$where_estado " estado LIKE %";
}
if (
$ciudad!="")
{
    
$where_ciudad " ciudad LIKE ".$ciudad."' ";
}
else
{
    
$where_ciudad " ciudad LIKE %";
}
if (
$nombre!="")
{
    
$where_nombre " MATCH(nombre) AGAINST ('".$nombre."') ";
}
else
{
    
$where_nombre " nombre LIKE %";
}
if (
$precio1!="")
{
    
$precio1 $precio1;
}
else
{
    
$precio1 0;    
}
if (
$precio2!="")
{
    
$precio2 $precio2;
}
else
{
    
$precio2 0;    
}
if (
$precio1!=AND $precio2!=0)
{
$where_precio " costo BETWEEN '".$precio1."' AND '".$precio2."' ";
}
else
{
$where_precio "costo LIKE %";    
}
$where_array = array($where_nombre$where_seccion$where_tipo$where_estatus,  $where_pais$where_estado$where_ciudad$where_precio);
$where implode(" AND "$where_array);


mysql_select_db($database_century21$century21);
$query_inmuebles "SELECT * FROM vivienda WHERE ".$where." ORDER BY id_vivienda ASC";
$query_limit_inmuebles sprintf("%s LIMIT %d, %d"$query_inmuebles$startRow_inmuebles$maxRows_inmuebles);
$inmuebles mysql_query($query_limit_inmuebles$century21) or die(mysql_error());
$row_inmuebles mysql_fetch_assoc($inmuebles); 
Este es el error que me genera:

Código:
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 '% AND seccion LIKE % AND tipo LIKE % AND estatus LIKE % AND pais LIKE % AND es' at line 1
  #2 (permalink)  
Antiguo 12/05/2009, 14:18
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: Problema con busqueda de varios campos

Si te fijas estas poniendo por ejemplo:

WHERE tipo LIKE %, si no vas a buscar ese campo omitelo de tu campo WHERE.

Saludos.
  #3 (permalink)  
Antiguo 12/05/2009, 14:51
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
Respuesta: Problema con busqueda de varios campos

Como lo omito si igual lo debo agregar dentro del arreglo, he alli el problema
  #4 (permalink)  
Antiguo 12/05/2009, 17:25
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: Problema con busqueda de varios campos

No es necesario por ejemplo en este caso:
Código php:
Ver original
  1. if ($seccion!="Seleccione una opcion...")
  2. {
  3.     $where_seccion = "seccion LIKE '".$seccion."'";
  4. }
  5. else
  6. {
  7.     $where_seccion = "seccion LIKE %";
  8. }

Simplemente si no va a buscar no lo agregues a tus consultas, por otro lado te recomiendo uses algo asi es mas limpio:
Código php:
Ver original
  1. $condiciones = array();
  2. if (!empty($campo)) {
  3.        $condiciones[] = "campo LIKE '%$campo%'";
  4. }
  5.  
  6. if (!empty($campo2)) {
  7.        $condiciones[] = "campo LIKE '%$campo2%'";
  8. }
  9.  
  10. if (count($condiciones) > 0) {
  11.       $query .= " WHERE " . implode( " AND ", $condiciones );
  12. }

Saludos.
  #5 (permalink)  
Antiguo 13/05/2009, 07:17
 
Fecha de Ingreso: enero-2009
Mensajes: 38
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con busqueda de varios campos

Hola GatorV,
estoy haciendo una búsqueda y encontré este tema que es justo lo que necesito , sólo que me faltan un par de detalles y me quedan algunas dudas.
La primera es como armaría la sentencia sql final? Una vez que creaste el $query .= " WHERE " . implode( " AND ", $condiciones ); que viene despues?
Y el otro detalle es que quisiera agregar a la búsqueda un rango de fecha de incio y fecha fin con un BETWEEN. Como podría hacerlo?

Espero haber sido claro. Puedo pasar mi código en caso que sea necesario.
Muchas gracias por el momento!
  #6 (permalink)  
Antiguo 13/05/2009, 08:53
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
Cita:
Iniciado por javonaras Ver Mensaje
Y el otro detalle es que quisiera agregar a la búsqueda un rango de fecha de incio y fecha fin con un BETWEEN. Como podría hacerlo?
Si lo deseas pasa tu codigo yo quiero hacer algo parecido con BETWEEN pero para que mi busqueda sea con un rango de precio, si quieres podemos ayudarnos mutuamente.

Y tengo otra duda de como unir varios MATCH AGAINST con este codigo, pero bueno, lo puse ya en el foro de mysql

Última edición por GatorV; 13/05/2009 a las 09:08
  #7 (permalink)  
Antiguo 13/05/2009, 09:11
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: Problema con busqueda de varios campos

Cita:
Iniciado por javonaras Ver Mensaje
Hola GatorV,
estoy haciendo una búsqueda y encontré este tema que es justo lo que necesito , sólo que me faltan un par de detalles y me quedan algunas dudas.
La primera es como armaría la sentencia sql final? Una vez que creaste el $query .= " WHERE " . implode( " AND ", $condiciones ); que viene despues?
Y el otro detalle es que quisiera agregar a la búsqueda un rango de fecha de incio y fecha fin con un BETWEEN. Como podría hacerlo?

Espero haber sido claro. Puedo pasar mi código en caso que sea necesario.
Muchas gracias por el momento!
Pues después que ya tienes la consulta armada, simplemente sería mandarla llamar con mysql_query() e imprimir los resultados.

Puedes agregar un BETWEEN igual como estan las otras condiciones:
Código php:
Ver original
  1. <?php
  2. if (!empty($fecha1) && !empty($fecha2)) {
  3.         $condiciones[] = "fecha BETWEEN '$fecha1' AND '$fecha2'";
  4. }

Saludos.
  #8 (permalink)  
Antiguo 13/05/2009, 10:08
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
Respuesta: Problema con busqueda de varios campos

Ok amigos hice como me comentaron, no me da el error, pero tampoco me muestra los resultados, les pego el codigo para ver si damos con el error

Código PHP:
$seccion $_POST['seccion'];
$tipo $_POST['tipo'];
$estatus $_POST['estatus'];
$nombre $_POST['nombre'];
$pais $_POST['pais'];
$estado $_POST['estado'];
$ciudad $_POST['ciudad'];
$precio1 $_POST['precio1'];
$precio2 $_POST['precio2'];
    
// Escape User Input to help prevent SQL Injection
$seccion mysql_real_escape_string($seccion);
$tipo mysql_real_escape_string($tipo);
$estatus mysql_real_escape_string($estatus);
$nombre mysql_real_escape_string($nombre);
$pais mysql_real_escape_string($pais);
$estado mysql_real_escape_string($estado);
$ciudad mysql_real_escape_string($ciudad);
$precio1 mysql_real_escape_string($precio1);
$precio2 mysql_real_escape_string($precio2);
    
//build query
    
      
$condiciones = array();
      if (
$seccion!="Seleccione una opcion...") {
              
$condiciones[] = " seccion LIKE '%$seccion%'";
      }
      if (
$tipo!="Seleccione un Tipo...") {
              
$condiciones[] = " tipo LIKE '%$tipo%'";
      }
      if (
$tipo!="Seleccione el Status...") {
              
$condiciones[] = " estatus LIKE '%$estatus%'";
      }
      if (!empty(
$nombre)) {
             
$condiciones[] = " MATCH (nombre) AGAINST ('%$nombre%')";
      }
      if (!empty(
$pais)) {
             
$condiciones[] = " MATCH (pais) AGAINST ('%$pais%')";
      }   
      if (!empty(
$estado)) {
             
$condiciones[] = " MATCH (pais) AGAINST ('%$estado%')";
      }
      if (!empty(
$ciudad)) {
             
$condiciones[] = " MATCH (ciudad) AGAINST ('%$ciudad%')";
      }
      if (!empty(
$precio1) && !empty($precio2)) {
             
$condiciones[] = "costo BETWEEN '$precio1' AND '$precio2'";
      }
      if (
count($condiciones) > 0) {
            
$where " WHERE " implode" AND "$condiciones );
        }
      else {
          
$where "";
      }

mysql_select_db($database_century21$century21);
$query_inmuebles "SELECT * FROM vivienda ".$where." ORDER BY id_vivienda ASC";
$query_limit_inmuebles sprintf("%s LIMIT %d, %d"$query_inmuebles$startRow_inmuebles$maxRows_inmuebles);
$inmuebles mysql_query($query_limit_inmuebles$century21) or die(mysql_error());
$row_inmuebles mysql_fetch_assoc($inmuebles); 
  #9 (permalink)  
Antiguo 13/05/2009, 10: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: Problema con busqueda de varios campos

Imprime el query usando echo $query_inmuebles y ejecutala en tu gestor de BDD para ver que resultados te muestra.

Saludos.
  #10 (permalink)  
Antiguo 13/05/2009, 10:37
 
Fecha de Ingreso: enero-2009
Mensajes: 38
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con busqueda de varios campos

Gracias a los dos por su interés!!
Ya hice lo que me decís GatorV, pero no me imprime nada, y al ejecutar la consulta en mi gestor anda perfecto.
Estoy casi seguro que el problema se da por el formato de la fecha.
Estoy tratando de corregir eso, apenas lo soluciones paso mi código asi lo ves warbandit69.

Saludos!
  #11 (permalink)  
Antiguo 13/05/2009, 10:38
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: Problema con busqueda de varios campos

Me referia al código de warbandit69, en tu caso imprime la variable que contiene tu query para que esa la ejecutes en tu gestor de BDD.

Saludos.
  #12 (permalink)  
Antiguo 13/05/2009, 10:55
 
Fecha de Ingreso: enero-2009
Mensajes: 38
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Problema con busqueda de varios campos

Si si, te había entendido!! Lo hice antes de que se lo sugieras a warbandit69. Igual sigo sin darme cuenta

Gracias, saludos!
  #13 (permalink)  
Antiguo 13/05/2009, 11:58
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
Cita:
Iniciado por javonaras Ver Mensaje
Si si, te había entendido!! Lo hice antes de que se lo sugieras a warbandit69. Igual sigo sin darme cuenta

Gracias, saludos!
Pega tu codigo a ver si te podemos ayudar

listo mi motor de busqueda gracias a GatorV (tenia repetida una variable en vez de cambiarla), pego el codigo para la comunidad

Código PHP:
$seccion $_POST['seccion'];
$tipo $_POST['tipo'];
$estatus $_POST['estatus'];
$nombre $_POST['nombre'];
$pais $_POST['pais'];
$estado $_POST['estado'];
$ciudad $_POST['ciudad'];
$precio1 $_POST['precio1'];
$precio2 $_POST['precio2'];
    
// Escape User Input to help prevent SQL Injection
$seccion mysql_real_escape_string($seccion);
$tipo mysql_real_escape_string($tipo);
$estatus mysql_real_escape_string($estatus);
$nombre mysql_real_escape_string($nombre);
$pais mysql_real_escape_string($pais);
$estado mysql_real_escape_string($estado);
$ciudad mysql_real_escape_string($ciudad);
$precio1 mysql_real_escape_string($precio1);
$precio2 mysql_real_escape_string($precio2);
    
//build query
    
      
$condiciones = array();
      if (
$seccion!="Seleccione una opcion...") {
              
$condiciones[] = " seccion LIKE '%$seccion%'";
      }
      if (
$tipo!="Seleccione un Tipo...") {
              
$condiciones[] = " tipo LIKE '%$tipo%'";
      }
      if (
$estatus!="Seleccione el Status...") {
              
$condiciones[] = " estatus LIKE '%$estatus%'";
      }
      if (!empty(
$nombre)) {
             
$condiciones[] = " MATCH (nombre) AGAINST ('%$nombre%')";
      }
      if (!empty(
$pais)) {
             
$condiciones[] = " MATCH (pais) AGAINST ('%$pais%')";
      }   
      if (!empty(
$estado)) {
             
$condiciones[] = " MATCH (pais) AGAINST ('%$estado%')";
      }
      if (!empty(
$ciudad)) {
             
$condiciones[] = " MATCH (ciudad) AGAINST ('%$ciudad%')";
      }
      if (!empty(
$precio1) && !empty($precio2)) {
             
$condiciones[] = "costo BETWEEN '$precio1' AND '$precio2'";
      }
      if (
count($condiciones) > 0) {
            
$where " WHERE " implode" AND "$condiciones );
        }
      else {
          
$where "";
      }

mysql_select_db($database_century21$century21);
$query_inmuebles "SELECT * FROM vivienda ".$where." ORDER BY id_vivienda ASC";
$query_limit_inmuebles sprintf("%s LIMIT %d, %d"$query_inmuebles$startRow_inmuebles$maxRows_inmuebles);
$inmuebles mysql_query($query_limit_inmuebles$century21) or die(mysql_error());
$row_inmuebles mysql_fetch_assoc($inmuebles);

if (
mysql_num_rows($inmuebles)== 0)
    { 
        
header("Location: resultado_nulo.php");
    } 
Me surgio una duda, por que cuando coloco 0 en precio1 y 0 en precio2 igual me da todos los resultados?

y los match tampoco funcionan bien

Última edición por GatorV; 13/05/2009 a las 13:03
  #14 (permalink)  
Antiguo 13/05/2009, 13:03
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: Problema con busqueda de varios campos

Pues comprueba en tu condicion, usa empty() y tambien puedes usar una condicional por ejemplo:
Código php:
Ver original
  1. if (!empty($foo) && ($foo != 0)) {
  2.    // stuff
  3. }

Para los match, comprueba tu consulta SQL.

Saludos.
  #15 (permalink)  
Antiguo 13/05/2009, 13:17
 
Fecha de Ingreso: diciembre-2008
Ubicación: http://www.solucionesrios.tk/
Mensajes: 413
Antigüedad: 15 años, 4 meses
Puntos: 19
es extraño, poque si coloco la palabra completa la encuentra, si le pongo adicional una palabra diferente adicional tambien lo hace, pero si la consulta es de una sola palabra sin una letra no consigue nada, ya lei un poco, y lo de los ceros, los toma php como campos vacios

resolvi cambiando los MATCH AGAINST por LIKE

Última edición por GatorV; 13/05/2009 a las 15:31
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 21:38.