Foros del Web » Programando para Internet » PHP »

Buscar en Base de Datos

Estas en el tema de Buscar en Base de Datos en el foro de PHP en Foros del Web. Amigos tengo un codigo que busca en directorio y en Base de Datos. En directorio funciona perfectamente, por lo que nunca lo e utilizado para ...
  #1 (permalink)  
Antiguo 30/10/2006, 06:54
Avatar de 8461277  
Fecha de Ingreso: diciembre-2002
Ubicación: san juan de los morros
Mensajes: 887
Antigüedad: 21 años, 11 meses
Puntos: 1
Buscar en Base de Datos

Amigos tengo un codigo que busca en directorio y en Base de Datos.
En directorio funciona perfectamente, por lo que nunca lo e utilizado para buscar dentro de una BD.

Pero un cliente quiere que se le coloque en su pagina para que busque dentro de una BD, por lo que procedi hacer los cambios a que diera lugar.

Y me da este error:
Fatal error: Call to undefined function nohtml() in c:\wamp\www\noticiaaldia\buscador.php on line 202


La linea 2002 es:
Código PHP:
// acortamos la descripcion si sobrepasa de los 60 caracteres
                          
if(strlen(nohtml($reg[$desc])) > 60$desc substr(nohtml($reg[$desc]), 060) . "...";
                          else 
$desc nohtml($reg[$desc]); 
Si yo comento esa linea me arroja esto:
Buscando "pronta" en TODAS


Búsqueda en nacionales
1


Búsqueda en regionales
Sin resultados


Búsqueda en politica
Sin resultados



Hay 1 coincidencia(s)


Alguien me puede explicar porque hace esto
__________________
Miguel Padrón :cool:
  #2 (permalink)  
Antiguo 30/10/2006, 07:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Esa función "nohtml()" no es própia de PHP .. así que tendrás que ver donde la defines en el código que usas .. por qué lo que es en ese script que ahí pusites un par de líneas fuera de contexto .. al parecer no está.

Por otro lado .. .no se trata de ir "probando al tutún" .. es decir .. de quitar una línea "a ver que pasa" .. Si esa línea de código está, será por algo no crees? .. el problema es "que entiendas" para que se usa ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 30/10/2006, 08:21
Avatar de 8461277  
Fecha de Ingreso: diciembre-2002
Ubicación: san juan de los morros
Mensajes: 887
Antigüedad: 21 años, 11 meses
Puntos: 1
Ok entendi ya resolvi eso, cualquier cosa aviso y mil gracias cluster
__________________
Miguel Padrón :cool:
  #4 (permalink)  
Antiguo 30/10/2006, 09:25
Avatar de 8461277  
Fecha de Ingreso: diciembre-2002
Ubicación: san juan de los morros
Mensajes: 887
Antigüedad: 21 años, 11 meses
Puntos: 1
Este es el codigo completo del buscador
Código PHP:
<?
/********************************************************************
buscador.php - Programado por carlos arjona - [email protected]

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 :)
********************************************************************/
$q=$_GET['q'];
$sec=$_GET['sec'];
// nombre de la base de datos
$DBNAME "XXXXX";

// 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("localhost""root""");

// 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 FAlSE;
$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("nacionales","regionales","politica");

// 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("sistemas","agronomia","directorio");

// 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");
__________________
Miguel Padrón :cool:

Última edición por 8461277; 30/10/2006 a las 09:39
  #5 (permalink)  
Antiguo 30/10/2006, 09:26
Avatar de 8461277  
Fecha de Ingreso: diciembre-2002
Ubicación: san juan de los morros
Mensajes: 887
Antigüedad: 21 años, 11 meses
Puntos: 1
Código 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; $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;
  
//echo $tablas;
    // sacamos el numero de campos y los nombres ke tiene esa tabla
    
$result mysql_db_query($DBNAME"SELECT * FROM $tablas[$numElemento] WHERE 1"$link);
    
//echo $result;
    
$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; ">
            &nbsp;<?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]), 060) . "...";
                          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 == 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'>&nbsp;<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($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="ver.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;
}

?>
El deberia buscar la palabra, y las palabras del formuario pero no coloca el titulo o contenido de la BD en que esta la palabra (s), solo sale esto:

Código PHP:
Buscando "nacionales" en TODAS
  

 B
&#250;squeda en nacionales  
 
1  -> aqui deberia aparecer el contenido con la palabra que biene del formulario
 1  
-> aqui deberia aparecer el contenido con la palabra que biene del formulario
 

 B
&#250;squeda en regionales  
Sin resultados 
 

 B
&#250;squeda en politica  
Sin resultados 
 


Hay 2 coincidencia
(s
Sugerencia plisssss
__________________
Miguel Padrón :cool:

Última edición por 8461277; 30/10/2006 a las 09:39
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 21:56.