Foros del Web » Programando para Internet » PHP »

Ayuda en buscador avanzadado!!

Estas en el tema de Ayuda en buscador avanzadado!! en el foro de PHP en Foros del Web. Hola, intento hacer un buscador de 12 campos, Nombre de una pelicula i informacion sobre esta (Autor, actores, guionistas, etz..) El problema lo tengo en ...
  #1 (permalink)  
Antiguo 04/07/2005, 04:33
 
Fecha de Ingreso: junio-2005
Mensajes: 30
Antigüedad: 18 años, 9 meses
Puntos: 0
Ayuda en buscador avanzadado!!

Hola, intento hacer un buscador de 12 campos, Nombre de una pelicula i informacion sobre esta (Autor, actores, guionistas, etz..)

El problema lo tengo en que al buscar una pelicula si no se pone nada en los capos donde puede haver mas de una respuesta como en actores, abtengo mas de una respuesta a mi consulta (tantas como actores haya).

Ya que al poner por ejemplo Kill bill en nombre de pelicula y dejo el campo actores vacio,obtengo que Kill bill corresponde a la id=1000 y al relacionar esta con sus actores me salen 3, por ejemplo id=13, 25, 50 y por ello envez de obtener una sola respuesta obtengo 3.

Como puedo limitar que solo me salga una respuesta?
El buscador esta en: http://www.taconline.net/buscadorcine.php

El cogido de la busqueda es:
SELECT Comun.id_comun, Comun.Nombre as programa, Comun.Fotografia, Comun.Valoracion, Comun.Tipo, Comun.Resumen, Comun.Comentario, Comun_Pelicula.id_comun, r_cine_genero.id_comun, r_cine_genero.id_genero_cine, r_cine_director.id_comun, r_cine_director.id_director, r_cine_interprete.id_interprete, r_cine_interprete.id_comun, r_cine_guionista.id_comun, r_cine_guionista.id_guionista,Guionista.Nombre,Gui onista.id_guionista FROM Comun, Comun_Pelicula, r_cine_genero, r_cine_director, r_cine_interprete,Interprete_Cine, r_cine_guionista, Guionista
WHERE (Comun.Nombre LIKE '%$busqueda%')&&(Comun.Resumen LIKE '%$resumen%')&&(Comun.Comentario LIKE '%$comentario%')&&(Comun.id_comun=Comun_Pelicula.i d_comun)&&(Comun_Pelicula.texto_cineforum LIKE '%$comentario_cineforum%')&&(Comun.id_comun=r_cine _genero.id_comun)&&(r_cine_genero.id_genero_cine LIKE '%$genero%') &&(Comun.id_comun=r_cine_director.id_comun)&&(r_ci ne_director.id_director LIKE '%$director%') &&(Comun.id_comun=r_cine_interprete.id_comun)&&(r_ cine_interprete.id_interprete=Interprete_Cine.id_i nterprete)&&( Interprete_Cine.Nombre LIKE '%$interprete%')&&
(Comun.id_comun=r_cine_guionista.id_comun)&&(r_cin e_guionista.id_guionista=Guionista.id_guionista)&& ( Guionista.Nombre LIKE '%$guionista%')
  #2 (permalink)  
Antiguo 04/07/2005, 09:28
Avatar de PabloP  
Fecha de Ingreso: marzo-2005
Mensajes: 83
Antigüedad: 19 años
Puntos: 0
Tu problema es el su¡iguiente.
Lo que pasa es que si mandas un valor en blanco, como el actor, al usar el like en SQL este interpreta al blanco como parte de un nombre o sea, que en el campo actor no importa que es lo que tenga escrito, siempre LIKE considerará que comienza con blanco.

lo que tienes que hacer es validar las variables en blanco antes de usarlas en el sql, por ejemplo poniendoles como valor un punto (.) a todas las variables en blanco para que el sql en lugar de buscar algo que comienze con blanco, busque algo que comience con (.).

eso es un ejemplo, tambien podrías validar que las variables vacias no las incluyera en la sentencia sql.
  #3 (permalink)  
Antiguo 04/07/2005, 14:16
 
Fecha de Ingreso: junio-2005
Mensajes: 30
Antigüedad: 18 años, 9 meses
Puntos: 0
La idea del . por desgracia no me sirbe ya que entonces no encontraria ninguna correspondencia. Por ejemplo si buscara matrix sin poner directores y valido la variable director con un punto nunca encontrara un director de matrix que empieze por punto.
La de no incluira en la sentencia seria buena idea, como lo podria hacer? sin crear una busqueda por cada posible convinacion de campos vacios y llenos, ya que tengo 12 capos lo que hace unas 144 convinaciones. Que complicado :P
  #4 (permalink)  
Antiguo 04/07/2005, 16:32
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 20 años, 8 meses
Puntos: 0
No es tan complicado crear una consulta "dinámica", simplemente cuando el usuario pulse el botón para buscar compruebas qué campos están cubiertos y en función de ello creas una consulta u otra:

$consulta="SELECT * FROM tabla WHERE";

if ($_POST['campo1']!="") $consulta.=" campo1 LIKE '".$_POST['campo1']."%' and ";

if ($_POST['campo2']!="") $consulta.=" campo2 LIKE '".$_POST['campo2']."%' ";

[...]

//Enviamos la consulta
mysql_query($consulta);

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)
  #5 (permalink)  
Antiguo 04/07/2005, 23:19
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
Basandome en lo que dice DjNelson, puede resultar útil esto:
http://www.forosdelweb.com/f18/hacer-consulta-multiple-267358/

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #6 (permalink)  
Antiguo 05/07/2005, 03:05
 
