Validar un formulario con PHP

No cabe duda de que gracias a HTML y JavaScript podemos validar de una forma muy sencilla los datos recogidos por un formulario. Pero el problema de estas capas es su vulnerabilidad a deshabilitación y facilidad para la modificación de los datos desde el propio navegador, porque son capas de cara al cliente. Por eso, este tutorial va destinado a validar un formulario con PHP.

Como ejemplo vamos a usar el registro de un contacto en una agenda, una aplicación sencilla con un formulario no muy extenso.

Los datos que vamos a recoger son el nombre, el teléfono y el correo electrónico; por tener distintos tipos de validaciones.

Plantilla HTML

Para empezar, la estructura del formulario en HTML que también obligamos a los campos que sean obligatorios, simplemente por costumbre, porque como ya he dicho anteriormente esta seguridad se puede saltar.

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <div class="form-group">
    <label for="">Nombre</label>
    <input type="text" class="form-control" name="nombre" required>
    <span>
      <?php echo $error_nombre; ?>
    </span>
  </div>
  
  <div class="form-group">
    <label for="">Teléfono</label>
    <input type="text" class="form-control" name="telefono" required>
    <span>
      <?php echo $error_telefono; ?>
    </span>
  </div>
  
  <div class="form-group">
    <label for="">Correo</label>
    <input type="mail" class="form-control" name="correo" required>
    <span>
      <?php echo $error_correo; ?>
    </span>
  </div>
  
  <input type="submit" class="btn btn-primary" value="Enviar">
</form>

Vamos a analizar algunos detalles:

  • El atributo action del formulario se apunta a sí mismo porque el procesamiento de los datos se va a realizar sobre el mismo fichero pero en código PHP.
  • Tras los input, se ha agregado una etiqueta span para indicar el tipo de error cometido al insertar los datos.

Recoger y comprobar el formulario

En un principio vamos a declarar unos mensajes vacíos que nos servirán de contenedores para los mensajes de error. Y después se empiezan a analizar los campos:

$error_nombre = $error_telefono = $error_correo = '';

if( isset($_POST['submit']) ) { 
  //...code
}

La primera comprobación que se debe realizar es la de si el campo de texto está vacío. Si pasa esta comprobación le paso una función para quitarle los espacios al principio y final de la cadena de texto y la eliminación de barras para evitar caracteres innecesarios, esta función la he llamado test_input:

function test_input($data) {
  // para evitar caracteres innecesarios
  $data = trim($data);

  // quita los espacios al principio y al final
  $data = stripslashes($data);

  // quita las barras inclinadas
  return $data;
}

Cuando ya se ha devuelto la cadena, se comprueba el contenido con expresiones regulares. En PHP existe una función que compara una cadena de texto con con la expresión regular, preg_match(‘reg_exp’, string).

Si quieres probar tus expresiones regulares, te recomiendo que te dirigas a la web de Regexr para hacer tests de tus cadenas de texto.

// nombre 
if (empty($_POST['nombre'])) 
  $error_nombre = "Este campo no puede estar vacío";
else
  $nombre = test_input($_POST['nombre']); 
if (!preg_match('/^[A-ZÁÉÍÓÚ][a-záéíóú]*$/', $nombre))
  $error_nombre = "El nombre empieza por mayúscula";

// telefono 
if (empty($_POST['telefono'])) 
  $error_telefono = "Este campo no puede estar vacío";
else
  $telefono = test_input($_POST['telefono']);
if (!preg_match('/^[967]\d{8}$/', $telefono)) 
  $error_telefono = "El teléfono tiene 9 cifras y empieza por 9, 6 o 7";

// correo
if (empty($_POST['correo'])) 
  $error_correo = "Este campo no puede estar vacío";
else
  $correo = test_input($_POST['correo']);
if (!preg_match('/[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+.[a-zA-Z]{2,4}/', $correo)) 
  $error_correo = "El formato del correo electrónico es nombre@dominio.extension"; 

if($error_nombre=="" && $error_telefono=="" && $error_correo=="") {
  echo "todo ok"; 
  header("Location:index.php"); 
}

Si tras estas comprobaciones pasan la prueba es que los mensajes de error siguen vacíos. Al estar vacíos es que hay 0 errores y todo ha ido correctamente. Solo así podemos validar un formulario con PHP desde la parte del servidor, la cual es imposible de acceder desde la parte del cliente.

3 comentarios en «Validar un formulario con PHP»

  1. Buenas, podrias explicar que hacen las expresiones regulares que has usado en cada validacion? Estoy intentando validar un formulario y necesito validar que el usuario que se introduzca no posea ninguna letra mayúscula… Muchísimas gracias

    Responder
    • Hola, gracias por tu comentario.
      Lo primero es entender un poco lo que son las expresiones regulares. Es imposible conocerlas todas y yo mismo tengo que consultar cómo hacerlas. Te recomiendo la página que he puesto en la documentación. Regexr tiene un panel a la izquierda donde viene un glosario bastante completo de cómo construir Expresiones Regulares.
      El campo del nombre se valida si: La primera letra es mayúscula y además puede llevar acento esa mayúscula. Luego le sigue un rango de 1 o más letras.
      El teléfono se valida si: La primera cifra es 9, 7 o 6 (prefijos España) y luego le siguen 8 dígitos más (los que sean).
      El correo se valida por esa expresión tan rara que ni yo llego a entender muy bien y según busques por internet, habrá autores que la pongan distinta o con alguna variación. No hay un concenso claro en esto.
      Espero haberte ayudado.

      Responder
  2. Pues que ABSURDEZ usar expresiones regulares cuando PHP dispone de una funcion propias para validar y si necesitas validar un numero de caracteres tienes strlen().

    Muy a las malas que necesites usar filter_var() + strlen() o similares, se obtiene un tiempo de trabajo muy inferior que con preg_match(), prueba con el eMail y te sorprenderas.

    Pero claro, el reciclarse es algo que no gusta.

    Responder

Deja un comentario