Aprendiendo PHP, parte 18: Validar formularios

Cuando hablamos de validaciones de formulario es inevitable pensar en Javascript, y esto tiene mucha lógica, ya que uno de los motivos por los cuales se ha creado este lenguaje es para evitar el envío de información inútil al servidor, sin embargo, siempre hay que tener presente que las validaciones en el navegador, aunque son necesarias para extender la funcionalidad del frontend, éste puede ser vulnerado fácilmente, ya que el usuario puede tener Javascript desactivado o bien, puede tener conocimientos medios de web y saltearse estas validaciones.

Pero las validaciones del backend son una herramienta mucho más segura, por eso es importante que las validaciones con PHP, o cualquier otro lenguaje de servidor nunca falten, ya que es el punto fuerte para evitar la entrada de datos incorrectos por ejemplo en una base de datos.

En esta ocasión veremos un sencillo ejemplo. Así que vamos a crear una nueva carpeta dentro de htdocs llamada validaciones. Crearemos un archivo llamado index.php y otro llamado validado.php y a la misma altura una carpeta llamada funciones que dentro tendrá otro archivo llamado validaciones.php.

Dentro del archivo index.php vamos a copiar el siguiente código:

<!DOCTYPE>
<html>
 <head>
 <title> Formulario </title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 </head>
 <body>
    <form method="post" action="index.php">
       <label> Nombre </label>
       <br />
       <input type="text" name="nombre" />
       <br />
       <label> Edad </label>
       <br />
       <input type="text" name="edad" size="3" />
       <br />
       <label> E-mail </label>
       <br />
       <input type="text" name="email" />
       <br />
       <input type="submit" value="Enviar" />
    </form>
 </body>
</html>

Y dentro de validado.php lo siguiente:

<!DOCTYPE>
<html>
 <head>
 <title> Formulario </title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 </head>
 <body>
    <strong> Sus datos han sido enviados correctamente </strong>
 </body>
</html>

Este último no tendrá mucha lógica, será simplemente un mensaje de que el formulario ha sido validado correctamente.

Con respecto al anterior, al archivo index.php, como se ve en el ejemplo será un simple formulario con tres campos para el nombre, la edad y la dirección de e-mail, algo sencillo que a estas alturas te debería resultar familiar.

Ahora, el asunto es así, cuando se envíe el formulario deben validarse tres cosas: por empezar que el campo nombre no debe estar vacío, el campo de la edad debe ser un número entero y finalmente la dirección de e-mail debe tener un formato válido.

Así que vamos dentro de la carpeta funciones al archivo validaciones.php y crear las tres funciones correspondientes.

Empecemos por la validaciones del campo requerido, podríamos tener una función con este aspecto:

function validaRequerido($valor){
   if($valor == ''){
      return false;
   }else{
      return true;
   }
}

La misma recibirá un valor que será justamente lo que ingresó el usuario, preguntará si éste son comillas vacías, osea si no ingresó nada, y de ser así devolverá false, de lo contrario devolverá true, osea que está validado.

Ahora bien, esto tiene un pequeño problema, y es que si el usuario ingresa un campo sin llenar llegará al servidor  una variable como ésta:

$nombre = '';

Pero también el usuario podría meter espacios y no escribir nada más:

$nombre = ' ';

(Notar el espacio dentro de las comillas)

Acá la validación fallará porque nuestra función pregunta si es comillas-comillas, y no comillas-espacio-comillas. Entonces para solucionar este problema usaremos la función trim() que eliminará las comillas de adelante y atrás. Así que vamos a reemplazar la función por:

function validaRequerido($valor){
   if(trim($valor) == ''){
      return false;
   }else{
      return true;
   }
}

Bueno, seguimos. Vamos a crear la validación para la edad, éste debe ser un número entero, así que vamos a usar una función que no habíamos visto hasta ahora que es la función filter_var(). Ésta recibirá tres parámetros, el primero será el valor a validar o filtrar, el segundo el tipo de validación y el tercero será un array con reglas opcionales. Éste último vamos a omitirlo momentáneamente. Esta función nos devolverá el valor que le pasamos, pero si éste no es válido entonces será FALSE:

function validarEntero($valor){
   if(filter_var($valor, FILTER_VALIDATE_INT) === FALSE){
      return false;
   }else{
      return true;
   }
}

