Sigueme por RSS! RSS

Funciones de filtro en PHP (parte 2)

Las funciones filter forman parte de PHP desde la versión 5.2 y no es necesario activarlas en el php.ini.

Hay dos tipos de filtrado: validación y saneamiento.
La validación se usa para validar o comprobar si los datos cumplen ciertas especificaciones.
El saneamiento limpiará los datos, de modo que los cambiará eliminando los caracteres no deseados.

Ya habíamos repasado las primeras funciones, filter_has_var, filter_id, filter_input, filter_list, filter_var, ahora es el turno de las que trabajan con array's.

- filter_input_array: es similar a filter_input, la diferencia es que permite trabajar con varias variables externas, para así evitar tener que llamar a su homologa varias veces. Devuelve false  en caso de que falle el filtro, null en caso de que la variable no este creada.

sintaxis:
filter_input_array (tipo,definición)

donde:
- tipo puede ser alguna de las siguientes constantes: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV.
- definición representará un array especificando opcionalmente el filtro, flags y opciones

ejemplo:
(clic para mostrar/ocultar el código)
// verificamos si no se envio el formulario..
if (!filter_has_var(INPUT_POST, 'btEnviar')) {
  echo '
    <html>
      <head></head>
      <body>
        <form action="" method="post" >
          Nombre: <input type="text" name="txtNombre" size="20" maxlength="20"><br />
          Email: <input type="text" name="txtEmail" size="20" maxlength="70"><br />
          Web: <input type="text" name="txtWeb" size="20" maxlength="70"><br />
          Promedio: <input type="text" name="txtPromedio" size="4" maxlength="2"><br />
          Cursos realizados <br/>
          <input type="checkbox" name="chkCursos[]" value="1" /> Arquitectura del computador.<br />
          <input type="checkbox" name="chkCursos[]" value="2" /> Ingenieria del software.<br />
	  <input type="checkbox" name="chkCursos[]" value="3" /> Sistema de información<br /><br />
          <input type="submit" name="btEnviar" value="Enviar">
        </form>
      </body>
    </html>';
    exit; // no mostramos más ..
}

// armamos un array especificando el filtro, flags y opciones para cada campo
$arrCampos = array
(
  // eliminamos caracteres no deseados
  'txtNombre' => array('filter'=>FILTER_SANITIZE_STRING),

  // lo validamos como Email
  'txtEmail' => FILTER_VALIDATE_EMAIL,

  // lo validamos como URL
  'txtWeb'   => FILTER_VALIDATE_URL,

  // rango del promedio [1-100]
  'txtPromedio'  => 
  array('filter' => FILTER_VALIDATE_INT,'options'=> array('min_range'=>1, 'max_range'=>100)),

  // lo validamos como entero e indicamos que debe ser un array
  'chkCursos' => array('filter' => FILTER_VALIDATE_INT,'flags' => FILTER_REQUIRE_ARRAY),
);

// validamos cada elemento del array
$miArray = filter_input_array(INPUT_POST, $arrCampos);
 
// verificamos ..
if (empty($miArray['txtNombre'])) 
   echo 'El campo <b>Nombre</b> está vacio o es <span style="color:red">incorrecto</span>.';
else echo '<br/>Nombre <span style="color:blue">Válido</span>.';

if (empty($miArray['txtEmail'])) 
   echo '<br/>El campo <b>Email</b> está vacio o es <span style="color:red">incorrecto</span>.';
else echo '<br/>Email <span style="color:blue">Válido</span>.';

if (empty($miArray['txtWeb'])) 
   echo '<br/>El campo <b>Web</b> está vacio o es <span style="color:red">incorrecto</span>.';
else echo '<br/>Web <span style="color:blue">Válida</span>.';

if (empty($miArray['txtPromedio'])) 
   echo '<br/>El campo <b>Promedio</b> está vacio o es <span style="color:red">incorrecto</span>.';
else echo '<br/>Promedio <span style="color:blue">Válido</span>.';

