Foros del Web » Programando para Internet » PHP »

Mejor forma para un sistema de busqueda

Estas en el tema de Mejor forma para un sistema de busqueda en el foro de PHP en Foros del Web. cual es la mejor forma para hacer un sistema de busqueda dentro de una pagina? extraer los datos de una tabla a un array y ...
  #1 (permalink)  
Antiguo 11/09/2009, 17:11
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Mejor forma para un sistema de busqueda

cual es la mejor forma para hacer un sistema de busqueda dentro de una pagina? extraer los datos de una tabla a un array y buscar con alguna funcion de php(no se cual) la concoordancia de la busqueda con las palabras dentro del string? o hacer la comparacion de concoordancia con sql? si lo mejor es con sql les agradeceria si me pudieran explicar como se hace ya q de sql no se casi nada.
  #2 (permalink)  
Antiguo 11/09/2009, 17:13
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Mejor forma para un sistema de busqueda

Lo mejor es con sql y te sugiero leer con este manual. Ahora tienes que especificar si es sql o mysql porque algunas funciones que se usen en sql no se podran hacer con mysql y viceversa. Pero la inmesa mayoria de lo que se hace con sql se puede lograr con mysql.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 11/09/2009, 17:18
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

es mysql segun entiendo para eso se usa "LIKE %" oalgo asi, pero no entiendo bien como funciona
  #4 (permalink)  
Antiguo 11/09/2009, 17:18
 
Fecha de Ingreso: diciembre-2007
Mensajes: 131
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: Mejor forma para un sistema de busqueda

Si el sitio no es muy grande / concurrido ,. una busqueda simple utilizando la sentencia LIKE de sql sera suficiente...


Supongamos que tu string de busqueda es
Código PHP:
$busqueda 'mi primer busqueda'
Entonces lo que vas a intentar encontrar son los registros que contengan *mi*, *primer* y *busqueda*.

Aqui es donde entra la sentencia LIKE = '%texto%'

Código PHP:
$palabras explode(" "$busqueda); // dividimos el string en distintas palabras

$likes = array();
for (
$i 0$i count($palabras); $i++) { // hacemos un loop por las palabras y le metemos el LIKE a cada una.
      
$likes[] = "columna_a_buscar LIKE '%".$palabras[$i]."%'";
}

$query "SELECT * FROM tabla WHERE ".implode(", "$likes); 
columna_a_buscar es la columna en la que estaras intentando encontrar las palabras en la base de datos.
  #5 (permalink)  
Antiguo 11/09/2009, 17:28
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

gracias, eso me resuelve el problema a corto plazo, pero por q no funcionaria para un sitio muy grande? el sitio ahora mismo es algo pequeño, pero esta previsto para dentro de un par de meses expanderlo considerablemente con lo q se aumentaria significativamente tanto el trafico de visitantes como el tamaño de las bases de datos
  #6 (permalink)  
Antiguo 11/09/2009, 17:30
 
Fecha de Ingreso: diciembre-2007
Mensajes: 131
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: Mejor forma para un sistema de busqueda

Para un sitio muy grande esto no funcionaria ya que si alguien en la busqueda escribe "como llego a tu casa?" ... una de las palabras a buscar seria *a* , y te saldrian en la busqueda todas los registros de la base de datos (mas o menos).

Esto se puede corregir haciendo una limitante de caracteres en el loop de mi codigo anterior,. digamos... solo agregar al array likes[] las palabras con mas de 6 o 7 caracteres. Estoy seguro que eso si lo podras hacer tu (hint: busca en la funcion strlen() ).


Saludos!
  #7 (permalink)  
Antiguo 11/09/2009, 17:40
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

si, eso ya lo tenia pensado para escapar busquedas de palabras como "a, de, con, etc." pero mi duda es que si para el querry de mysql simpre se usaria LIKE =%''%

otra duda es como funciona el LIKE? busca exatcamente todas las palabras de $likes[] dentro de la columa a buscar?
  #8 (permalink)  
Antiguo 11/09/2009, 17:52
 
Fecha de Ingreso: diciembre-2007
Mensajes: 131
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: Mejor forma para un sistema de busqueda

