Foros del Web » Programando para Internet » PHP »

Buscador ayuda

Estas en el tema de Buscador ayuda en el foro de PHP en Foros del Web. Bueno ahora la tarea es nueva totalmente. Estoy implementando un buscador para mi sitio. Este es el formulario de busqueda: Código HTML: <form action='busqueda.php' method='post' ...
  #1 (permalink)  
Antiguo 12/10/2004, 20:37
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 4 meses
Puntos: 1
Buscador ayuda

Bueno ahora la tarea es nueva totalmente. Estoy implementando un buscador para mi sitio. Este es el formulario de busqueda:
Código HTML:
<form action='busqueda.php' method='post' name='search' id='search'>
<table width='100%'  border='0' cellspacing='1' cellpadding='0' class='table'>
 <tr>
  <td colspan='2' class='padding font topics tr bold'>Buscar en TinoGRM ...  </td>
</tr>
<tr> 
 <td width='20%' class='padding font' align='right'>Palabra o Frase: </td>
 <td width='80%'><input type='text' name='searchkey' id='searchkey' size='100' class='edit font'></td>
</tr>
<tr>
 <td class='padding font' align='right'>Buscar en: </td>
 <td>
  <select name='searchin' id='searchin' class='td font edit'>
   <option value='0' selected>Seleccionar ...</option>
   <option value='1'>Cursos</option>
   <option value='2'>Descargas</option>
   <option value='3'>Noticias</option>  
   <option value='4'>Foros de Discusión</option>
   <option value='5'>Libro de Visitas</option>
   <option value='6'>Directorio Electrónico</option>
   <option value='7'>Directorio de Sitios</option>
  </select>
 </td>
</tr>
<tr>
 <td class='padding font' align='right'>Marcar si desea buscar en el sitio entero: </td>
 <td><input name='allsite' type='checkbox' id='allsite' value='1' onclick=\"javascript:document.search.searchin.disabled = this.checked\"></td>
</tr>
<tr>
 <td class='padding font' align='right'>Resultados por página: </td>
 <td>
  <select name='resultperpage' id='resultperpage' class='edit font td'>
   <option value='5'>5</option>
   <option value='10'>10</option>
   <option value='15'>15</option>
   <option value='20'>20</option>
  </select>
 </td>
</tr>
<tr>
 <td class='padding font' align='center' colspan='2'><input type='submit' name='dosearch' value='Buscar ...' class='edit font'></td>
</tr>
</table>
</form> 
este es el archivo busqueda.php (sin terminar aún)
Código PHP:
<?php
 $arr_tables 
= array("jcgrm_cursos","jcgrm_descargas","jcgrm_noticias","jcgrm_preguntas","jcgrm_libro_de_visitas","jcgrm_directorio_electronico","jcgrm_directorio");
 
$pos $_POST['searchin']-1;
 
$tables $arr_tables[$pos];
 
$query "SELECT * FROM ".$tables." ";
 switch(
$pos){
  case 
0:
   
$query.= "WHERE titulo LIKE '%".$_POST['searchkey']."%'";
  break;
  case 
1:
   
$query.= "WHERE (titulo LIKE '%".$_POST['searchkey']."%') || (descripcion LIKE '%".$_POST['searchkey']."%') || (tamano LIKE '%".$_POST['searchkey']."%') || (direccion LIKE '%".$_POST['searchkey']."%')";
  break;
  case 
2:
   
$query.= "WHERE (titulo LIKE '%".$_POST['searchkey']."%') || (resumen LIKE '%".$_POST['searchkey']."%') || (ampliacion LIKE '%".$_POST['searchkey']."%') || (autor LIKE '%".$_POST['searchkey']."%') || (referencia LIKE '%".$_POST['searchkey']."%') || (fecha_publicacion LIKE '%".$_POST['searchkey']."%')";
  break;
  case 
3:
   
$query.= "WHERE (nick LIKE '%".$_POST['searchkey']."%') || (asunto LIKE '%".$_POST['searchkey']."%') || (mensaje LIKE '%".$_POST['searchkey']."%') || (fecha LIKE '%".$_POST['searchkey']."%')";
  break;
  case 
4:
   
$query.= "WHERE (fecha LIKE '%".$_POST['searchkey']."%') || (nick LIKE '%".$_POST['searchkey']."%') || (pais LIKE '%".$_POST['searchkey']."%') || (comentarios LIKE '%".$_POST['searchkey']."%')";
  break;
  case 
5:
   
$query.= "WHERE (texto LIKE '%".$_POST['searchkey']."%') || ";
  break;
  case 
6:
   
$query.= "WHERE (titulo LIKE '%".$_POST['searchkey']."%') || (descripcion LIKE '%".$_POST['searchkey']."%') || (direccion LIKE '%".$_POST['searchkey']."%')";
  break;
 }
 echo 