if (empty($miArray['chkCursos'])) 
   echo '<br/>Debes seleccionar por lo menos un <b>Curso</b> de la lista.';
else echo '<br/>Muy bien, hay por lo menos un curso seleccionado.';

Para el caso del campo txtNombre, fíjate que usamos FILTER_SANITIZE_STRING, que pertenece a una lista de filtros de saneamientos que te permitirán limpiar los datos recibidos. Entre algunos, tenemos:

FILTER_SANITIZE_STRING elimina etiquetas, opcionalmente elimina o codifica caracteres especiales.
FILTER_SANITIZE_EMAIL elimina todos los caracteres excepto letras, números y *+-/=?^_`{|}~@.[]!#$%&’.
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_URL elimina todos los caracteres excepto números, letras 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, los signos +- y opcionalmente ,.eE.


- filter_var_array es similar a filter var() con la diferencia de que permite trabajar con varias variables al mismo tiempo.

ejemplo:
(clic para mostrar/ocultar el código)
// armamos nuestro array
$arrVars = array(
  'Email'  => 'ID@gmail.com',
  'URL'    => 'http://cassianet.blogspot.com',
  'IP'     => '192.168.1.1',
  'Edad'   => '19',
  'Cadena' => 'letras123',
  'Hexa'   => '0xf0',
  'Bool'   => 'ON',
  'Float'  => '111,109.40'
);

// armamos el filtro
$arrFiltros = array(

   // valida que la dirección tenga el formato [cadena]@[cadena].[cadena]
   // devolvería true pasándole la cadena de caracteres: a@b.c
   'Email' => FILTER_VALIDATE_EMAIL,

   // como URL valida
   'URL' => FILTER_VALIDATE_URL,

   // dirección IP
   'IP' => array('filter' => FILTER_VALIDATE_IP, 'flags'  => FILTER_FLAG_IPV6),

   // rango de Edad permitido
   'Edad' => array(
      'filter'  => FILTER_VALIDATE_INT,
      'options' => array('min_range' => 21, 'max_range' => 35)),

  // cadena de caracteres validada con expresion regular [solo caracteres alfabeticos]
  'Cadena' => array(
    'filter'  => FILTER_VALIDATE_REGEXP, 
    'options' => array('regexp' => "/^[a-zA-Z]+$/")),

  // validado como hexadecimal
  'Hexa' => array(
    'filter'  => FILTER_VALIDATE_INT,
    'flags'   => FILTER_FLAG_ALLOW_HEX,
    'options' => array('min_range' => 1, 'max_range' => 0xf0)),

  // lo validamos como boolean,
  // devuelve TRUE para si el valor de la variable pasada es (1,TRUE,ON,YES) 
  'Bool' => FILTER_VALIDATE_BOOLEAN,

  // lo validamos como FLOAT, 
  // FILTER_FLAG_ALLOW_THOUSAND permite usar una coma (,) como separador de miles en los números
  'Float' => array('filter'  => FILTER_VALIDATE_FLOAT, 'flags'   => FILTER_FLAG_ALLOW_THOUSAND)
);

// iniciamos el filtro
$arrDatos = filter_var_array($arrVars, $arrFiltros);

// mostramos los resultados
foreach ($arrDatos as $sVar => $Valor)
   echo '<br/>Valor ', $sVar , (empty($Valor) ? 
' <span style="color:red">Incorrecto</span>.' : ' <span style="color:blue">Correcto</span>.');

/*
  Devuelve:
  Valor Email Correcto.
  Valor URL Correcto.
  Valor IP Incorrecto.
  Valor Edad Incorrecto.
  Valor Cadena Incorrecto.
  Valor Hexa Correcto.
  Valor Bool Correcto.
  Valor Float Correcto.
*/

Referencias:
devzone.zend.com
php.net

1 comentario: Suscribete a los comentarios por RSS

Ruth Escobar

Que buena entrada, me ayudaste muchísimo. Sólo te recomiendo que no uses cursiva en el código sino un tipo de fuente mas legible y natural.
Saludos!

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.