Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/12/2009, 09:59
harvestmoon
 
Fecha de Ingreso: febrero-2009
Ubicación: cancun!
Mensajes: 898
Antigüedad: 15 años, 9 meses
Puntos: 15
buscador intranet :)

hola pues vengo a pedirles su apoyo y opinion :)
tengo una pequeña intranet con html php bueno el caso es que ahora me piden un buscador dentro del mismo, es decir que si tngo un archivo llamado
"infoabogados.php" donde tenga texto "bienvenido a esta informacion etc etc etc"
cuando yo le de buscar "informacion" me diga que el infoabogados.php esta la info.
me baje un script de aqui http://www.webtaller.com/tallerscripts/scripts/12/
el smart fetch este buscador no necesita base de datos, lo he probado con un txt y efectivamente me lanza una parte del txt donde se encuentra la palabra buscada; pero con los archivos php no busca ni nada y si se encuentran las palabras y todo simplemente se pasa por alto estos archivos aki esta la parte del codigo donde busca dentro de los archivos :)

Código PHP:
/* Notas:
el buscador pide 2 variables pasadas por GET, y son las siguientes:
$sec -> esta define la seccion en la que buscaremos. Si se desea
        buscar en todas las secciones hay que pasarle $sec = "TODAS"
        
$q      -> esta variable es una cadena que contiene el texto de busqueda

Espero que este codigo te sea de ayuda, y si tienes algun problema no
dudes en contactar conmigo o simplemente en dejar un comentario en mi
pagina. De todos modos debo decirte que el codigo que aquí ves es
exactamente el mismo que utilizo para mi buscador, así que si a ti
te falla en alguna parte es probable que a mi tambien.

Debo hacer un apunte, y es que si el valor de $q es '%' lo que pasara
es que el buscador sacara todos los registros de todas las tablas en las
que tu permitas buscar, asi que te aconsejo que controles esto :)
********************************************************************/

// nombre de la base de datos
//$DBNAME = "byte1024";

// esta variable conecta con la base de datos, y requiere el nombre del host al que se desea
// conectar, el usuario y el password (sustituye las 3 variables por el valor correspondiente)
//$link = mysql_connect($DBHOST, $DBUSER, $DBPASS);

// variable que contara las coincidencias
$coincidencias = 0;
// caracteres minimos permitidos para la busqueda
$num_car_minimo = 2;

// estas variables se usan para enviar un email cuando se ha realizado una búsqueda
// Si $notificar es TRUE enviara el email.
$notificar = TRUE;
//$email_dest = "[email protected]";
//$asunto = "Búsqueda en byte1024";

if(strlen($q) <= $num_car_minimo)
{
 ?>
 <script type="text/javascript">
     alert('El texto de consulta debe superar los <?echo $num_car_minimo;?> carácteres');
    history.back();
 </script>
 <?
}
else
{
// enviamos el email si $notificar es cierto
//if($notificar == TRUE)
 //mail($email_dest,$asunto,$q);
?>

<table width="100%" cellpadding="0" cellspacing="2">
     <tr>
           <td><img src="imagenes/icono_buscar.gif" border="0">
              <td width="90%">
            <p class="titulo" align="center">Buscando "<i><?echo $q?></i>" en <b><?echo strtoupper($sec);?></b></p>
           </td>
           <td><img src="imagenes/icono_buscar.gif" border="0">
     </tr>
     
</table>
<br>
<?
/**************************************************************************************************/
// en este array guardaremos las tablas en las que permitiremos que se realice la busqueda
// por si los hackers... :o
//$tablas =  array("articulos","comentarios","codfuente","noticias");

// este array guarda simplemente las carpetas en las que el buscador puede acceder. Si al comprobar
// todos los elementos no encuentra ninguno igual a $sec, no busca
// esta variable solo la utiliza la funcion fileSearch()
$dirs = array("./busca");

// en esta variable definiremos argumentos especiales que requiera la pagina php encontrada
// por ejemplo en las noticias siempre direccionaremos a noticias.php?sec=2&id=lokesea
// pues bien, tenemos que definir ese $sec de alguna forma
// el id=lokesea lo añade el buscador al generar el enlace
//$paginas = array("articulos.php?sec=1&", "comentarios.php?sec=1&", "codfuente.php?sec=ALL&", "noticias.php?sec=2&");

// esta otra variable definira (con un valor numerico) que campo es el que define la descripcion
// que saldra en el enlace final que genera el buscador
//$descs = array(1,4,2,2);

// esta variable definira cual es el identificativo de toda tabla. Por lo normal siempre sera
// el 0, pero pueden darse casos contrarios
//$keys = array(0,0,0,0);

// aqui guardamos las extensiones de los ficheros que dejaremos que el buscador lea.
// Es recomendable restringir los ficheros .php o los que guarden cosas que no queremos que se vean
// pongo un ejemplo: si alguien busca "mysql_db_query" y aqui permitimos buscar en los ficheros .php
// nos habrán capturado el password
$valid_ext = array("html","txt","htm","php");
/**************************************************************************************************/


// transformamos el texto de busqueda a un array
// para poder tratar las palabras por separado
$q explode(" "$q);

    
// la busqueda se debe realizar en cada item de $tablas
    
if(strtoupper($sec) == "TODAS")
    {
       
// buscamos en una tabla
      //$tabla_query = $tablas;
        //for($i=0; $i < count($tabla_query); $i++)
         //dbSearch($i);
         
          // buscamos en un directorio
          
for($i=0$icount($dirs); $i++)
          
fileSearch($dirs[$i]);
    }
    else
    {
     
// en este caso la consulta ataca a una tabla. Si se pone un valor para $sec
     // que no se encuentre en $tablas, simplemente no encontrara nada (ni buscara)
    /*  for($i=0; $i<count($tablas); $i++)
     {
      if(strtoupper($tablas[$i]) == strtoupper($sec))
       dbSearch($i);
     }     */
     
     // recorremos el array dirs buscando la coincidencia del valor de $sec con el
     // valor de cada item del array
     
for($i=0$i<count($dirs); $i++)
     {
      if(
$dirs[$i] == $sec)
       
fileSearch($dirs[$i]);
     }         
    }
    
?>
<p align="center"><?echo "<b>Hay $coincidencias coincidencia(s)</b>";?></p>
<?
}

