Foros del Web » Programando para Internet » PHP »

Error con like y php

Estas en el tema de Error con like y php en el foro de PHP en Foros del Web. Hola a todos!!, estoy teniendo un problema que no me deja dormir jaja, mediante la función explode() logré que el like pudiera aceptar la consulta ...
  #1 (permalink)  
Antiguo 14/02/2012, 20:46
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Pregunta Error con like y php

Hola a todos!!, estoy teniendo un problema que no me deja dormir jaja, mediante la función explode() logré que el like pudiera aceptar la consulta de más de 1 palabra.

Ahora el problema que tengo es que quiero encontrar el resultado llamado "La historia de google", al buscar "google" este resultado aparece en la primera página, pero cuando busco "historia de google" el resultado ya no aparece en la primera, y en cambio aparecen solo resultados de historia.

El problema es que si busco 2 o más palabras es que divide las palabras para dar distintos resultados, pero si un resultado contiene las dos palabras no lo toma en cuenta como para que este aparezca primero, el código es el siguiente:

Código PHP:
// un poco más arriba aparecen otros explode, pero no creo que eso sea lo importante
$palabras=explode(' ',$frase); 
$condicion=''
foreach (
$palabras as $palabra) { 
  if (
$condicion!=''$condicion.=' OR '
  
$condicion.="(webDescripcion LIKE '%$palabra%')"
}
$sssqlmysql_query("SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords  
from
((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 where  $condicion AND s1.webTitulo like '%$frase%')
union
(select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 where  $condicion1 AND s2.webkeywords like '%$frase%')
union
(select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 where  $condicion2 AND s3.webDescripcion like '%$frase%')) uDR
order by uDR.priority "
$server_link

                              or die(
mysql_error()); 
Probé cambiar el OR por un AND, también crear un elseif ($condicion!='') $condicion.=' OR '; y que el if tuviera un AND, pero no funciono.

No sabía muy bien si esta pregunta iba en php por el explode, o en mysql por la consulta, si va en mysql porfavor díganme asi lo cambio.

Alguien sabe como solucionar esto???. Saludos y gracias a todos!!
  #2 (permalink)  
Antiguo 14/02/2012, 21:12
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error con like y php

Si en tus tablas tienen el motor MyISAM, entonces podrías usar MATCH AGAINST para obtener mejores resultados.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 14/02/2012, 21:19
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Error con like y php

Cita:
Iniciado por Triby Ver Mensaje
Si en tus tablas tienen el motor MyISAM, entonces podrías usar MATCH AGAINST para obtener mejores resultados.
gracias por la respuesta, pero decidi utilizar like por distintas opciones que no tiene el fulltext. Como el de poder buscar palabras de menos de 4 letras.
  #4 (permalink)  
Antiguo 14/02/2012, 23:42
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error con like y php

Con MATCH AGAINST puedes buscar palabras de 3 letras en adelante y al hacer búsquedas con LIKE e incluir cosas como LIKE '%la%' y LIKE '%de%' el juego de resultados no será tan confiable, por lo que al menos deberías eliminar artículos y preposiciones antes de armar la consulta.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 15/02/2012, 01:52
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Error con like y php

Ahh, gracias, no sabía que se podía hacer eso, lo de artículos y preposiciones es fácil, puedo hacerlo con un if y la funcion strlen().

Ahora veo que el problema era mas de mysql que de php...

Disculpa, pero como debería hacerce la consulta con macht against, no se si es por la hora jajaj, pero no me está funcionando, probé de la siguiente manera:

Código PHP:
Ver original
  1. $palabras=explode(' ',$frase);  
  2. $condicion='';  
  3. foreach ($palabras as $palabra) {  
  4.   if ($condicion!='') $condicion.=' OR ';  
  5.   $condicion.="(webDescripcion)";  
  6. }
  7. SELECT distinct uDR.t as webTitulo, uDR.d as webDescripcion, uDR.w as weburl, uDR.k as webkeywords  
  8. from
  9. ((select s1.webTitulo as t, s1.webDescripcion as d, s1.weburl as w, s1.webkeywords as k, 1 as priority from webs s1 MATCH $condicion AND (s1.webTitulo) AGAINST (like '%$frase%'))
  10. union
  11. (select s2.webTitulo as t, s2.webDescripcion as d, s2.weburl as w, s2.webkeywords as k, 2 as priority from webs s2 MATCH $condicion1 AND (s2.webkeywords) AGAINST (like '%$frase%'))
  12. union
  13. (select s3.webTitulo as t, s3.webDescripcion as d, s3.weburl as w, s3.webkeywords as k, 3 as priority from webs s3 MATCH $condicion2 AND (s3.webDescripcion) AGAINST (like '%$frase%'))) uDR
  14. order by uDR.priority
  #6 (permalink)  
Antiguo 15/02/2012, 13:08
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error con like y php

Esto ya necesitas preguntarlo en base de datos.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 15/02/2012, 17:26
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Error con like y php

Ok muchas gracias igualmente por la ayuda. (te deje karma)

Etiquetas: mysql, sql
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 13:34.