Fecha de Ingreso: junio-2005
Mensajes: 30
Antigüedad: 18 años, 9 meses
Puntos: 0
Es una forma nueva de programar y no acabo de entender muy bien su fundamento. me podriais dar un ejemplo con algunos de mis datos reales y yo ya seguire con el resto?

por ejemplo:
Cogo informacion de un campo del formulario a traves de:
HTTP_GET_VARS['general']
HTTP_GET_VARS['director'] --->este me lo pueden enviar vacio o no

la sentencia de busqueda actual que tengo es:
Cita:
$query_hoytv = "SELECT Comun.id_comun, Comun.Nombre, r_cine_director.id_comun, r_cine_director.id_director, Director.id_director, Director.Nombre
FROM Comun, r_cine_director, Director
WHERE (Comun.Nombre LIKE '%$busqueda%')&&(Comun.id_comun=r_cine_director.id _comun)&&(r_cine_director.id_director=Director.id_ director)&& (Director.Nombre LIKE '%$director%')";
Entonces por el sistema que me habeis comentado como seria?

Última edición por danieldonet@hot; 05/07/2005 a las 03:52
  #7 (permalink)  
Antiguo 05/07/2005, 03:18
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 8 meses
Puntos: 102
¿pero qué parte de tu consulta depende de tal-cual valor recibido???...

El funcionamiento es de lo más sencillo:
- ¿se recibe parámetro de busqueda?; añadimos esa parte a la query
- ¿elemento vacio?; ignoramos... pasamos a el siguiente.

Verás que es un simple "si" ó "no" y no hace falta más que un if()... pero si no lo captas, igual se te pediria fueras claro... qué te parece si editas, supones recibes los dos parámetros y planteas la query que debe quedar, posteriormente supones un campo viene vacio y muestras la query que debió quedar... podremos ver la diferencia y aplicarlo... verás que es lo mismo que te dijo DjNelson y lo mismo que se planteó en el enlace que dejé...

Por cierto, procura iluminar el código... ve que así hecha a perder la forma de la página.
http://forosdelweb.com/misc.php?do=bbcode#code

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #8 (permalink)  
Antiguo 05/07/2005, 03:58
 
Fecha de Ingreso: junio-2005
Mensajes: 30
Antigüedad: 18 años, 9 meses
Puntos: 0
HTTP_GET_VARS['general']
HTTP_GET_VARS['director'] --->este campo me lo pueden enviar vacio o no

Si esta vacio la busqueda deberia de quedar:
Cita:
$query_hoytv = "SELECT Comun.id_comun, Comun.Nombre
FROM Comun
WHERE (Comun.Nombre LIKE '%$busqueda%')
Si no lo estubiera
Cita:
$query_hoytv = "SELECT Comun.id_comun, Comun.Nombre, r_cine_director.id_comun, r_cine_director.id_director, Director.id_director, Director.Nombre
FROM Comun, r_cine_director, Director
WHERE (Comun.Nombre LIKE '%$busqueda%')&&(Comun.id_comun=r_cine_director.id _comun)&&(r_cine_director.id_director=Director.id_ director) && (Director.Nombre LIKE '%$director%')";
Con el metodo explicado he conseguido variar la parte del where pero no la del from y select, nose es que me estoy haciendo un lio y se que es sencillo pero con el estres y prisas no consigo sacarlo
  #9 (permalink)  
Antiguo 05/07/2005, 08:58
 
Fecha de Ingreso: noviembre-2003
Mensajes: 383
Antigüedad: 20 años, 4 meses
Puntos: 2
Yo también tuve el mismo problema ( o parecido ) y lo solucioné de la siguiente forma.

Esta función te construye la consulta (query) que luego le pasas a la función mysql_query().

Código PHP:
//Función que construye el query.
function genera_query($cadena,$condicion)
{
  
$pos=strpos($cadena,"where");

  if (
$pos === false)
      
$cadena=$cadena." where ";
  if (
$pos !== false)
      
$cadena=$cadena." and ";

  
$cadena=$cadena.$condicion;
  return 
$cadena;
}

//Construir el query dependiendo de las variables recibidas del formulario.
if ($busqueda!="")
   
$mysql_string=genera_query ($mysql_string,"Comun.Nombre LIKE '%$busqueda%'");

if (
$resumen!="")
   
$mysql_string=genera_query ($mysql_string,"Comun.Resumen LIKE '%$resumen%'");

if (
$comentario!="")
   
$mysql_string=genera_query ($mysql_string,"Comun.Comentario LIKE '%$comentario%'");

if (
$comentario_cineforum!="")
   
$mysql_string=genera_query ($mysql_string,"Comun_Pelicula.texto_cineforum LIKE '%$comentario_cineforum%'");

if (
$genero!="")
   
$mysql_string=genera_query ($mysql_string,"r_cine_genero.id_genero_cine LIKE '%$genero%'"); 
Lo unico que hacemos es verificar si cada variable recibida desde el formulario que usas para seleccionar los campos de busqueda esta vacia o no.
En caso de que NO este vacia añadimos la condición de busqueda para esa variable.
La función se encarga de anteponer un AND o el WHERE con lo cual nosotros unicamente nos centramos en pasarle la condición de busqueda que realmente queremos que se realize.

Con una simple modificación puedes pasarle a la función en otra variable el AND, OR etc con lo que consegiras más control sobre la construcción del query.

Para mis necesidades me ha facilitado mucho el trabajo.
Espero que te ayude.
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 19:18.