// esta funcion busca el texto definido por el array $q sobre la tabla definida por $numElemento,
// que se correspondera a un elemento del array $tablas


// esta funcion busca en un fichero coincidencias con cada elemento
// del array $q (texto de busqueda)
function fileSearch($dir)
{
global 
$q$coincidencias;

   
$dptr opendir($dir);
  
     while(
$file readdir($dptr))
    { 
        if (
$file != "." && $file != "..")
        { 
             
// es un directorio, llamamos recursivamente a la misma funcion para leer
            // el directorio
            
if(is_dir($dir "/" $file))
               
fileSearch($dir "/" $file);
            
// es un fichero
            
else
            {
              
// es un fichero de datos con extension legible
              // (estas extensiones se definen en el array $valid_ext
              
if(grant_ext($file) == TRUE)
              {
                
// leemos el fichero
                 
$fichero $dir "/" $file;
                 
$fptr fopen($fichero"r");
                 
$texto fread($fptrfilesize($fichero));
                 
$texto_nohtml nohtml($texto);
            
                 
// buscamos el texto en el fichero
                 
for($word_found=0$i=0$i count($q); $i++)
                 {
                  if(
is_integer(strpos(strtoupper($texto_nohtml), strtoupper($q[$i]))))
                   
$word_found++;
                 }
             
                 
// hemos encontrado todas las palabras, asi que insertamos el enlace hacia
                 // la pagina solicitada
                 
if($word_found == count($q))
                 {
                  
?>
                  <table width="100%" cellpadding="0" cellspacing="0">
                      <tr>
                        <td bgcolor="#3c82b5" style="color: #ffffff;"><b>Búsqueda en</b>
                        <?echo $dir "/" $file;?>
                        </td>
                    </tr>
                    
                    <tr>
                        <td style="border: 1px solid #dedede;"><?echo substr($texto_nohtmlstrpos($texto_nohtml,$q[0]), 200) . "...";?></td>
                    </tr>
                    
                    <tr>
                        <td><img src="imagenes/punto.gif">&nbsp;<a class="dai" href="incluir.php?loc=<?echo $dir;?>&file=<?echo $file;?>">ver página</a></td>
                    </tr>
                  </table>
                  <?
                  
echo "<br>";
                  
$coincidencias++;
                 }
                 
                 
fclose($fptr);
              }
            }
        }        
    }
    
  
closedir($dptr);
}

// esta funcion controla si el fichero que intentamos leer
// tiene una extension definida en el array $valid_ext (ver arriba)
function grant_ext($fichero)
{
 global 
$valid_ext;
 
 
$file_members explode("."$fichero);
 
     for(
$i=0$i<count($valid_ext); $i++)
    {
     if(
$file_members[1] == $valid_ext[$i])
      return 
TRUE;
    }

return 
FALSE;
}

// esta funcion transforma un texto con tags HTML a texto plano
function nohtml($string)
{
 for(
$conta 0$tag 0$conta strlen($string); $conta++)
 {
   switch(
$string[$conta])
   {
    case 
"<"$tag++; break;
    case 
">"$tag--; break;
    default:
       if(
$tag == 0$copia .= $string[$conta];
    break;
   }

 }
return 
$copia;
}
espero me puedan dar una mano alguna sugerencia una mejor forma de hacerlo o algo que ya este hecho :)de antemano mil mil gracias
besos :)
__________________
WHERE IS MY BLUE SUNNY SKY??
pd: todos los karmas son bienvenidos :D

Última edición por harvestmoon; 03/12/2009 a las 10:01 Razón: falto una etiketa :P