Filtrar datos

28
Filtrar datos en php con la función filter_var A la hora de deja que un usuario introduzca datos en nuestra aplicación por medio de algún formulario, debemos de tener muy en cuenta el filtrado de esos datos para evitar que nos puedan meter algún código malicioso que pueda afectar a nuestra aplicación. Si filtramos los datos, podremos evitar tipos de ataques como es el SQL Inyection o el XSS. Podríamos pensar que hacer la validación a nivel del cliente podría ser suficiente, pero hay herramientas que permiten saltarse esa verificación y de esa forma poner en peligro nuestra aplicación. Hoy vamos a ver una forma de verificar los datos por medio de la función filter_var que nos proporciona PHP. La función filter_var nos permite filtrar una variable según el filtro especificado en sus parámetros. Los parámetros que puede recibir esta función son: $var: Variable que se quiere filtrar. $filter: Filtro que deseamos aplicar. Será una constante numérica. $options: Conjunto de opciones que modificarán el funcionamiento del filtro. Será una constante numérica o un array. A continuación indicamos un listado de filtros de validación: FILTER_VALIDATE_BOOLEAN: Valida la variable como un booleano. FILTER_VALIDATE_EMAIL: Valida la variable como una dirección de correo electrónico correcta. FILTER_VALIDATE_FLOAT: Valida que la variable sea del tipo float. FILTER_VALIDATE_INT: Valida la variable como un número entero. FILTER_VALIDATE_IP: Valida la variable como una dirección IP. FILTER_VALIDATE_REGEXP: Valida la variable contra una expresión regular enviada en la variable de opciones. FILTER_VALIDATE_URL: Valida el valor coma una URL de acuerdo con la RFC 2396. A continuación, os mostramos un listado de filtros para sanear: FILTER_SANITIZE_EMAIL: Elimina todos los caracteres execpto letras, números y !#$%&’*+-/=?^_`{|}~@.[]. FILTER_SANITIZE_ENCODED: Codifica la cadena como una URL válida. FILTER_SANITIZE_MAGIC_QUOTES: Aplica la función addslashes. FILTER_SANITIZE_NUMBER_FLOAT: Elimina todos los caracteres excepto números, +- y opcionalmente ,.eE. FILTER_SANITIZE_NUMBER_INT: Elimina todos los caracteres excepto números y los signos + -. FILTER_SANITIZE_SPECIAL_CHARS: Escapa caracteres HTML y caracteres con ASCII menor a 32. FILTER_SANITIZE_STRING: Elimina etiquetas, opcionalmente elimina o codifica caracteres especiales. FILTER_SANITIZE_STRIPPED: Alias del filtro anterior.

Transcript of Filtrar datos

Page 1: Filtrar datos

Filtrar datos en php con la función filter_varA la hora de deja que un usuario introduzca datos en nuestra aplicación por medio de algún formulario, debemos de tener muy en cuenta el filtrado de esos datos para evitar que nos puedan meter algún código malicioso que pueda afectar a nuestra aplicación. Si filtramos los datos, podremos evitar tipos de ataques como es el SQL Inyection o el XSS.

Podríamos pensar que hacer la validación a nivel del cliente podría ser suficiente, pero hay herramientas que permiten saltarse esa verificación y de esa forma poner en peligro nuestra aplicación.

Hoy vamos a ver una forma de verificar los datos por medio de la función filter_var que nos proporciona PHP.

La función filter_var nos permite filtrar una variable según el filtro especificado en sus parámetros. Los parámetros que puede recibir esta función son:

$var: Variable que se quiere filtrar. $filter: Filtro que deseamos aplicar. Será una constante numérica. $options: Conjunto de opciones que modificarán el funcionamiento del filtro.

Será una constante numérica o un array.

A continuación indicamos un listado de filtros de validación:

FILTER_VALIDATE_BOOLEAN: Valida la variable como un booleano. FILTER_VALIDATE_EMAIL: Valida la variable como una dirección de correo

electrónico correcta. FILTER_VALIDATE_FLOAT: Valida que la variable sea del tipo float. FILTER_VALIDATE_INT: Valida la variable como un número entero. FILTER_VALIDATE_IP: Valida la variable como una dirección IP. FILTER_VALIDATE_REGEXP: Valida la variable contra una expresión regular

enviada en la variable de opciones. FILTER_VALIDATE_URL: Valida el valor coma una URL de acuerdo con la RFC

2396.

A continuación, os mostramos un listado de filtros para sanear:

FILTER_SANITIZE_EMAIL: Elimina todos los caracteres execpto letras, números y !#$%&’*+-/=?^_`{|}~@.[].

FILTER_SANITIZE_ENCODED: Codifica la cadena como una URL válida. FILTER_SANITIZE_MAGIC_QUOTES: Aplica la función addslashes. FILTER_SANITIZE_NUMBER_FLOAT: Elimina todos los caracteres excepto

números, +- y opcionalmente ,.eE. FILTER_SANITIZE_NUMBER_INT: Elimina todos los caracteres excepto números y

los signos + -. FILTER_SANITIZE_SPECIAL_CHARS: Escapa caracteres HTML y caracteres con

ASCII menor a 32. FILTER_SANITIZE_STRING: Elimina etiquetas, opcionalmente elimina o codifica

caracteres especiales. FILTER_SANITIZE_STRIPPED: Alias del filtro anterior. FILTER_SANITIZE_URL: Elimina todos los caracteres excepto números, letras y $-

_.+!*’(),{}|^~[]`#%”;/?:@&=.

Filtros para el saneamiento de textos:

FILTER_FLAG_NO_ENCODE_QUOTES: No codificará las comillas simples ni dobles. FILTER_FLAG_STRIP_LOW: Elimina caracteres cuyo varlor ASCII sea menor a 32. FILTER_FLAG_STRIP_HIGH: Elimina caracteres cuyo valor ASCII sea mayor a 127.

Page 2: Filtrar datos

FILTER_FLAG_ENCODE_LOW: Codifica caracteres cuyo valor ASCII sea mennor a 32.

FILTER_FLAG_ENCODE_HIGH: Codifica caracteres cuyo valor ASCII sea mayor a 127.

FILTER_FLAG_ENCODE_AMP: Codifica ampersands (&).

Vamos a proceder a ver algunos ejemplos que nos puedan servir para ver su funcionamiento.

En el primero veremos como validar un número entero.

$var = 123;echo filter_var($var, FILTER_VALIDATE_INT);

En este caso, la función devuelve el número si es correcto, o el valor false, si no es entero.

También podemos indicar que el valor debe de estar dentro de un rango. El código sería el siguiente:

$options = array('min_range'=>10, 'max_range' => 20));

if(filter_var($var, FILTER_VALIDATE_INT, $options) === false){        echo 'Valor incorrecto';}else{        echo 'Valor correcto';}

En este otro ejemplo, limpiaremos nuestra cadena de todos los elementos que no tienen cabida en nuestro campo.

$var = 'uno23';echo filter_var($var, FILTER_SANITIZE_NUMBER_INT);

En este caso, queremos sanear para dejar un entero. La salida sería el valor 23, la cadena “uno” desaparecería.

Ahora veremos un ejemplo de como sanear una cadena que incluye caracteres html, pero dejando sin codificar las comillas dobles.

$text = '<p>"Hola mundo!"</p>';

echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);

//Resultado: "Hola mundo!"

Como podéis ver, esta función nos puede ser de mucha ayuda a la hora de limpiar los campos y así evitarnos posibles problemas.

Page 3: Filtrar datos

La extensión Filter

Esta extensión de PHP nos expone un conjunto de funciones que nos permitirán la validación y saneamiento de datos de una forma sencilla. La funcion filter_var nos permite filtrar una variable según el filtro especificado. El orden de los parámetros es el siguiente:

$var: Variable que se quiere filtrar $filter: Filtro que se desea aplicar. Será una constante numérica $options: Conjunto de opciones que modificarán el funcionamiento del filtro.

Será una constante numérica o un array

A continuación un listado de filtros de validación posibles:

FILTER_VALIDATE_BOOLEANValida la variable como un booleano.

FILTER_VALIDATE_EMAILValida la variable como una dirección de correo electrónico correcta.

FILTER_VALIDATE_FLOATValida que la variable sea del tipo float.

FILTER_VALIDATE_INTValida la variable como un número entero.

FILTER_VALIDATE_IPValida la variable como una dirección IP.

Page 4: Filtrar datos

FILTER_VALIDATE_REGEXPValida la variable contra una expresión regular enviada en la variable de opciones.

FILTER_VALIDATE_URLValida el valor coma una URL de acuerdo con la RFC 2396.

A continuación el listado de filtros para sanear:

FILTER_SANITIZE_EMAILElimina todos los caracteres execpto letras, números y !#$%&’*+-/=?^_`{|}~@.[].

FILTER_SANITIZE_ENCODEDCodifica la cadena como una URL válida.

FILTER_SANITIZE_MAGIC_QUOTESAplica la función addslashes.

FILTER_SANITIZE_NUMBER_FLOATElimina todos los caracteres excepto números, +- y opcionalmente ,.eE.

FILTER_SANITIZE_NUMBER_INTElimina todos los caracteres excepto números y los signos + -.

FILTER_SANITIZE_SPECIAL_CHARSEscapa caracteres HTML y caracteres con ASCII menor a 32.

FILTER_SANITIZE_STRINGElimina etiquetas, opcionalmente elimina o codifica caracteres especiales.

FILTER_SANITIZE_STRIPPEDAlias del filtro anterior.

FILTER_SANITIZE_URLElimina todos los caracteres excepto números, letras y $-_.+!*’(),{}|\\^~[]`<>#%”;/?:@&=.

Validar y sanear un número entero

Vamos a ver un sencillo ejemplo de validación de un número entero.

view plaincopy to clipboardprint?

1. <?php   2. $var = 123;   3. echo filter_var($var, FILTER_VALIDATE_INT);  

La función nos devolverá el entero en caso de que la validación sea correcta, en caso contrario, nos devolverá FALSE.view plaincopy to clipboardprint?

1. <?php   2. $var = 'dos';   

Page 5: Filtrar datos

3. if(filter_var($var, FILTER_VALIDATE_INT) === false){   4.     echo 'Valor incorrecto';   5. }else{   6.     echo 'Valor correcto';   7. }  

A la hora de validar un entero, podemos jugar con las opciones para hacer ajustar el comportamiento de la función a nuestras necesidades. En el siguiente ejemplo se muestra como validar un entero que esté dentro de un rango específico:view plaincopy to clipboardprint?

1. $options = array('min_range'=>10, 'max_range' => 20));   2.   3. if(filter_var($var, FILTER_VALIDATE_INT, $options) === false){   4.     echo 'Valor incorrecto';   5. }else{   6.     echo 'Valor correcto';   7. }  

Ahora vamos a ver como sanear un entero, para los que no entiendan, sanear significa limpiar, es decir, quitamos todo lo que no tiene cabida en nuestro campo.view plaincopy to clipboardprint?

1. <?php   2. $var = 'uno23';   3.   4. echo filter_var($var, FILTER_SANITIZE_NUMBER_INT);  

El código anterior nos devuelve ’23′ debido a que elimina todos los caracteres no numéricos de la cadena.

Validar y sanear un número float

La validación simple de un float es practicamente igual que la de un entero:

view plaincopy to clipboardprint?

1. <php   2. $var = 1.3;   3.   4. echo filter_var($var, FILTER_VALIDATE_FLOAT);  

Sin embargo, con este filtro tenemos una opcion interesante que nos permite especificar cual es el caracter que separa los decimales.view plaincopy to clipboardprint?

1. <php   2. $var = '1,3';   3. $options = array('options'=>array('decimal'=>','));   4. echo filter_var($var, FILTER_VALIDATE_FLOAT, $options);  

Saneamiento de textos

La limpieza de los textos es algo muy importante y por ello tenemos varios flags que modifican el comporamiento del filtro FILTER_SANITIZE_STRING:

Page 6: Filtrar datos

FILTER_FLAG_NO_ENCODE_QUOTESNo codificará las comillas simples ni dobles.

FILTER_FLAG_STRIP_LOWElimina caracteres cuyo varlor ASCII sea menor a 32.

FILTER_FLAG_STRIP_HIGHElimina caracteres cuyo valor ASCII sea mayor a 127.

FILTER_FLAG_ENCODE_LOWCodifica caracteres cuyo valor ASCII sea mennor a 32.

FILTER_FLAG_ENCODE_HIGHCodifica caracteres cuyo valor ASCII sea mayor a 127.

FILTER_FLAG_ENCODE_AMPCodifica ampersands (&).

A continuación algunos ejemplos:

view plaincopy to clipboardprint?

1. <php   2. $text = '<p>"Hola mundo!"</p>';   3. echo filter_var($text, FILTER_SANITIZE_STRING);   4. //Resultado: &#34;Hola mundo!&#34;  

view plaincopy to clipboardprint?

1. <php   2. $text = '<p>"Hola mundo!"</p>';   3. echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUO

TES);   4. //Resultado: "Hola mundo!"  

view plaincopy to clipboardprint?

1. <php   2. $text = '"Ontuts & Cokidoo"';   3.   4. echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUO

TES | FILTER_FLAG_ENCODE_AMP);   5. //Resultado: "Ontuts &amp; Cokidoo"  

Obtener variables externas

Además de la función filter_var, existe una muy interesante llamada filter_input. Esta funcion nos permite obtener una variable externa por su nombre, filtrándola si es necesario.

Es importante que todas las variables externas, es decir, que nos llegan desde el lado del cliente ($_GET, $_POST, $_COOKIE…) las obtengamos a través de esta función para ahorrarnos disgustos. En el siguiente ejemplo vemos como obtener un parámetro GET de la petición con esta función:

Page 7: Filtrar datos

view plaincopy to clipboardprint?

1. <php   2. $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT);   3.   4. if($page !== null && $page !== false){   5.     //El parametro ha sido enviado y es un entero   6. }else{   7.     //El parametro no se ha enviado o no es un entero   8. }  

Esta función nos devolverá NULL si la variable no ha sido enviada, FALSE si la variable ha sido enviada pero no validada o el valor de la variable si ha sido enviada y validada.

El primer parámetro indica de que ámbito será extraída la variable, y puede ser uno de los siguientes valores:

INPUT_GET INPUT_POST INPUT_COOKIE INPUT_SERVER INPUT_ENV

Otra función relacionada y muy interesante es filter_input_array que nos permite definir una serie de validaciones para múltiples campos. Es decir, podemos hacer la validación todos los campos de un formulario en un solo paso. La definición de los campos con sus validaciones se hace mediante un array como se muestra en el siguiente ejemplo:

view plaincopy to clipboardprint?

1. <?php   2. $args = array(   3.     'product_id'   => FILTER_SANITIZE_ENCODED,   4.     'component'    => array('filter'    => FILTER_VALIDATE_INT,   5.                             'flags'     => FILTER_REQUIRE_ARRAY,   6.                             'options'   => array('min_range' => 1, 'max_

range' => 10)   7.                            ),   8.     'versions'     => FILTER_SANITIZE_ENCODED   9.     );   10.   11. $myinputs = filter_input_array(INPUT_POST, $args);  

Esta función devuelve un array del tipo clave/valor que contiene los nombres de los campos junto con su filtrado.

Conclusión

Como puedes observar, PHP nos brinda una gran librería con la cual podemos llevar a cabo validaciones y saneamientos en cuestion de segundos, cosa que antes se hacía bastante engorrosa.

Page 8: Filtrar datos

Tip PHP: Usar Filtrado de datos

Publicado el: 26 de abril 2011 por Hector A. Mantellini ( Xombra )

Page 9: Filtrar datos

La programación segura de PHP es esencial para no comprometer la seguridad de su servidor donde este alojada nuestra aplicación web. Sanitizando y Validando nuestros datos aseguramos nuestra aplicación, además son sencillas de implementar.

Que es Sanitizar? Es el proceso de aplicar una limpieza exhaustiva a un dato o grupos de datos para su uso. Por ejemplo, FILTER_SANITIZE_EMAIL quita caracteres que no son los apropiados que contiene una dirección email.

Que es Validar? Es el proceso utilizado para validar o comprobar si los datos cumplen con ciertos requisitos predefinidos. Por ejemplo, FILTER_VALIDATE_EMAIL determinar si los datos contienen una dirección válida de correo electrónico, pero sin cambiar los datos en sí.

Más sobre filtros: http://php.net/manual/es/book.filter.php

Este ejemplo es tomado de php.net para sanear y validar una dirección email

<?php $a = '[email protected]'; $b = 'bogus - at - example dot org'; $c = '([email protected])'; $sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) { echo "Esta dirección de correo saneada (a) es válida.\n"; }

$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) { echo "Esta dirección de correo saneada (b) es válida.\n"; } else { echo "Esta dirección de correo saneada (b) no es válida.\n"; }

$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) { echo "Esta dirección de correo saneada (c) es válida.\n"; echo "Antes: $c\n"; echo "Después: $sanitized_c\n"; }

?>

Page 10: Filtrar datos

Aplicando filtros en nuestros códigos nos aseguramos que los datos sean los que esperamos.

En la web de jQuery.com me encontré con un usuario que publicó un plugin para hacer listas

dobles (es decir, el clásico: una lista con todas las opciones y los botoncitos para ´pasar´ a la otra los

Page 11: Filtrar datos

items que queremos), pero con una más que interesante opción de un campo de texto en la parte

superior que sirve para filtrar aquellas opciones de nuestra lista según el texto ingresado.

Es más difícil explicarlo que verlo. Las características que tiene, además del potente filtro, son que

pueden ´pasarse´ de una lista a otra, un elemento, muchos, muchos a la vez y lo mismo con quitarlos

de la segunda lista.

Hay muchos demos en la web del autor, pero me quedo con uno, la versión cross-browser, porque,

hoy día, si un código no funciona en todos los navegadores, entonces no sirve. Nunca podemos

obligar a la gente a ver la web con el navegador que tú quieres que la vea.

¿Una demo?

Sí, porque como explicándome soy pésimo, mejor te dejo un link para que lo veas en

funcionamiento y entenderás de qué hablo.

La implementación:

Muy fácil, sólo agregar las librerías jquery y el plugin que se descarga desde la web del autor y un

poco de código html (ya no xhtml...)

Lo quiero...

Pues descárgatelo de este enlace.

Comentario:

Sería muy fácil rellenar la lista 1 (la que tiene todos los items) con contenido dinámico, simplemente

debes reemplazar en el segundo código que pongo aquí abajo la parte de los ´option´ con el resultado

de tu consulta a la base de datos. Y recuerda que para que se procese el envío del formulario, la

segunda lista debe llamarse con nombre de Array (es decir, con [ ] al final -sin espacio en el medio-)

y debes usar algún script para seleccionar todos los items como, por ejemplo, ejecutar la función del

código 3 al hacer el submit.

Código XHTML

<script src="/scripts/jquery-1.3.2.min.js" type="text/javascript" language="javascript"></script> <script src="scripts/dlbScriptCrossBrowser.js" language="javascript" type="text/javascript"></script>

Código XHTML

<table>             <tr>                 <td>                     <div id="box1Group">                         Filter: <input type="text" name="filter" /><button type="button" name="clear">X</button><br /> 

Page 12: Filtrar datos

                        <select name="view" multiple="multiple" style="height:500px;width:300px;">                             <option value="501649">2008-2009 "Mini" Baja</option> <option value="501497">AAPA - Asian American Psychological Association</option>  <option value="501053">Academy of Film Geeks</option> <option value="500001">Accounting Association</option> <option value="501227">ACLU</option> <option value="501610">Active Minds</option> <option value="501514">Activism with A Reel Edge (A.W.A.R.E.)</option> <option value="501656">Adopt a Grandparent Program</option> <option value="501050">Africa Awareness Student Organization</option> <option value="501075">African Diasporic Cultural RC Interns</option> <option value="501493">Agape</option>  <option value="501562">AGE-Alliance for Graduate Excellence</option> <option value="500676">AICHE (American Inst of Chemical Engineers)</option> <option value="501460">AIDS Sensitivity Awareness Project ASAP</option> <option value="500004">Aikido Club</option> <option value="500336">Akanke</option>                         </select><br/>                         <span class="countLabel"></span>                         <select name="storage" class="storageBox">                                                      </select>                      </div>                 </td>                 <td>                     <button id="to2" type="button"> > </button>                     <button id="allTo2" type="button"> >> </button>                     <button id="allTo1" type="button"> << </button>                     <button id="to1" type="button"> < </button>                  </td>                 <td>                     <div id="box2Group">                         Filter: <input type="text" name="filter" /><button type="button" name="clear">X</button><br />                         <select name="view" multiple="multiple" style="height:500px;width:300px;"></select><br />                         <span class="countLabel"></span>                         <select name="storage" class="storageBox"></select>                     </div>                  </td>             </tr>         </table>

Código JAVASCRIPT

// esta función es únicamente para seleccionar todos los items de la lista antes del submit. Recuerda que el botón de enviar el formulario llame a esta función con un onclick=selectAllOptions('id_del_select_2');  function selectAllOptions(selStr) { var selObj = document.getElementById(selStr); for (var i=0; i<selObj.options.length; i++) { selObj.options[i].selected = true; } document.nombreformulario.submit();}

Page 13: Filtrar datos
Page 14: Filtrar datos

Tema: Busqueda PHP + MYSQL  (Leído 1176 veces) judoka

PHPero Avanzado

Mensajes: 255

Karma: 4

Sexo:

Programando hasta lo mas alto.

o

Busqueda PHP + MYSQL « en: 03 de Enero de 2011, 16:52:54 pm »

Mi propósito es crear un buscador que evite buscar palabras con menos de 3 letras

(preposiciones, conjunciones...) pero no se me ocurre ninguna manera de hacer ese

filtro...

de momento tengo lo siguiente:

<?PHP

$busqueda = substr($_POST['q'], 9); //Esto es por que en la busqueda aparece la palabra 

"BUSQUEDA:"

   //CUENTA EL NUMERO DE PALABRAS 

   $trozos=explode(" ",$busqueda); 

   $numero=count($trozos); 

  if ($numero==1) { //Si solo buscas una palabra...

   $query = mysql_query("SELECT * FROM noticias WHERE titulo LIKE '%".$busqueda."%' 

OR texto LIKE '%".$busqueda."%'");

   if(mysql_num_rows($query)){

   while ($noticia = mysql_fetch_array($query)) {

 $comments = mysql_query("SELECT * FROM `comments` WHERE para='".

$noticia['id']."'");

echo'        <div class="article">

          <h2><a href="index.php?pag=Ver&ID='.$noticia['id'].'">'.$noticia['titulo'].'</

a></span></h2>

          <p class="infopost">Publicado <span class="date">el '.$noticia['fecha'].'</

span> por <a href="#">'.$noticia['autor'].'</a> | Archivado en <a href="index.php?

pag=Categorias&cat='.$noticia['categoria'].'">'.$noticia['categoria'].'</a> <a href="ind

ex.php?pag=Ver&ID='.$noticia['id'].'#Comentarios" class="com">Comentarios: <span

Page 15: Filtrar datos

>'.mysql_num_rows($comments).'</span></a></p>

          <div class="clr"></div>

          <div class="img"><img src="images/article1.jpg" width="198" height="188" alt

="" class="fl" /></div>

          <div class="post_content">

            <p>'.$noticia['texto'].'</p>

          </div>

          <div class="clr"></div>

        </div>'; 

} //while

}else{ //num_rows

  echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda";

}

  } elseif ($numero>1) { //si buscas más de 1 palabra...

   $query = mysql_query("SELECT *, MATCH (titulo, texto)

AGAINST ( '%".$busqueda."%' ) FROM noticias WHERE

MATCH (titulo, texto) AGAINST ( '%".$busqueda."%' IN

BOOLEAN MODE ) LIMIT 15");

   if(mysql_num_rows($query)){

   while ($noticia = mysql_fetch_array($query)) {

 $comments = mysql_query("SELECT * FROM `comments` WHERE para='".

$noticia['id']."'");

echo'        <div class="article">

          <h2><a href="index.php?pag=Ver&ID='.$noticia['id'].'">'.$noticia['titulo'].'</

a></span></h2>

          <p class="infopost">Publicado <span class="date">el '.$noticia['fecha'].'</

span> por <a href="#">'.$noticia['autor'].'</a> | Archivado en <a href="index.php?

pag=Categorias&cat='.$noticia['categoria'].'">'.$noticia['categoria'].'</a> <a href="ind

ex.php?pag=Ver&ID='.$noticia['id'].'#Comentarios" class="com">Comentarios: <span

>'.mysql_num_rows($comments).'</span></a></p>

          <div class="clr"></div>

          <div class="img"><img src="images/article1.jpg" width="198" height="188" alt

="" class="fl" /></div>

          <div class="post_content">

            <p>'.$noticia['texto'].'</p>

          </div>

          <div class="clr"></div>

        </div>'; 

} //while

}else{ //num_rows

Page 16: Filtrar datos

  echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda";

}

  } 

?>

« última modificación: 14 de Enero de 2011, 22:10:49 pm por judoka »

En línea

Comunidad PHPeros

Busqueda PHP + MYSQL « en: 03 de Enero de 2011, 16:52:54 pm »

Re:Evitar la búsqueda de palabras de menos de.. « Respuesta #1 en: 03 de Enero de 2011, 17:06:19 pm »

for($i=0;$i<$numero;$i++) {

if(strlen($trozos[$i]) <= 3) { unset($trozos[$i]); }

}

$busqueda = implode(' ', $trozos);

$numero = substr_count($busqueda, ' ')+1;

Esto deberias ponerlo entre $numero=count($trozos); y if($numero==1) {

Como verás uso un for para recorrer cada palabra del array $trozos eliminando aquellas

menores de 3 letras; luego lo uno por espacios y actualizo el numero de palabras en

$numero.

Re:Evitar la búsqueda de palabras de menos de.. « Respuesta #5 en: 05 de Enero de 2011, 21:45:25 pm »

Cita de: judoka en 04 de Enero de 2011, 01:40:09 am

Tienes toda la razón TLX. Para aprender yo y que no tengáis que darme el código

resuelto, me podrías ayudar diciendome con que funciones puedo eliminar y hacer

el filtro?

De momento me has dicho que la coleccion la haga con arrays y luego haga un

in_array para buscar si están esas palabras en el texto, y luego que? borrar?

Muchas gracias, un saludo!

Buenas,

Page 17: Filtrar datos

Vamos a explicarte brevemente como funcionaría...

Primero obtenemos nuestra cadena de búsqueda y palabras que queremos eliminar...

$cadena = "Foros de programacion";

$cens = array("a","de","por","como","hasta");

Después las separaremos creando un array, usando explode...

$exp = explode(" ",$cadena);

Esto devolvería: un array con datos: Foros, de, programacion similar a si pusieramos:

array("Foros","de","programacion");

Entonces como bien ha dicho TLX deberíamos buscar con in_array la palabra a eliminar

¿como?

Extraemos con foreach cada palabra del array $cens como $palcens & luego definimos

si se encuentra en el array ya separado con explode ($exp).

Despues buscamos la posicion de la palabra en nuestro array para definirlo como vacío

en la cadena separada.

foreach($cens As $palcens) {

if(in_array($palcens,$exp)) {

$arraysearch = array_search($palcens,$exp);

$exp[$arraysearch] = "";

}

}

& despues solo nos quedaría volver a montar nuestra cadena de búsqueda.

<?php

foreach($exp As $palexp) {

$cadenanueva .= $palexp . " ";

}

Y así podríamos tener una función simple & casera!

Buscador completo « Respuesta #8 en: 09 de Enero de 2011, 16:21:11 pm »

Page 18: Filtrar datos

Bueno, bueno... ¡¡ maravilloso !!

Me ha servido perfectamente y lo tengo comprendido

Una dudilla, estoy haciendo para que me "destaque" las palabras que he buscado.

En principio, mi idea es con un array para que no distinga entre mayúsculas y

minúsculas:

$su

b=array(strtolower($nbusqueda),strtoupper($nbusqueda),ucwords(strtolower($nbusque

da)));

Y luego unos str_replace para que me destaque las palabras:

$texto=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','GALERIA'); 

$titulo=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','Galeria de imagenes'); 

En total quedaría algo así:

$nbusqueda = "Galeria";

$su

b=array(strtolower($nbusqueda),strtoupper($nbusqueda),ucwords(strtolower($nbusque

da)));

$texto=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','GALERIA'); 

$titulo=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','Galeria de imagenes'); 

echo $titulo."<br>".$texto

De momento hace su función, pero he topado con el problema de que si la palabra

contiene algo antes o después(ya sean paréntesis, exclamaciones, interrogaciones...) no

la destaca, ya que busca la palabra suelta.

A ver si me explico:

ESTO SI LO ENCUENTRA Y HACE LO SIGUIENTE:

Galeria de imagenes

ESTO NO LO ENCUENTRA Y CON LO CUAL SE QUEDA IGUAL:

¡¡Galeria de imagenes!!

Había pensado hacer algo así como en las querys con los "%", pero no sé hacerlo por

desgracia.

¿Qué me recomiendan para enmendar mi problema?

Page 19: Filtrar datos
Page 20: Filtrar datos

hola: alguien me puede ayudar como hacer para mostar que se muestre sola la letra "E" por ejemplo que la contiene dato_1, este es el codigo, gracias

 

--------------------------------------

 <?    /////****PAGINADOR*****/////////    $pagina = $_GET["p"];    $registros = 10;

    if (!$pagina)     {      $inicio = 0;      $pagina = 1;     }     else     {      $inicio = ($pagina - 1) * $registros;     }

        $paginaActual="Hoja_3.php?";        $queryTotalRegistros="SELECT * FROM catalogo WHERE dato_4 = 'Hoja_3' AND estado = 1 ORDER BY dato_1 ASC";        $resultados = mysql_query($queryTotalRegistros);    $total_registros = mysql_num_rows($resultados);

    $queryTotalRegistros= "SELECT * FROM catalogo WHERE dato_4 = 'Hoja_3' AND estado = 1 ORDER BY dato_1 ASC LIMIT $inicio, $registros";        $resultados = mysql_query($queryTotalRegistros);        $total_paginas = ceil($total_registros / $registros);  

    ////////*****FIN********///////////

    if($total_registros > 0)    {     for($i=0; $i<@mysql_num_rows($resultados); $i++)

     {      $cuando = "hoy por la ma&ntilde;ana";      $IDCatalogo = mysql_result($resultados,$i,"IDCatalogo");      $dato_1 = mysql_result($resultados,$i,"dato_1");      $dato_2 = mysql_result($resultados,$i,"dato_2");      $dato_3 = mysql_result($resultados,$i,"dato_3");      $dato_5 = mysql_result($resultados,$i,"dato_5");      $dato_6 = mysql_result($resultados,$i,"dato_6");      $dato_7 = mysql_result($resultados,$i,"dato_7");

Page 21: Filtrar datos

      $imagen = mysql_result($resultados,$i,"imagen");      ?>

hola chic@s estoy buscando un buscador en tiempo real esto es todo lo que eh podido encontrar si sabeis aqui estoy para apoyar y para dar con la respuesta saludos.

Código PHP:

<html> 

<head>  <!-- Buscador en JavaScript -->  <SCRIPT LANGUAGE='JavaScript'>  var numeroPaginas=10; //PAGINAS TOTALES  var numeroDatos=4;     //DATOS POR PAGINA (descr,pal clave, link, titulo)  var baseDatos=new Array(numeroPaginas);  for (i=0; i<numeroPaginas; i++) //ES PARA CREAR LOS CUATRO DATOS DE CADA PAGINA  { baseDatos=new Array(numeroDatos); }  <!-- Creación de la base de datos -->  baseDatos[0][0]="http://dalila.sip.ucm.es/miembros/olga/colores";  baseDatos[0][1]="Colores RGB";  baseDatos[0][2]="El propósito de esta página es mostrarte cómo especificar colores uniformes en HTML";  baseDatos[0][3]="html,colores,RGB";  <!-- -->  baseDatos[1][0]="http://dalila.sip.ucm.es/miembros/olga/dimensionado";  baseDatos[1][1]="Dimensionado de Imágenes";  baseDatos[1][2]="Incluir imágenes en una página web es muy sencillo"; 

baseDatos[1][3]="imagen,jpg,jpeg,gif,html";  <!-- --> 

Page 22: Filtrar datos

baseDatos[2][0]="http://dalila.sip.ucm.es/miembros/olga/tablas";  baseDatos[2][1]="Las Tablas en HTML";  baseDatos[2][2]="Las tablas son uno de los elementos más versátiles de HTML. Permiten mostrar la información de una manera compacta y clara.";  baseDatos[2][3]="fila,columna,celda,tabla,html";  <!-- -->  baseDatos[3][0]="http://dalila.sip.ucm.es/miembros/olga/form";  baseDatos[3][1]="Los Formularios en HTML";  baseDatos[3][2]="HTML permite emplear los llamados formularios, para que el usuario pueda enviar información hacia el servidor.";  baseDatos[3][3]="formularios,validacion,javascript,html";  <!-- -->  baseDatos[4][0]="http://dalila.sip.ucm.es/miembros/olga/frames";  baseDatos[4][1]="Los Frames en HTML";  baseDatos[4][2]="El uso de marcos (frames) es una técnica muy utilizada en la actualidad.";  baseDatos[4][3]="frame,marco,target,html";  <!-- -->  baseDatos[5][0]="http://dalila.sip.ucm.es/miembros/olga/enlaces";  baseDatos[5][1]="Marcos y Enlaces";  baseDatos[5][2]="Si tienes algo de experiencia en esto de la navegación por Internet, te habrás dado cuenta de que en algunas páginas los marcos pueden anidarse interminablemente.";  baseDatos[5][3]="marcos,enlaces,target,html";  <!-- -->  baseDatos[6][0]="http://dalila.sip.ucm.es/miembros/olga/mapas";  baseDatos[6][1]="Ejemplo de Mapa";  baseDatos[6][2]="En HTML, se denomina mapa a la imagen utilizada para enlazar con varias páginas, yendo a una u otra según la zona sobre la que se pulse el ratón.";  baseDatos[6][3]="mapa,imagen,html";  <!-- -->  baseDatos[7][0]="http://dalila.sip.ucm.es/miembros/olga/javas";  baseDatos[7][1]="Ejemplos de JavaScript";  baseDatos[7][2]="Aquí podrás encontrar algunas aplicaciones de JavaScript para que puedas mejorar la presentación de tus páginas web."  baseDatos[7][3]="scripts,ventanas,scrolls,eventos,javascript";  <!-- -->  baseDatos[8][0]="http://dalila.sip.ucm.es/miembros/basico";  baseDatos[8][1]="Nociones Básicas de JavaScript";  baseDatos[8][2]="En esta página encontrarás las nociones básicas sobre JavaScript que necesitas para mejorar tus páginas web.";  baseDatos[8][3]="variables,bucles,funciones,eventos,cajas,arrays,javascript";  <!-- -->  baseDatos[9][0]="http://dalila.sip.ucm.es/miembros/olga/arrays";  baseDatos[9][1]="Los Arrays en JavaScript";  baseDatos[9][2]="Los arrays son un elemento extremadamente importante en cualquier lenguaje de programación.";  baseDatos[9][3]="arrays,arrays densos,arrays bidimensionales,javascript";  <!-- --> 

var sinAcento=new Array('a','e','i','o','u');  var conAcento=new Array('á','é','í','ó','ú');  var entradasResultado="";  var paginaResultados=""; 

function prepararPalabra(palabra) //PONE LA PALABRA EN MINUSCULAS Y SIN TILDES 

Page 23: Filtrar datos

{ var resultado=""; var longitud; //DEVUELVE EL REULTADO  resultado=palabra.toLowerCase();  longitud=resultado.length;  for (i=0; i<5; i++)  { posicion=resultado.indexOf(conAcento);  while (posicion!=-1)  { resultado=resultado.substring(0,posicion)+sinAcento+resultado.substring(posicion+1,longitud);  posicion=resultado.indexOf(conAcento);}  }  return resultado;  } 

function buscarPalabra(palabra,desde) //SI ENCUENTRA LA PALABRA DESDE DESDE EN ALGUNA BASEDATOS  { var indice=-1; //MODIFICA EL INDICE CON EL Nº DE BASEDATOS  for (i=desde; i<numeroPaginas; i++) //DEVUELVE EL INDICE EN NUMERO  if (baseDatos[0].search(palabra)!=-1 || baseDatos[1].search(palabra)!=-1 ||  baseDatos[2].search(palabra)!=-1 || baseDatos[3].search(palabra)!=-1) 

{ indice=i;  break; }  return indice;  } 

function principioPagina(palabra,cantidad) //PRINCIPIO DE PAGINA  { paginaResultados+="<HTML><HEAD><TITLE>Resultados de la búsqueda</TITLE></HEAD>"+  "<BODY BGCOLOR='#FFFFFF'><FONT FACE='helvetica'><CENTER>"+  "<FONT SIZE=+2><B>Resultados de la búsqueda</B></FONT><HR NOSHADE></CENTER>";  if (cantidad==0)  paginaResultados+="<P>Lo sentimos, no se han obtenido resultados para la palabra "  else paginaResultados+="<P>Se ha(n) encontrado "+cantidad+" resultado(s) relacionados con ";  paginaResultados+="<FONT COLOR='#0000FF'><B>"+palabra+"</B></FONT>.<BR>"  } 

function anyadirEntrada(posicion) //PONE UN RESULTADO (TITULO+BR+DESCR)  { entradasResultado+="<P><A HREF='"+baseDatos[posicion][0]+".html'>"+baseDatos[posicion][1]+"</A><BR>"  +baseDatos[posicion][2];  } 

function finalPagina() // EL FINAL DE LA PAGE  { paginaResultados+="<BR><BR><BR>(R)</BODY></HTML>";  } 

function buscador(palabra) //EL BUSCADOR COMPLETO  { numeroResultados=0;  paginaResultados="";  entradasResultado=""; 

var buscada=prepararPalabra(palabra);  var claveBuscada=new RegExp(buscada);  indice=-1;  do { indice=buscarPalabra(claveBuscada,indice+1); 

Page 24: Filtrar datos

if (indice!=-1)  { anyadirEntrada(indice);  numeroResultados++; }  } while (indice!=-1)  principioPagina(buscada,numeroResultados);  paginaResultados+=entradasResultado;  finalPagina();  mostrarVentana(paginaResultados);  } 

function mostrarVentana(pagina)  { opciones="toolbar=0,status=0,menubar=0,"+  "resizable=0,scollbars=1,width=575,height=450";  nuevaVentana=window.open("","",opciones)  nuevaVentana.document.close();  nuevaVentana.document.open();  nuevaVentana.document.write(pagina);  }  </SCRIPT> 

</head> 

<body>  <FORM NAME='entrada'>  <CENTER>  <TABLE>  <TR>  <TD><FONT FACE='helvetica'><B>Palabra clave:</B></FONT></TD>  <TD><INPUT TYPE='text' NAME='dato' SIZE=18></TD>  <TD><FONT FACE='helvetica'><INPUT TYPE='button' VALUE='Buscar'  onClick="buscador(document.entrada.dato.value)"></FONT></TD>  <TD><FONT FACE='helvetica'><INPUT TYPE='button' VALUE='Borrar'  onClick="document.entrada.dato.value=''"></FONT></TD>  </TR>  </TABLE>  </FORM> 

</body> 

</html> 

Avisos Google