Si te has fijado bien, el segundo parámetro que le hemos pasado a la función es una constante propia de PHP llamada FILTER_VALIDATE_INT, osea para los números enteros. Aunque esta validación no está completa, ya que la función va a validar que el valor que ingresen sea un entero, pero no tiene un rango, osea si el usuario pone que tiene 500 años, esto obviamente es incorrecto. Bueno, como dijimos antes la función filter_var() tiene un tercer parámetro opcional que es un array con filtros, así que vamos a modificar nuestra función por esto:

function validarEntero($valor, $opciones=null){
   if(filter_var($valor, FILTER_VALIDATE_INT, $opciones) === FALSE){
      return false;
   }else{
      return true;
   }
}

Como se ve, la función validarEntero() pasamos un segundo parámetro opcional que se pasará a filter_var(), este parámetro si lo salteamos será null y no se tendrá en cuenta.

Y finalmente una función para validar el email en donde también usaremos la función de PHP filter_var() sólo que en esta ocasión en lugar de usar FILTER_VALIDATE_INT usaremos FILTER_VALIDATE_EMAIL:

function validaEmail($valor){
   if(filter_var($valor, FILTER_VALIDATE_EMAIL) === FALSE){
      return false;
   }else{
      return true;
   }
}

Finalmente nuestro archivo validaciones.php quedará así:

<?php 
 function validaRequerido($valor){
    if(trim($valor) == ''){
       return false;
    }else{
       return true;
    }
 }
 function validarEntero($valor, $opciones=null){
    if(filter_var($valor, FILTER_VALIDATE_INT, $opciones) === FALSE){
       return false;
    }else{
       return true;
    }
 }
 function validaEmail($valor){
    if(filter_var($valor, FILTER_VALIDATE_EMAIL) === FALSE){
       return false;
    }else{
       return true;
    }
 }
?>

Y ahora vamos a volver al archivo index.php para editar la cabecera:

<?php
//Definimos la codificación de la cabecera.
header('Content-Type: text/html; charset=utf-8');
//Importamos el archivo con las validaciones.
require_once 'funciones/validaciones.php';
//Guarda los valores de los campos en variables, siempre y cuando se haya enviado el formulario, sino se guardará null.
$nombre = isset($_POST['nombre']) ? $_POST['nombre'] : null;
$edad = isset($_POST['edad']) ? $_POST['edad'] : null;
$email = isset($_POST['email']) ? $_POST['email'] : null;
//Este array guardará los errores de validación que surjan.
$errores = array();
//Pregunta si está llegando una petición por POST, lo que significa que el usuario envió el formulario.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   //Valida que el campo nombre no esté vacío.
   if (!validaRequerido($nombre)) {
      $errores[] = 'El campo nombre es incorrecto.';
   }
   //Valida la edad con un rango de 3 a 130 años.
   $opciones_edad = array(
      'options' => array(
         //Definimos el rango de edad entre 3 a 130.
         'min_range' => 3,
         'max_range' => 130
      )
   );
   if (!validarEntero($edad, $opciones_edad)) {
      $errores[] = 'El campo edad es incorrecto.';
   }
   //Valida que el campo email sea correcto.
   if (!validaEmail($email)) {
      $errores[] = 'El campo email es incorrecto.';
   }
   //Verifica si ha encontrado errores y de no haber redirige a la página con el mensaje de que pasó la validación.
   if(!$errores){
      header('Location: validado.php');
      exit;
   }
}
?>

Ahora vamos a explicar las líneas:

header('Content-Type: text/html; charset=utf-8');

Definimos el formato, nada nuevo.

require_once 'funciones/validaciones.php';

Importamos el archivo con las validaciones.

$nombre = isset($_POST['nombre']) ? $_POST['nombre'] : null;
$edad = isset($_POST['edad']) ? $_POST['edad'] : null;
$email = isset($_POST['email']) ? $_POST['email'] : null;

Estas variables guardarán los valores que ha enviado el usuario si es que ha enviado el formulario, sino se guardará null.

$errores = array();

Esta array guardará los errores de validación si es que hay. Luego nos servirá para verificar si el formulario está correcto.

if ($_SERVER['REQUEST_METHOD'] == 'POST')

Verificamos si el usuario ha enviado el formulario, osea que la petición está llegando por POST. Dentro de este if vamos a validar que los campos estén correctos.