LIKE funciona de la siguiente manera:


Código PHP:
SELECT FROM tabla WHERE nombres LIKE '%ju%'nombres LIKE %erto%, etc 

En mi codigo lo que hago es generar un array likes[] con varios valores:

Código PHP:
$likes[0] = "columna_a_buscar LIKE '%mi%'";
$likes[1] = "columna_a_buscar LIKE '%primera%'";
$likes[2] = "columna_a_buscar LIKE '%busqueda%'"
Luego lo que hago es usar la funcion implode para unir todos los valores del array $likes usando el 'pegamento' ", " (una coma).

Código PHP:
implode(", "$likes);
// esto da como resultado
// columna_a_buscar LIKE '%mi%', columna_a_buscar LIKE '%primera%', columna_a_buscar LIKE '%busqueda%' 
Si luego ese string donde tengo todos los LIKE bien ordenados, le agrego el 'SELECT * FROM tabla WHERE', tenemos una SQL Query bien planteada que podemos usar para retirar resultados.


Creo que entenderias mejor mi codigo si leyeras sobre las funciones implode() y explode() del sitio php.net
  #9 (permalink)  
Antiguo 11/09/2009, 18:02
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

no, eso que dices ya lo habia entendido, a lo q me refiero es q si busca las palabras exatas dentro de '%text%' dentro de la columna a buscar, o si hace una aproximacion de ese texto, tengo la duda por q segun lo q entiendo de ingles like significa algo asi como "parecido a esto" o "como esto".
  #10 (permalink)  
Antiguo 11/09/2009, 18:07
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Mejor forma para un sistema de busqueda

El like busca exactamente esa palabra y con los % antes y despues busca en todos los string que tengas declarado esa palabra. Lo que sucede es que like se usa para buscar palabras dentro de un string si lo que quieres es buscar algo que desde el principio y al final significa lo que estas buscando en vez de usar like te sugiero usar =
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 11/09/2009, 18:24
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

ok muchas gracias abimaelrc, creo q ya me quedo claro leyendo el manual q pusiste en el comentario anterior.

pero me parece q seria mas facil usar foreach q for

Cita:
foreach($palabras as $palabra){
$likes[] = "columna LIKE '%{$palabra}%'";
}
en lugar de
Cita:
for ($i = 0; $i < count($palabras); $i++) {
$likes[] = "columna_a_buscar LIKE '%".$palabras[$i]."%'";
}
me parecce q el codigo queda mas limpio de esa manera.

Última edición por severicks; 11/09/2009 a las 19:27
  #12 (permalink)  
Antiguo 12/09/2009, 01:06
 
Fecha de Ingreso: septiembre-2009
Mensajes: 306
Antigüedad: 14 años, 7 meses
Puntos: 10
Respuesta: Mejor forma para un sistema de busqueda

hise lo q me recomendaron pero me da un problema de coneccion con la base de datos, esto fue lo escribi

Código PHP:
function buscador($search){
    global 
$coneccion;
    
$palabras =explode(" "$search);
    
$likes = array();
    foreach(
$palabras as $palabra){
        if(
strlen(trim($palabra))>3){
            
$likes[] = " LIKE '%" .mysql_prep($palabra) ."%'"//mysql_prep()es una funcion q hise para q la entrada no tubiera conflicto con mysql
        
}
    }
    
$query ="SELECT * FROM articulos WHERE titulo ";
    
$query .= implode(", "$likes);
    
$query .="OR contenido ";
    
$query .= implode(", "$likes);    
    
$result mysql_query($query$coneccion);
    
confirm_query($result);
    return 
$result;


use el LIKE, explode() e implode() tal como le lo recomendaron pero si la busqueda tiene dos o mas palabras me da este error:

Cita:
Data base query falied!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 ' LIKE '%esto%'OR contenido LIKE '%texto1%', LIKE '%texto2%'' at line 1
*EDITADO:
bueno ya lo corregi solo tenia q cambiar los separadores del implode() por "AND columna ".

Última edición por severicks; 12/09/2009 a las 01:27
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 05:46.