Regresar a la página www.ComoCrearTuWeb.com
Resultados 1 al 9 de 9

Tema: Conseguir filtro de búsqueda a través de varias consultas.

  1. #1
    Recien Llegado! Habitante
    Fecha de Ingreso
    07 may, 11
    Mensajes
    16
    Poder de Reputación
    13

    Smile Conseguir filtro de búsqueda a través de varias consultas.

    Hola a todos!.

    Busca vuestra ayuda, ya que llevo mucho tiempo dando vueltas a este tema, pero después de mucho buscar y leer, sigo sin ser capaz de aclararme.

    Quiero hacer un buscador para que busque en una base de datos. Hasta ahí fácil.

    El buscador es un formulario que consta de tres campos diferentes en los que se puede introducir información, de manera que actúen cómo filtros.

    El primer campo es un input de texto, el segundo una lista de selección en la que se pueden marcar varias opciones, y el tercero es un check box.
    Con php me conecto a la base de datos, he hecho una consulta SQL para cada campo, y cada una de ellas por separado funciona bien. Buscan lo que quiero, y consigo mostrar los resultados.

    Mi problema es que no sé cómo hacer para que ésas consultas funcionen de manera conjunta.
    Básicamente lo que quiero es que funcione como la barra de filtros de la izquierda de eBay. Es decir si el campo está vacío, que lo ignore, si está lleno que busque, y que haga lo mismo con los otros dos, mostrando al final los resultados de 1, 2 o 3 consultas, dependiendo de la selección realizada por el usuario.

    No sé si me he explicado muy bien. Si no está claro decídmelo e intento hacerlo mejor,¿ok? .

    Aquí os dejo el código php que tengo, aunque sólo está una de las consultas, ya que no se qué hacer con las otras.
    Código:
    <?php
    // leer datos de usuario y contraseña de la base de datos
    include("config.php");
    
    // Conexión con el servidor
    $enlace = mysql_connect($server, $db_user, $db_pass) or die ("No se ha podido realizar la conexión.".mysql_error());
    
    // Selección de Base de Datos
    mysql_select_db($database) or die ("Problemas al seleccionar la base de datos".mysql_error()); 
    
    //Preparar los textos a buscar,que es lo que pone en el formulario,que es quién llama a la consulta.
    $busqueda=$_GET['txt_nombre'];
    
    //Si no se introduce término para buscar, sale un mensajito.
    if (empty($busqueda))
       {
        echo "Debes introducir un ingrediente para buscar.";
        }  
    			
    //Búsqueda.
    $consulta=mysql_query("SELECT inci,inndci,fe,iupac,funcion,comentarios FROM ingredientes WHERE MATCH (inci,inndci,fe) AGAINST ('%$busqueda*'IN BOOLEAN MODE)",$enlace) or die("No se ha podido realizar la consulta".mysql_error());
    												
    //Calcular la cantidad de resultados, si no hay, un mensaje.
    $totalrows=mysql_num_rows($consulta);
    if (empty($totalrows))
     {
      echo "No se han encontrado resultados al buscar <strong>$busqueda</strong>.<br> <br>Comprueba si está bién escrito e inténtalo de nuevo.";
      }
    
    //Mostrar los resultados.
    
    
     while ($reg=mysql_fetch_array($consulta)) 
    
               {
    					   echo "<br>";
                 echo "Denominación Inci:".$reg['inci']."<br>";
                 echo "Denominación Inn (dci):".$reg['inndci']."<br>";
                 echo "Denominación Fe:".$reg['fe']."<br>";
                 echo "Denominación Iupac:".$reg['iupac']."<br>";
                 echo "Función:".$reg['funcion']."<br>";
                 echo "Algo más:".$reg['comentarios']."<br>"; 
                 echo "<br>";
                 echo "<hr>";
                }	
    ?>
    Gracias de antemano, ya que sólo intentar entender ésto lo merece.
    Un saludo!

  2. #2
    Recien Llegado! Habitante
    Fecha de Ingreso
    07 may, 11
    Mensajes
    16
    Poder de Reputación
    13

    Replanteamiento del filtro

    Después de darle muchas vueltas, me he dado cuenta de que no lo estaba planteando bien. Así que lo hago otra vez a ver si alguien puede echarme una mano.
    En realidad solo necesito relacionar dos campos de un formulario, para poder afinar a la consulta en la base de datos, y que los resultados obtenidos de esa consulta sean lo más cercanos a lo que quiere el usuario.
    El formulario tiene un campo de select, y dos checkbox, y recojo sus datos en 2 variables. Luego con if y else, intento escribir lo que quiero que pase.
    La primera parte del código son dos if, “según yo entiendo”, cuando alguno de éstos no se cumpla, debería omitirlos y continuar por el else, ¿no?
    Parece muy fácil en teoría, pero yo no lo consigo. Mi problema con el código es que cuando no se cumple la primera parte, hay un error en la consulta, ya que no continúa con lo que pongo en el else.
    No sé si mi problema es el razonamiento o la manera de escribirlo, así que si a alguien se le ocurre algo sería maravilloso.

    Código PHP:
    //Empezar a crear la consulta:
    $sql"SELECT inci,inndci,fe,iupac,funcion,comentarios,origen FROM ingredientes WHERE  ";

    //Si hay variable $uso agregar a la consulta
    if(!empty ($uso)){
        
    $sql.=" MATCH (funcion) AGAINST ('$uso') ";   
       }

    //Si ademas existe la variable $origen entonces se agrega con "AND"  
      
    if(!empty ($origen)) {   
          
    $sql.=" AND (origen) LIKE ('$origen') ";
         }

    //Cuando $uso no existe, pero $origen si está:Reviso si está y agrego $origen a la búsqueda sql (sin "AND").
    else  { 
          if(!empty (
    $origen)) {    
               
    $sql.=" (origen) LIKE ('$origen') ";  
              }
       }
    $consulta=mysql_query ($sql) or die ("Error al realizar la consulta".mysql_error()); 
    Gracias otra vez.

  3. #3
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    24
    Hola:

    Claro que hay un error... fíjate en lo que ocurre si $uso esta vacío y $origen no; la consulta quedaría así:

    Código:
    SELECT inci,inndci,fe,iupac,funcion,comentarios,origen FROM ingredientes WHERE AND (origen) LIKE ('$origen')
    Lo correcto debería ser esto:

    Código PHP:
    $sql"SELECT inci,inndci,fe,iupac,funcion,comentarios,origen FROM ingredientes WHERE  "

    //Si hay variable $uso agregar a la consulta 
    if( ! empty( $uso ) && ! empty( $origen ) { // Si ninguno esta vacío
      
    $sql .= "MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$origen') ";
    } else if( ! empty( 
    $uso ) && empty( $origen ) ) { // Si $origen esta vacío
      
    $sql .= "MATCH (funcion) AGAINST ('$uso') "// Las búsquedas FULLTEXT solo funcionan con el motor MyISAM, así que cuidado
    } else if( ! empty( $origen ) && empty( $uso ) ) { // Si $uso esta vacío
      
    $sql .= " origen LIKE '%$origen%'"// Los porcentajes son comodines que reemplazan cualquier texto.

    Ojalá te sirva :).

  4. #4
    Recien Llegado! Habitante
    Fecha de Ingreso
    07 may, 11
    Mensajes
    16
    Poder de Reputación
    13
    Hola!
    Ha sido genial llegar y encontrarme la respuesta, además he probado y funciona de maravilla, ahora entiendo que me faltaban posibilidades por escribir, tiene mucho más sentido.
    Mil gracias skaparate!

    Ahora al continuar con las andanzas, he intentado añadir una última posibilidad, que sería: en caso de que los dos estén vacíos, que salga un mensajillo (de momento).
    Para hacerlo, he puesto esa posibilidad la primera, y todo lo demás lo he puesto dentro de las llaves de un else.
    También he condicionado la variable que realiza la consulta para que solo la realice en caso de que se hayan recibido datos, porque si no, mostraba error al estar la consulta vacía.
    Dejaré aquí las mejoras por si a alguien le vienen bien.
    (No se ve el cierre de la última llave que se abre porque va detrás de donde muestro los resultados)

    Código PHP:
    //Si no se selecciona nada que buscar, sale un mensaje.

    if (empty ($uso) && empty ($origen)){
    echo 
    " Debes seleccionar algo para buscar. Inténtalo de nuevo. ";
    }  
    else
        {
    //Empezar a crear la consulta:
    $sql" SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE ";

    //Si están las variables $uso y $origen, añadir a la consulta.
     
    if (!empty($uso) && !empty($origen)){
             
    $sql.=" MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$origen') ";   
         }

    //Si origen está vacío:
      
    else if (!empty($uso) && empty($origen)){
         
    $sql.=" MATCH (funcion) AGAINST ('$uso') "
        }
      
    //Cuando $uso no existe, pero $origen si está agrego $origen a la consulta (sin "AND").
      
    else if (!empty($origen) && empty($uso)){
         
    $sql.=" (origen) LIKE ('$origen')";   
        }
    }
    //Hacer la consulta.
    if (!empty ($uso) or !empty ($origen)){ 
    $consulta=mysql_query ($sql) or die ("Error al realizar la consulta.--FALLOS-ETERNOS-- ".mysql_error()); 
    Última edición por drusk; 21/11/2012 a las 02:17

  5. #5
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    24
    El código optimizado debería estar así:

    Código PHP:
    if( ! empty( $uso ) || ! empty( $origen ) {

      
    $sql" SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE ";
      
      if( ! empty( 
    $uso ) && ! empty( $origen ) { // Si ninguno esta vacío 
        
    $sql .= "MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$origen') "
      } else if( ! empty( 
    $uso ) && empty( $origen ) ) {
        
    $sql .= "MATCH (funcion) AGAINST ('$uso') ";
      } else if( ! empty( 
    $origen ) && empty( $uso ) ) {
        
    $sql .= " origen LIKE '%$origen%'";
      }

      
    $consulta mysql_query$sql );
      
    $error mysql_error$con ); // $con es la conexión -> $con = mysql_connect( dominio, usuario, contraseña );

      
    if( empty( $error ) {
        if( 
    mysql_num_rows$consulta ) > ) { // Si es mayor a 0 se recuperaron al menos una fila (consulta exitosa)
          
    echo 'Consulta exitosa';
        } else {
          echo 
    'No hay resultados';
        }
      } else {
        echo 
    $error;
      }
    } else {
      echo 
    'Por favor seleccione el origen o el uso';
    }

    mysql_close$con ); 
    Así se eliminan if... else redundantes :).

  6. #6
    Recien Llegado! Habitante
    Fecha de Ingreso
    07 may, 11
    Mensajes
    16
    Poder de Reputación
    13
    Tras un ratillo pensando, he entendido el código (como cuesta razonar a veces! je, je).
    Lo he puesto como dices, y en lugar de “echo 'Consulta exitosa';” he puesto la parte del código en la que mostraba los resultados. Ha quedado muy bien!
    Gracias otra vez!
    Pero ahora tengo otro problema que por más que busco y leo no consigo aclarar.
    El origen se elige con dos checkbox, y puede ser ‘A’ o ’B’. Lo que falla es que no se pueden elegir los dos orígenes a la vez.
    Lo que he leído es que la propiedad name de los input debe acabar con [].Quedando así.

    Código HTML:
    <input type="checkbox" name="origen[]" value="A" >A
    <input type="checkbox" name="origen[]" value="A" >B
    Lo que no consigo después es usar de manera adecuada los datos. No sé qué hacer con al array. Por más que pruebo no doy con la manera adecuada. Me pasa como siempre, ni siquiera sé si me lo planteo bien.

    ¿Alguna idea?

  7. #7
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    24
    Lo que pasa es que así se envía un arreglo sin nombres y no podrás saber si se marcó una o la otra. Lo que debes hacer es darles un indice nombrado al name:

    <input type="checkbox" name="boxes[origen]" value="A" >A
    <input type="checkbox" name="boxes[uso]" value="B" >B

    Luego, en PHP, lo usarías así:

    Código PHP:
    if( isset( $_POST['boxes'] ) ) { // Si existe $_POST['boxes'] entonces se eligió al menos una opción; de lo contrario estaría vacío
      
    $origen = isset( $_POST['boxes']['origen'] ) ? $_POST['boxes']['origen'] : ''// Si existe [boxes][origen], entonces se le asigna el valor, de lo contrario queda vacío.
      
    $uso = isset( $_POST['boxes']['origen'] ) ? $_POST['boxes']['origen'] : '';

      
    $sql" SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE ";
      
      if( ! empty( 
    $uso ) && ! empty( $origen ) { // Si ninguno esta vacío 
        
    $sql .= "MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$origen') "
      } else if( ! empty( 
    $uso ) && empty( $origen ) ) {
        
    $sql .= "MATCH (funcion) AGAINST ('$uso') ";
      } else if( ! empty( 
    $origen ) && empty( $uso ) ) {
        
    $sql .= " origen LIKE '%$origen%'";
      }

      
    $consulta mysql_query$sql );
      
    $error mysql_error$con ); // $con es la conexión -> $con = mysql_connect( dominio, usuario, contraseña );

      
    if( empty( $error ) {
        if( 
    mysql_num_rows$consulta ) > ) { // Si es mayor a 0 se recuperaron al menos una fila (consulta exitosa)
          
    echo 'Consulta exitosa';
        } else {
          echo 
    'No hay resultados';
        }
      } else {
        echo 
    $error;
      }
    } else {
      echo 
    'Por favor seleccione el origen o el uso';
    }

    mysql_close$con ); 
    Has más pruebas, porque creo que estoy dejando pasar algunas cosas :P. Aquí hay un ejemplo simple:

    Código PHP:
    <?php
      
    if( isset( $_POST['boxes'] ) )
        
    print_r$_POST );
    ?>
    <html>
        <body>
            <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
                <input type="checkbox" name="boxes[check1]" value="A" />A
                <input type="checkbox" name="boxes[check2]" value="B" />B
                <input type="submit" />
            </form>
        </body>
    </html>

  8. #8
    Recien Llegado! Habitante
    Fecha de Ingreso
    07 may, 11
    Mensajes
    16
    Poder de Reputación
    13

    Cool

    Increíble, funciona como quería. Sin tu ayuda no sé cuánto habría tardado en conseguirlo. Gracias por todo!
    Al final lo único que se me ha ocurrido para poder usar los datos como quiero es modificar las consultas de ésta manera:

    Código PHP:
    $uso $_GET['lst_funcion'] ;

    if ( isset( 
    $_GET['origen'] ) ) {            // Si existe $_GET['origen'] entonces se eligió al menos una opción; de lo contrario estaría vacío
       
    $a = isset( $_GET['origen'] ['a'] ) ? $_GET['origen'] ['a'] : '';         // Si existe [origen][a], entonces se le asigna el valor, de lo contrario queda vacío.
       
    $b = isset($_GET['origen'] ['b'] ) ? $_GET['origen'] ['b'] : '';
    }
    //Si hay algun dato.
    if ( !empty ($uso) || !empty ($origen) ) {
        
    $sql" SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE ";   //Empezar a crear la consulta:

    if ( !empty($uso) && !empty($origen) ) {           //Si están las variables $uso y $origen, se añaden a la consulta.
             
    $sql .= " MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$a') UNION  SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE MATCH (funcion) AGAINST ('$uso') AND (origen) LIKE ('$b') " ;   
         }
      else if ( !empty(
    $uso) && empty($origen) ) {     //Si origen está vacío:
         
    $sql .= " MATCH (funcion) AGAINST ('$uso') "
        }
      else if ( !empty(
    $origen) && empty($uso) ) {     //Cuando $uso no existe.
         
    $sql .= " (origen) LIKE ('$a') UNION SELECT inci,inndci,fe,iupac,origen,funcion,comentarios FROM ingredientes WHERE (origen) LIKE ('$b') ORDER BY inci " ;   
        }
        
    $consulta mysql_query ($sql) ;   //Hacer la consulta. 
    $error mysql_error$enlace ) ;  //Si hay error se guarda en una variable. 
    No sé si es la manera más eficiente, pero dados mis pobres conocimientos (se intenta mejorar je, je), es una gran satisfacción el que funcione.
    Así que lo doy por solucionado.
    ¡Mil gracias otra vez!

  9. #9
    Esto empieza a ser un vicio... Habitante
    Fecha de Ingreso
    02 may, 11
    Ubicación
    Santiago, Chile
    Mensajes
    2,079
    Poder de Reputación
    24
    Que bueno. No te preocupes por saber poco, al fin y al cabo todos aprendemos con la experiencia :).

    Saludos.

Temas Similares

  1. Respuestas: 34
    Último Mensaje: 22/03/2009, 06:44
  2. ayuda please,como hacer filtro: Localidad/barrio/servicio/bo
    Por ar1980 en el foro Rentabiliza tu Web
    Respuestas: 1
    Último Mensaje: 20/02/2009, 14:20
  3. Error con una palabra filtro
    Por Espiritu en el foro Foros
    Respuestas: 1
    Último Mensaje: 09/08/2008, 04:06

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •