Foros del Web » Programando para Internet » PHP »

Acumular consultas.

Estas en el tema de Acumular consultas. en el foro de PHP en Foros del Web. Hola antes que todo muchas gracias, mi problema es el siguiente, tengo la siguiente consulta, dentro de un bucle for porque estoy haciendo un buscador ...
  #1 (permalink)  
Antiguo 17/01/2008, 07:48
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Acumular consultas.

Hola antes que todo muchas gracias, mi problema es el siguiente, tengo la siguiente consulta, dentro de un bucle for porque estoy haciendo un buscador entonces me tiene que dar soporte para buscar, por ej. futbol + argentina y me tiene que dar de resultado www.ole.com.ar, pero el problema me devuelve el de futbol primero y despues el de argentina, lo que pasa que si no guardo la primera consulta la pasa de largo y me termina devolviendo la ultima.
$var4 es lo que el usuario ingresa en un formulario.

Código PHP:
for($i=0;$i<count($var4);$i++){

         
$consulta mysql_query("select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id and krd_keyword like '$var5[$i]'");
        
         } 
  #2 (permalink)  
Antiguo 17/01/2008, 08:47
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Acumular consultas.

Hola:

Lo que tienes que hacer es ir armando la cadena SQL concatenándoles condiciones con "AND". Cuando termine de ejecutarse el bucle, recién ejecutas la consulta.
Código PHP:
// Supongamos que recibes esta variable:
$cadena_ingresada "futbol +argentina";

// Lo primero que haces es crear un array con esas cadenas separadas por +
$palabras explode('+'$cadena_buscada);

// Tenemos este sql base:
$sql "SELECT distinct pna_url 
        FROM pagina,pagina_keyword,keyword 
        WHERE     pagina.pna_id = pagina_keyword.pna_id 
            AND pagina_keyword.krd_id = keyword.krd_id"
;

// Ahora, concatenas con AND                
foreach( $palabras as $palabra ){
        
$sql .= " AND krd_keyword LIKE '$palabra'";
}

// Recién ahora ejecutas la consulta
$consulta mysql_query($sql);
//... 
Saludos
  #3 (permalink)  
Antiguo 17/01/2008, 09:09
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Acumular consultas.

Muchas gracias por responder lo puse como me dijiste, cuando pongo una sola palabra busca bien pero si pongo futbol + argentina por ej me dice que no arrojó resultados. Asi lo puse.

Código PHP:
for($i=0;$i<count($var5);$i++){

         
$sql"select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id";
        
         }
         
         foreach( 
$var5 as $palabra ){
        
$sql .= " AND krd_keyword LIKE '$palabra'";
        }
        
$consulta mysql_query($sql); 
  #4 (permalink)  
Antiguo 17/01/2008, 09:59
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
Re: Acumular consultas.

Tienes que separar las palabras, y agregar el keyword por cada palabra, de tal forma que tu consulta quede así:
Código:
SELECT fields FROM pagina WHERE krd_keyword LIKE '$palabra1' AND krd_keyword LIKE '$palabra2'
Saludos.
  #5 (permalink)  
Antiguo 17/01/2008, 10:12
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Acumular consultas.

Si es buena idea lo que pasa es que no se cuantas palabras va a ingresar el usuario.
  #6 (permalink)  
Antiguo 17/01/2008, 10:14
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 20 años, 9 meses
Puntos: 21
De acuerdo Re: Acumular consultas.

No se que opinen los compañeros que ya han posteado respuestas, no soy experto pero ultimamente me he encontrado esta solucion cuando se trata de busquedas completas, bueno aqui les pongo la liga de la nota

http://blog.unijimpe.net/busquedas-fulltext-en-mysql/

saludos
esperos sus comentarios
__________________
gerardo
  #7 (permalink)  
Antiguo 17/01/2008, 10:33
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
Re: Acumular consultas.

Por eso haz un explode a las palabras separadas por un espacio " " o un signo de "+" y ya recorres el total de palabras y vas agregando.

Saludos.
  #8 (permalink)  
Antiguo 17/01/2008, 10:46
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Acumular consultas.

Si lo he hecho si el codigo que tengo es el siguiente.

Código PHP:
$var1 = ($_GET["name"]);
        
$var2=str_replace("*","%",$var1);
        
$var3=str_replace("+","and",$var2);
        
$var4=str_replace("?","_",$var3);
        
$var5 split(' ',$var4);
        
        
        
//$consulta = mysql_query("select url from pagina where id = (select id_url from palabra where palabra_clave in ("$var1") group by id_url having count(id_url) = count("$var1")");
        //$consulta = mysql_query("SELECT distinct url FROM pagina,palabra WHERE pagina.id=palabra.id_url and palabra_clave like '$var1'");
         
for($i=0;$i<count($var5);$i++){

         
$sql"select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id and krd_keyword like '$var5[$i]'";
        
         }
         
         foreach( 
$var5 as $palabra ){
        
$sql .= " AND krd_keyword LIKE '$palabra'";
        }
        
$consulta mysql_query($sql); 

Pero no me anda, para cuando pongo mas de 1 palabra
  #9 (permalink)  
Antiguo 17/01/2008, 10:52
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Acumular consultas.

Perdón... hay un error.
Código PHP:
$sql .= " AND krd_keyword LIKE '$palabra'"
debe utilizar OR
Código PHP:
$sql .= " OR krd_keyword LIKE '$palabra'"
  #10 (permalink)  
Antiguo 17/01/2008, 10:54
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
Re: Acumular consultas.

Haz un echo a $sql y verifica como te esta generando la cadena.

Saludos.
  #11 (permalink)  
Antiguo 17/01/2008, 10:54
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
Re: Acumular consultas.

Mmmm estas seguro de eso JPinedo? Cuando buscas esperas obtener registros que cumplan las dos condiciones no?

Saludos.
  #12 (permalink)  
Antiguo 17/01/2008, 10:56
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Acumular consultas.

Con and no me tirá nada y con or me muestra todo lo que contiene futbol si pongo futbol + argentina, no busca futbol y argentina.
  #13 (permalink)  
Antiguo 17/01/2008, 10:58
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
Re: Acumular consultas.

Haz lo que te comento de un echo $sql y pega la consulta que te esta generando cuando usas dos palabras.

Saludos.
  #14 (permalink)  
Antiguo 17/01/2008, 11:03
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: Acumular consultas.

Si espero tener registro que cumplan las 2 condiciones. Cuando pongo futbol + argentina produce esto.

select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id and krd_keyword like 'futbol'select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id and krd_keyword like 'and'select distinct pna_url from pagina,pagina_keyword,keyword where pagina.pna_id = pagina_keyword.pna_id and pagina_keyword.krd_id=keyword.krd_id and krd_keyword like 'argentina'
  #15 (permalink)  
Antiguo 17/01/2008, 11:44
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
Re: Acumular consultas.

Mmmm debes de revisar bien tu algoritmo, ya que si te fijas el Query esta incorrecto, primero analiza que tipo de Query necesitas, crealo y ve que funcione con 2 o 3 o 20 palabras y después trata de implementarlo en PHP.

Saludos.
  #16 (permalink)  
Antiguo 17/01/2008, 11:54
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Acumular consultas.

Cita:
Iniciado por GatorV
Mmmm estas seguro de eso JPinedo? Cuando buscas esperas obtener registros que cumplan las dos condiciones no?
Cita:
Iniciado por chacamariano
Con and no me tirá nada y con or me muestra todo lo que contiene futbol si pongo futbol + argentina, no busca futbol y argentina.
eso depende... peeero... ya respondió. Déjalo con AND entonces

Ahora:
1.-) Estás cambiando "+" por "and", lo cual genera una palabra adicional en el split (usa mejor explode()).

2.- El bucle "for" está totalmente de más.

3.-) Trata de utilizar nombres de variables más descriptivos, que me pierdo entre var1, var2, var3, etc ;)

4.-) Te dejo el código nuevamente:
Código PHP:
$cadena_buscada trim($_GET['name']);
$cadena_buscada str_replace('*''%'$cadena_buscada);
$cadena_buscada str_replace("?""_"$cadena_buscada);

// Lo primero que haces es crear un array con esas cadenas separadas por +
$palabras explode('+'$cadena_buscada);

// Tenemos este sql base:
$sql "SELECT distinct pna_url 
        FROM pagina,pagina_keyword,keyword 
        WHERE     pagina.pna_id = pagina_keyword.pna_id 
            AND pagina_keyword.krd_id = keyword.krd_id"
;

foreach( 
$palabras as $palabra ){
    
$palabra trim($palabra);
    
$sql .= " AND krd_keyword LIKE '$palabra'";
}

$consulta mysql_query($sql); 
  #17 (permalink)  
Antiguo 17/01/2008, 13:17
 
Fecha de Ingreso: enero-2008
Mensajes: 53
Antigüedad: 16 años, 3 meses
Puntos: 0
Es que lo que pasa que el buscador funciona, cuando hay un espacio sería or y cuando hay un signo mas sería and, por eso cambio el + por un and.

Tendría que tener una forma de interpretar que cuando pongo un + hago la operación del and pero sin que lo transforme en palabra porque si no buscaria la palabra and en la base de datos.

Última edición por GatorV; 17/01/2008 a las 15:14
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 16:00.