$query;
?>
ahora tengo varias dudas que quiero me recomienden algo al respecto o me ayuden. La primera es que si el usuario marca el checkbox para realizar la búsqueda en todas las tablas del arreglo como haría entonces la consulta. La segunda duda es cuando el usuario seleccione Foro de Discusion en la opcion de "buscar en" el sistema debería encargarse de buscar en las tablas tanto de preguntas como de respuestas, pero si se han dado cuenta solo he puesto jcgrm_preguntas porque no se como hacer para poner en el arreglo esas dos tablas y construir la consulta luego. La otra duda que tengo por ahora es como construir los enlaces despues de realizada la busqueda en dependencia de la tabla o tablas donde se halla encontrado la información.
Eso es todo por ahora pero seguiré preguntando un poco por acá hasta tanto no haya terminado mi buscador.

Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 13/10/2004, 00:43
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Basicamente tienes 2 opciones para cuando quieres buscar en varias tablas:

- Hacer una consulta para cada tabla seleccionada.
- Usar UNION (www.mysql.com) si la version de MySQL y la estructura de tus consultas te lo permita.

Y para lo que en una opcion metas mas de una tabla, es sencillo. Ya que tienes el switch, mete toda la creacion de la consulta dentro del switch. Es decir, en el case 3 puedes poner:
Código PHP:
  case 3:
   
$query"SELECT * FROM tabla1, tabla2 WHERE (nick LIKE '%".$_POST['searchkey']."%') || (asunto LIKE '%".$_POST['searchkey']."%') || (mensaje LIKE '%".$_POST['searchkey']."%') || (fecha LIKE '%".$_POST['searchkey']."%')";
  break; 
De esta forma pisas el valor de $query y creas la consulta como necesites.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 13/10/2004, 07:02
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 4 meses
Puntos: 1
Pero ...

Josemi entiendo perfectamente lo que me dices, es lo más lógico a hacer en mi caso. Pero imáginate tu que deba buscar a la vez en todas las tablas? De que tamaño sería mi consulta? Sería eficiente hacerlo de esta forma?

Estuve leyendo en MySQL Hispano sobre el indice FULLTEXT y las posibilidades que este ofrece pero no estoy seguro si el mismo es más eficiente que el LIKE usado comunmente por varios buscadores.

Orientenme un poco al respecto.

Salu2
__________________
Ing. Reynier Pérez Mira
  #4 (permalink)  
Antiguo 13/10/2004, 08:21
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 4 meses
Puntos: 1
Ahora sip mas o menos

Bueno primero pense en hacer uso del LIKE pero luego estuve indagando un poco en Internet y encontré algo sobre el FULLTEXT. Entonces me dedique a implementarlo. Ahora el action del form que puse antes es en el archivo dosearch.php y el código del mismo es este:
Código PHP:
<?php
$coincidencias 
0;
echo 
"<table width='100%' cellpadding='0' cellspacing='1' class='table' border='0'>";
echo 
"<tr>";
echo 
"<td class='padding font tdalterno bold'>Resultados de la búsqueda</td>";
echo 
"</tr>";
echo 
"<tr>";
echo 
"<td class='padding font tdalterno bold'>Se han encontrado un total de ".$coincidencias." coincidencias para la palabra ".$_POST['searchkey']."</td>";
echo 
"</tr>";
echo 
"</table>";
$initlimit 0;
$endlimit $_POST['resultperpage'];
switch(
$_POST['searchin']){
case 
1:
$query "SELECT * FROM jcgrm_cursos WHERE MATCH(titulo) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
$result mysql_query($query) or die(mysql_error());
while(
$row mysql_fetch_array($result)){
echo 
$row['titulo']."<br>";
}
break;
case 
2:
$query "SELECT * FROM jcgrm_descargas WHERE MATCH(titulo,descripcion,direccion) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
$result mysql_query($query) or die(mysql_error());
while(
$row mysql_fetch_array($result)){
echo 
$row['titulo']."<br>";
echo 
$row['descripcion']."<br>";
echo 
$row['direccion']."<br>";
}
break;
case 
3:
$query "SELECT * FROM jcgrm_noticias WHERE MATCH(titulo,resumen,ampliacion,autor,celectronico,referencia) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
$result mysql_query($query) or die(mysql_error());
while(
$row mysql_fetch_array($result)){
echo 
$row['titulo']."<br>";
}
break;
case 
4:
$query "SELECT * FROM jcgrm_preguntas,jcgrm_respuestas WHERE MATCH(nick,asunto,mensaje) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
break;
case 
5:
$query "SELECT * FROM jcgrm_libro_de_visitas WHERE MATCH(nick,celectronico,pais,sitioweb,comentarios) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
break;
case 
6:
$query "SELECT * FROM jcgrm_directorio_electronico WHERE MATCH(texto,celectronico) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
break;
case 
7:
$query "SELECT * FROM jcgrm_directorio WHERE MATCH(titulo,descripcion,direccion) AGAINST('".$_POST['searchkey']."' IN BOOLEAN MODE) LIMIT ".$initlimit.",".$endlimit."";
break;
}
?>
ahora como puedo hacer uso de la variable $coincidencias para devolver cuantas coincidencias se encontraron ?
Salu2
__________________
Ing. Reynier Pérez Mira
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:57.