Validar formularios con PHP

7 Feb

Si en tu proyecto PHP estás usando algún framework como Laravel, seguramente te habrá resultado fácil a la hora de validar los datos de entrada desde el backend, gracias a las librerías incluidas. Sin embargo, y aunque hoy día la mayoría de los proyectos se encaran con algún framework, puede ser que no sea así,  y cuando tengas que validar los datos, tendrás la necesidad de usar alguna librería para solucionar este problema.

Buscando en la web, encontré esto, una librería para validar datos con PHP, muy bien lograda, y fácil de implementar:

https://github.com/Wixel/GUMP

La forma de utilizarla es sencillo, primero debemos crear una clase de php con el código que se encuentra en el siguiente enlace:

https://github.com/Wixel/GUMP/blob/master/gump.class.php

Y una vez hecho esto, debemos incluirla en nuestro código:

require_once 'gump.class.php';

Y finalmente validar los datos de entrada $_POST, de la siguiente manera:

$is_valid = GUMP::is_valid($_POST, array(
    'username' => 'required|alpha_numeric',
    'password' => 'required|max_len,100|min_len,6'
));

El método is_valid recibe dos parámetros:

  • Un array asociativo con los datos a validar. En nuestro caso usamos simplemente $_POST, el cual son los datos de entrada enviados por el usuario.
  • Un array asociativo, en donde debemos indicar las reglas de validación que deben cumplir los datos enviados por el usuario.

Finalmente este método devolverá dos tipos de datos como resultado. Si la validación pasó correctamente será TRUE, de lo contrario será un array con los errores de validación.

Ejemplo sencillo

Vamos a suponer que necesitamos hacer un formulario en donde el usuario envía los siguientes datos:

  • Nombre y apellido
  • Teléfono
  • Email

Así que simplemente vamos a hacer lo siguiente:

<?php 
 $nombre_apellido = (isset($_POST['nombre_apellido'])) ? $_POST['nombre_apellido'] : null;
 $telefono = (isset($_POST['telefono'])) ? $_POST['telefono'] : null;
 $email = (isset($_POST['email'])) ? $_POST['email'] : null;
 $errores = array();
 $formulatio_validado = false;
 if($_SERVER['REQUEST_METHOD'] == 'POST'){
    require_once 'gump.class.php';
    $resultado = GUMP::is_valid($_POST, array(
       'nombre_apellido' => 'required|min_len,3|max_len,50',
       'telefono' => 'required|numeric|min_len,5|max_len,20',
       'email' => 'required|valid_email'
    ));
    if($resultado === TRUE){
       $formulatio_validado = true;
    }else{
       $errores = $resultado;
    }
 }
?>
<!DOCTYPE html>
<html ng-app="app">
 <head>
 <meta charset="utf-8">
 <title>Validador con GUMP</title>
 <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
 <link rel="stylesheet" type="text/css" href="css/bootstrap-responsive.min.css" />
 </head>
 <body> 
 <div class="container">
    <div class="row">
       <h1 class="span12"> Ejemplo de validación </h1>
    </div>
    <?php if($formulatio_validado): ?>
       <div class="row">
          <div class="span12"> Formulario validado correctamente. </div>
       </div>
    <?php else: ?>
       <form action="index.php" method="post">
          <div class="row">
             <div class="span2"> <label for="nombre_apellido"> Nombre y apellido </label> </div>
             <div class="span4"> <input type="text" name="nombre_apellido" id="nombre_apellido" value="<?php echo $nombre_apellido ?>" /> </div>
             <div class="span2"> <label for="telefono"> Teléfono </label> </div>
             <div class="span4"> <input type="number" name="telefono" id="telefono" value="<?php echo $telefono ?>" /> </div>
          </div>
          <div class="row">
             <div class="span2"> <label for="email"> Email </label> </div>
             <div class="span4"> <input type="email" name="email" id="email" value="<?php echo $email ?>" /> </div>
             <div class="span6"> &nbsp; </div>
          </div>
          <div class="row">
             <div class="span12"> <input type="submit" value="Enviar" class="btn btn-success" /> </div> 
          </div>
       </form>
       <ul class="text text-error">
          <?php foreach($errores as $key => $error): ?>
              <li> <?php echo $error; ?> </li>
          <?php endforeach; ?>
       </ul>
    <?php endif; ?>
 </div>
 </body>
</html>

Al enviar el formulario simplemente agregamos las reglas de validación como un array, por ejemplo:

'nombre_apellido' => 'required|min_len,3|max_len,50',

El nombre y el apellido debe ser un campo obligatorio (required) y debe tener un mínimo de 3 caracteres y un máximo de 50.

También creamos dos variables donde, en una guardamos si el formulario fue validado correctamente, y un array donde se irán guardando los errores, de haberlos:

$errores = array();
$formulatio_validado = false;

El método is_valid() nos devolverá el resultado de la validación:

$resultado = GUMP::is_valid($_POST, array(
   'nombre_apellido' => 'required|min_len,3|max_len,50',
   'telefono' => 'required|numeric|min_len,5|max_len,20',
   'email' => 'required|valid_email'
));
if($resultado === TRUE){
   $formulatio_validado = true;
}else{
   $errores = $resultado;
}

Si el formulario fue validado, simplemente nos mostrará un mensaje:

<div class="row">
   <div class="span12"> Formulario validado correctamente. </div>
</div>

De lo contrario nos mostrará una lista con los errores:

<ul class="text text-error">
      <?php foreach($errores as $key => $error): ?>
      <li> <?php echo $error; ?> </li>
   <?php endforeach; ?>
</ul>

Cambiar texto de los errores

Los errores de validación vendrán, por defecto en un formato en inglés.

Dentro de la clase, podés modificar los mismos yendo al método get_readable_errors().

Descargar ejemplo

Saludos!

Redes sociables

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


    *