Buscando "cables" en
Hay 0 coincidencia(s)
el codigo es
Código PHP:
// nombre de la base de datos
$DBNAME = "nombre de bd";
$link = mysql_connect(localhost, us, pass);
// variable que contara las coincidencias
$coincidencias = 0;
// caracteres minimos permitidos para la busqueda
$num_car_minimo = 2;
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="file:///C|/DOCUME%7E1/Sergio/CONFIG%7E1/Temp/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="file:///C|/DOCUME%7E1/Sergio/CONFIG%7E1/Temp/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("contenido");
// 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("public_html");
// 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("cables.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");
/**************************************************************************************************/
// 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; $i< count($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
function dbSearch($numElemento)
{
// es necesario llamar a estas variables externas
global $q;
global $DBNAME, $link;
global $tablas, $paginas, $keys, $descs;
global $coincidencias;
// sacamos el numero de campos y los nombres ke tiene esa tabla
$result = mysql_db_query($DBNAME, "SELECT * FROM $tablas[$numElemento] WHERE 1", $link);
$num_fields = mysql_num_fields($result);
$fields = mysql_fetch_field($result);
?>
<table width="100%" align="center" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#3c82b5" style="color:#FFFFFF; font-weight:bold; ">
<?echo "Búsqueda en $tablas[$numElemento]";?>
</td>
</tr>
<tr>
<td style="border: 1px solid #bbbbbb;" bgcolor="#f0f0f0">
<table width="100%" cellspacing="3" cellpadding="0">
<?
// realizamos la consulta SQL y escribimos los resultados
$select = "SELECT *";
$from = "FROM $tablas[$numElemento]";
$where = "WHERE ";
// construimos la clausula WHERE
for($word = 0; $word < count($q); $word++)
{
$where .= "(";
for($field=0; $field < $num_fields; $field++)
{
$where .= mysql_field_name($result, $field) . " LIKE '%$q[$word]%'";
if($field < $num_fields-1) $where .= " OR ";
}
$where .= ")";
if($word < count($q)-1) $where .= " AND ";
}
// construimos la consulta entera
$query = $select . " " . $from . " " . $where;
$result = mysql_db_query($DBNAME, $query, $link);
if(mysql_num_rows($result) > 0)
{
$coincidencias += mysql_num_rows($result);
// imprimimos resultados
for($row=0; $reg = mysql_fetch_array($result); $row++)
{
// generamos todo el enlace
$desc = sprintf("%d",$descs[$numElemento]);
// acortamos la descripcion si sobrepasa de los 60 caracteres
if(strlen(nohtml($reg[$desc])) > 60) $desc = substr(nohtml($reg[$desc]), 0, 60) . "...";
else $desc = nohtml($reg[$desc]);
// valor y nombre del campo clave (id)
// (ver variable $keys, arriba)
$key = sprintf("%d",$keys[$numElemento]);
$key_name = mysql_field_name($result, $key);
// definimos con que color pintaremos el fondo de la celda
// Este color se alterna
if($row % 2 == 0) $bgcolor = "#f8f8f8";
else $bgcolor = "fefefe";
?>
<tr>
<td bgcolor="<?echo $bgcolor;?>">
<?
// esto es especial para los comentarios, ya ke el link ke se crea
// tiene ke apuntar al comentario indicado por #id
if($tablas[$numElemento] = "comentarios")
$posicion = "#" . $reg[$key];
echo "<img src='imagenes/punto.gif'> <a class='dai' href='$paginas[$numElemento]$key_name=$reg[0]$posicion'>$desc</a>";?>
</td>
</tr>
<?
}
}
else echo "<tr><td bgcolor='#f8f8f8' style='font-size: 10px; font-family: tahoma;'>Sin resultados</td></tr>";
?>
</table>
</td>
</tr>
</table>
<br>
<?
}
// 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($fptr, filesize($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_nohtml, strpos($texto_nohtml,$q[0]), 200) . "...";?></td>
</tr>
<tr>
<td><img src="file:///C|/DOCUME%7E1/Sergio/CONFIG%7E1/Temp/imagenes/punto.gif"> <a class="dai" href="file:///C|/DOCUME%7E1/Sergio/CONFIG%7E1/Temp/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;
}
?>