Foros del Web » Programando para Internet » PHP »

buscador intranet :)

Estas en el tema de buscador intranet :) en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/12/2009, 09:59
 
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
  #2 (permalink)  
Antiguo 03/12/2009, 13:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: buscador intranet :)

El problema es que estas leyendo los archivos (scripts de php) y deberias leer el HTML generado por PHP, tal vez usando la libreria cURL o sockets.

En http://www.tuxradar.com/practicalphp/15/1/1 encontraras un ejemplo de como usar sockets y en http://www.tuxradar.com/practicalphp/15/1/2 (que es la continuacion) un ejemplo de un buscador sencillo, espero te sirva.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 03/12/2009, 19:44
 
Fecha de Ingreso: febrero-2009
Ubicación: cancun!
Mensajes: 898
Antigüedad: 15 años, 9 meses
Puntos: 15
Respuesta: buscador intranet :)

hice una prueba porque la lectura no me explico mucho jeje
a ver si entendi este script lo que haces es guardar en un registro del codigo que esta dentro de mi fichero php cierto?
pero intente buscar una palabra y no me ha dejado dice q no la e ncuentra u.u
mil gracias triby :)
__________________
WHERE IS MY BLUE SUNNY SKY??
pd: todos los karmas son bienvenidos :D
  #4 (permalink)  
Antiguo 03/12/2009, 19:58
Avatar de aarts  
Fecha de Ingreso: mayo-2009
Ubicación: London
Mensajes: 26
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: buscador intranet :)

Oye Harvest, perdona si no me he enterado muy bien, pero ¿no sería quizá más práctico meter la info que sea luego sujeto de búsqueda en una base de datos?

________________
PAZ Y BUEN ROLLO
  #5 (permalink)  
Antiguo 03/12/2009, 20:01
Avatar de chulifo  
Fecha de Ingreso: abril-2009
Ubicación: perdido en codigos del PHP, pero aprendo rapido!
Mensajes: 524
Antigüedad: 15 años, 7 meses
Puntos: 18
Respuesta: buscador intranet :)

Ola bueno perdon mi intromisión, por que no usas una base de datos? te seria un poco mas fácil ;)
__________________
Solo soy un simple fanático que mata el tiempo de la mejor manera.
  #6 (permalink)  
Antiguo 04/12/2009, 01:52
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: buscador intranet :)

Ok, en el codigo de Making a simple search engine:

La primera parte es para crear una tabla MySQL (Motor MyISAM e indice FULLTEXT) con el contenido de las paginas de los sitios definidos en $urls.

Código php:
Ver original
  1. // Debes editar esta variable
  2. $urls = array("http://ubicacion.de.tu.intranet");
  3.  
  4. // Cambia estos datos por los de tu conexion a MySQL
  5. mysql_connect("localhost", "phpuser", "alm65z");
  6. // Y este otro por la base de datos a usar
  7. mysql_select_db("phpdb");

Puesto que el script usa file_get_contents() para visitar las paginas debes verificar que en php.ini este habilitado (o en true) allow_url_fopen, de lo contrario, no se indexara ninguna pagina.

Al finalizar la ejecucion del script puedes consultar el contenido de la tabla simplesearch para saber si todo va bien.

Despues adaptas el codigo de la segunda parte para crear el buscador en tu sitio.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 04/12/2009, 17:31
 
Fecha de Ingreso: febrero-2009
Ubicación: cancun!
Mensajes: 898
Antigüedad: 15 años, 9 meses
Puntos: 15
Respuesta: buscador intranet :)

pues triby he probado el codigo me parece perfecto funciona bien me esta costando ponerlo en mi index pues manejo frames
en cuanto a las otras opiniones ciertamente que me ha servido tmb pero en intranet tengo ya muchos archivitos y claro seria mas facil de cierta manera
pero si el dia de mañana hago 100 aarchivos mas 100 registros mas
:S
mejor que se indexen :P
muchas gracias por sus comentarios
besos
__________________
WHERE IS MY BLUE SUNNY SKY??
pd: todos los karmas son bienvenidos :D
  #8 (permalink)  
Antiguo 04/12/2009, 17:52
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: buscador intranet :)

Bueno, en el html donde pongas el formulario del buscador puedes usar la etiqueta <base target="marco_contenido" /> ... supongo que esa seria una de las complicaciones que se te presentan.

Cita:
Iniciado por harvestmoon
... mejor que se indexen
Asi es, tener todo en una base de datos te ahorra tiempo y recursos del servidor.
__________________
- León, Guanajuato
- GV-Foto
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 14:10.