Foros del Web » Programando para Internet » PHP »

problema con buscador

Estas en el tema de problema con buscador en el foro de PHP en Foros del Web. Hola amigos, estoy haciendo un buscador para una base de datos y he decidido utilizar 2 funciones diferentes, una es la "like" y la otra ...
  #1 (permalink)  
Antiguo 23/03/2005, 06:15
 
Fecha de Ingreso: agosto-2004
Mensajes: 349
Antigüedad: 20 años, 2 meses
Puntos: 3
problema con buscador

Hola amigos, estoy haciendo un buscador para una base de datos y he decidido utilizar 2 funciones diferentes, una es la "like" y la otra "match".

Tengo los 2 buscadores por separado y funcionan de maravilla, pero ahora tendria que juntarlos y poner un condicionante de que si se escribe 0 o 1 palabras se inicie la funcion like y si hay más de 1 se inicie la función match, encontré un artículo para hacer esto, pero no me funciona de ningun modo.

Aqui dejo el link: http://www.igelectronica.com/desarro...article&sid=45

aqui dejo el código del buscador "like"


<?php require_once('Connections/PORTAL.php'); ?>
<?php
$colname2_Recordset1 = "1";
if (isset($_GET['select'])) {
$colname2_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['select'] : addslashes($_GET['select']);
}
$colname_Recordset1 = "1";
if (isset($_GET['busca'])) {
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['busca'] : addslashes($_GET['busca']);
}
mysql_select_db($database_PORTAL, $PORTAL);
$query_Recordset1 = sprintf("SELECT * FROM empreses WHERE (nomempresa like '%%%s%%' or frase like '%%%s%%' )and idpoble like '%s'", $colname_Recordset1,$colname_Recordset1,$colname2_ Recordset1);
$Recordset1 = mysql_query($query_Recordset1, $PORTAL) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>


aqui dejo el código del buscador "match":

<?php require_once('Connections/PORTAL.php'); ?>
<?php
$colname_Recordset1 = "1";
if (isset($_GET['busca'])) {
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $_GET['busca'] : addslashes($_GET['busca']);
}
mysql_select_db($database_PORTAL, $PORTAL);
$query_Recordset1 = sprintf("SELECT * , MATCH (nomempresa,frase) AGAINST ('%%%s%%') AS puntuacion FROM empreses WHERE MATCH (nomempresa,frase) AGAINST ('%%%s%%') ORDER BY puntuacion DESC LIMIT 50", $colname_Recordset1,$colname_Recordset1);
$Recordset1 = mysql_query($query_Recordset1, $PORTAL) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>

A ver si alguien es capaz de juntar los 2 en un mismo archivo con las condiciones que expongo.

Otra opción sería conseguir que el match me funcionase buscando una palabra o ninguna

Muchas gracias por adelantado
  #2 (permalink)  
Antiguo 23/03/2005, 06:38
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 3 meses
Puntos: 102
... bueno.. primero necesitas contar las palabras.. quizá la función explode() esto de crea un nuevo arreglO.. luego una simple condicional ayudado de count()... quizá cambiando toda la query ó solo el fragmento que cambia... ejemplo gráfico:
Código PHP:
<?php
$_POST
['la_busqueda']="Hola a todos";
$palabrasexplode (" "$_POST['la_busqueda']);
$query="Algo que coincida";
if(
count($palabras)>1) {
$query.=" - Esto varia; trozo para 2 palabras en adelante-";
} else {
$query.=" - Esto varia; trozo para 0 ó 1 palabra - ";
}
$query.= "Y puedes agregar algo más que coincida";
echo 
$query;
?>
Eso de alguna forma armando la query... pero bien puedes insertarla toda dentro del if... Ojalá te sirva! !
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"

Última edición por jam1138; 23/03/2005 a las 06:43
  #3 (permalink)  
Antiguo 23/03/2005, 19:18
 
Fecha de Ingreso: agosto-2004
Mensajes: 349
Antigüedad: 20 años, 2 meses
Puntos: 3
gracias Jam1138

Muchísimas gracias, problema solucionado

Saludos
  #4 (permalink)  
Antiguo 06/05/2005, 13:44
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años, 7 meses
Puntos: 9
Hola Sintesk7 y Jam1138

Pregunta sobre este mismo post...

¿Porqué se debe elegir entre un Match y un Like según el número de palabras? ¿Acaso el Match no funciona bien o sobrecarga de trabajo al servidor cuando es una sola palabra?

Lo pregunto porque hace unos minutos (de hecho leyendo en forosdelweb, gracias a todos) logré hacer con Match Against y tablas fulltext, una consulta que me devuelve productos relacionados con otros por coincidencia y relevancia, pero es posible que esa relación sea de una o ninguna palabra... espero haberme explicado...

Lo que hago y de hecho funciona es esto:

Código PHP:
$relacionar=$rsProductos['related']; //en este campo hay palabras sueltas pero puede estar vacío

$query="SELECT cod_child, cod_parent, h1, 
CONCAT(cod_parent,'_',h1,'.php') AS myUrl, 
MATCH(h1,title,html,related) AGAINST('$relacionar') AS rel
FROM `html`
WHERE MATCH(h1,title,html,related) AGAINST('$relacionar') 
AND cod_st=3 LIMIT 0,5"

Si hay alguna manera de mejorarlo, por ejemplo con eso del Like en vez de Match Against cuando sea una sola palabra, les agradecería que me lo hagan saber.

De antemano, gracias, y perdón por andar de metiche en posts ajenos
  #5 (permalink)  
Antiguo 06/05/2005, 14:51
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Las busquedas "FULL text search" si bien podrían consumir más recursos en algún tipo de busqueda .. es indudable que te presta otras ventajas como el tema de darte los resultados por relevancia y sobre todo que esos campos a buscar quedan indexados.

En tu caso está bien que sigas como estás .. El tema de que "puede haber una palabra, varias o ninguna" lo debes controlar de otra forma ..

Es decir, .. si no contiene nada ese campo de "busqueda" .. no ejecutes tu consulta
Código PHP:
if (!empty($relacionar)){
// ejecutas tu consulta SQL actual ..
} else {
  
// no hay "relacionados" ...

Un saludo,
  #6 (permalink)  
Antiguo 06/05/2005, 15:30
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años, 7 meses
Puntos: 9
Gracias Cluster por tu pronta respuesta :)

Solución sencilla y efectiva como de costumbre

Saludos!!!
  #7 (permalink)  
Antiguo 06/05/2005, 17:08
 
Fecha de Ingreso: agosto-2004
Mensajes: 349
Antigüedad: 20 años, 2 meses
Puntos: 3
Hola a todos,

Yo tenía entendido que las búsquedas match ... against fallaban cuando se buscaba una sola palabra (o ninguna), de hecho si no es con más de una palabra a mi no me funciona de ninguna manera.

¿Habría algún modo de si por ejemplo se pone a buscar "enfermedad" aceptara "enfermero"?

Gracias a todos
  #8 (permalink)  
Antiguo 09/05/2005, 07:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Iniciado por sintesk7
Hola a todos,

Yo tenía entendido que las búsquedas match ... against fallaban cuando se buscaba una sola palabra (o ninguna), de hecho si no es con más de una palabra a mi no me funciona de ninguna manera.

¿Habría algún modo de si por ejemplo se pone a buscar "enfermedad" aceptara "enfermero"?

Gracias a todos
Para el caso de "no buscar ninguna palabra" . .ya puse la solución .. simplemente se trata de no ejecutar consulta alguna si tu campo de busqueda no tiene ningún valor .. así de simple.

Un saludo,
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:10.