//Valida que el campo nombre no esté vacío.
if (!validaRequerido($nombre)) {
   $errores[] = 'El campo nombre es incorrecto.';
}
//Valida la edad con un rango de 3 a 130 años.
$opciones_edad = array(
   'options' => array(
      //Definimos el rango de edad entre 3 a 130.
      'min_range' => 3,
      'max_range' => 130
   )
);
if (!validarEntero($edad, $opciones_edad)) {
   $errores[] = 'El campo edad es incorrecto.';
}
//Valida que el campo email sea correcto.
if (!validaEmail($email)) {
   $errores[] = 'El campo email es incorrecto.';
}

Aquí validamos los valores que ha enviado el formulario preguntando en cada validación si da false, de ser así guardamos un nuevo error de validación dentro de el array $errores.

Notar esta línea:

$opciones_edad = array(
   'options' => array(
      //Definimos el rango de edad entre 3 a 130.
      'min_range' => 3,
      'max_range' => 130
   )
);

Definimos el mínimo y máximo de rango, osea que la edad esté entre 3 y 130 años.

if(!$errores){
   header('Location: validado.php');
   exit;
}

Preguntamos si el array $errores está vacío, de ser así significa que no tienen errores (claro está), osea que el formulario está validado y redireccionamos con la función header() a la página validado.php. Con respecto a la función exit está nos permite finalizar el script, osea que todo lo que siga por delante será omitido.

Ahora, si el array $errores no está vacío, osea que hay errores, debemos mostrar los mismos dentro del código html:

<?php if ($errores): ?>
   <ul style="color: #f00;">
      <?php foreach ($errores as $error): ?>
         <li> <?php echo $error ?> </li>
      <?php endforeach; ?>
   </ul>
<?php endif; ?>

Aquí preguntamos si hay errores, y de haberlos los mostramos recorriendo el array $errores y los mostramos con una lista.

El código finalmente quedará así:

<?php
//Definimos la codificación de la cabecera.
header('Content-Type: text/html; charset=utf-8');
//Importamos el archivo con las validaciones.
require_once 'funciones/validaciones.php';
//Guarda los valores de los campos en variables, siempre y cuando se haya enviado el formulario, sino se guardará null.
$nombre = isset($_POST['nombre']) ? $_POST['nombre'] : null;
$edad = isset($_POST['edad']) ? $_POST['edad'] : null;
$email = isset($_POST['email']) ? $_POST['email'] : null;
//Este array guardará los errores de validación que surjan.
$errores = array();
//Pregunta si está llegando una petición por POST, lo que significa que el usuario envió el formulario.
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   //Valida que el campo nombre no esté vacío.
   if (!validaRequerido($nombre)) {
      $errores[] = 'El campo nombre es incorrecto.';
   }
   //Valida la edad con un rango de 3 a 130 años.
   $opciones_edad = array(
      'options' => array(
         //Definimos el rango de edad entre 3 a 130.
         'min_range' => 3,
         'max_range' => 130
      )
   );
   if (!validarEntero($edad, $opciones_edad)) {
      $errores[] = 'El campo edad es incorrecto.';
   }
   //Valida que el campo email sea correcto.
   if (!validaEmail($email)) {
      $errores[] = 'El campo email es incorrecto.';
   }
   //Verifica si ha encontrado errores y de no haber redirige a la página con el mensaje de que pasó la validación.
   if(!$errores){
      header('Location: validado.php');
      exit;
   }
}
?>
<!DOCTYPE>
<html>
 <head>
    <title> Formulario </title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 </head>
 <body>
    <?php if ($errores): ?>
       <ul style="color: #f00;">
          <?php foreach ($errores as $error): ?>
             <li> <?php echo $error ?> </li>
          <?php endforeach; ?>
       </ul>
    <?php endif; ?>
    <form method="post" action="index.php">
       <label> Nombre </label>
       <br />
       <input type="text" name="nombre" value="<?php echo $nombre ?>" />
       <br />
       <label> Edad </label>
       <br />
       <input type="text" name="edad" size="3" value="<?php echo $edad ?>" />
       <br />
       <label> E-mail </label>
       <br />
       <input type="text" name="email" value="<?php echo $email ?>" />
       <br />
       <input type="submit" value="Enviar" />
    </form>
 </body>
</html>

 

Descargar ejemplo

 

Anterior: Aprendiendo PHP, parte 17: Elementos de formulario

Siguiente: Aprendiendo PHP, parte 19: Subir archivos al servidor

One Reply to “Aprendiendo PHP, parte 18: Validar formularios”

  1. muy buenas noches busco ayuda para saber como se hacen los codigos de validacion ,
    de no dejar campos vacios
    no repetir usuario
    y no dejar spacios entre las palabras como caracteres

    mil gracias por sua ayuda

Comments are closed.