Inicio Apuntes FPApuntes DAW Ejercicio Básico 19 PHP: Verificación del DNI
php logo

Ejercicio Básico 19 PHP: Verificación del DNI

por entreunosyceros
Publicado el: Última actualización:
AVISO: Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

En el ejercicio de hoy vamos a crear un pequeño programa que contenga una función que reciba un DNI. Ocho números, sin espacios, puntos ni ningún otro carácter. Todo esto se hará a través de un formulario y devuelva un código que indique el problema:

  • 0: el DNI es correcto.
  • -1: número incorrecto de caracteres.
  • -2: Los ocho primeros caracteres no son números.
  • -3: no coincide el número con la letra.

Explicación de los códigos de error en la comprobación del DNI

Comprobar que el dato introducido corresponde al formato de un NIF. Durante el ejercicio tomaré el NIF como el documento que incluye los números y la letra y como DNI tomaré tan solo los números de dicho NIF. El NIF constará de 8 números y una letra.

Para calcular la letra correspondiente al DNI habrá que tomar el resto de dividir el número dado como dni por 23 (para esto se usa el operador %). Este resto será la posición que ocupa la letra buscada en la cadena TRWAGMYFPDXBNJZSQVHLCKE.

Para comparar la letra calculada con la obtenida por la función que crearemos, hay que tener en cuenta que el usuario podría escribir la letra del NIF en minúscula.

Para comprobar si una cadena de texto representa un valor numérico, debe usarse la función is_numeric() y para convertir a número entero una variable de tipo string, se usa la función intval().

Código para comprobar un DNI

El código que mostraré a continuación puedes verlo funcionando en el siguiente enlace.

<?php
//función para calcular la letra correspondiente al dni
function LetraNIF ($dni) {
  $posicion= intval($dni%23);
  $letras= "TRWAGMYFPDXBNJZSQVHLCKEO";
//nos quedamos con el valor que encuentra en la posición indicada dentro de la cadena letras
  $letraNif= substr ($letras, $posicion, 1);
  return $letraNif;
}

//*********************************************************

 if (isset($_POST['Enviar'])){
 //comprobamos que el campo nif enviado por el formulario no esté vacío.
   if(empty($_POST['nif'])){
    echo "El campo DNI no puede estar vac&iacute;o.
    <br> <a href='index.php' title='Volver'>Volver</a>";
   }else{
    $nif=$_POST['nif'];
//Comprobamos longitud para que no sea diferente a 9
    if (strlen($nif) != 9){
      echo "ERROR -1.<br>N&uacute;mero erroneo de caracteres. Tiene que tener 8 n&uacute;meros y una letra.
      <br> <a href='index.php' title='Volver'>Volver</a>";
     }else{
//tomamos la letra (pasandola a mayúsculas y después los ocho números del dni
       $letra=  strtoupper(substr($nif,-1));
       $dni=substr($nif,0,8);
            
//comprobamos que sean números los primeros 8 caracteres
        if(is_numeric($dni)){
//calculamos la letra del dni introducido mediante la función LetraNIF
          $letraCompr=  LetraNIF($dni);
//comprobamos si la letra introducida por el usuario y la que calcula la función LetraNIF son iguales
           if ($letra==$letraCompr){
              echo "El DNI: ".$dni." es correcto y su letra es ".$letraCompr."
              <br> <a href='index.php' title='Volver'>Volver</a>";
            }else{
              echo "ERROR -3.<br>La letra ".$letra." introducida no coincide con la que le corresponde al NIF: ".$dni.".
              <br> <a href='index.php' title='Volver'>Volver</a>";
            }
         }else{
            echo "ERROR -2.<br>Los ocho primeros caracteres tienen que ser n&uacute;meros.
            <br> <a href='index.php' title='Volver'>Volver</a>";
          }
        }
    
     }
 }else{

?>    
<form action="index.php" method="post" name="form" id="form"><!--Inicio formulario-->
    
  <table align="center" border="1" >  
                        
    <tr><!--línea texto-->
       <td align="center" colspan="2" bgcolor="#f0f0f0">
          <h2>
            Escribe un NIF<br>
            <h6>Formato 12345678A</h6>
          </h2>                    
        </td>
     </tr><!--Fin de la línea texto-->
            
      <tr><!--Línea dni-->
         <td bgcolor="#f0f0f0">NIF: </td>
          <td align="center">
          <input type="text" name="nif" size="9" maxlength="9">
           </td>
       </tr><!--Fin de la línea dni-->
            
       <tr><!--línea de botones-->
           <td align="center" bgcolor="#f0f0f0" colspan="2">
             <input type="submit" value="enviar" name="Enviar" title="Enviar" />
              &nbsp;||&nbsp;
              <input type="reset" value="borrar" name="borrar" title="borrar" />
            </td>
        </tr><!--Fin línea de botones-->
            
   </table><!--FIN de la tabla-->
     
</form><!--Fin del formulario-->
<?php
} //cerramos el else para evitar que se imprima en el resultado en la misma
 //página que el formulario.
?>

 


También te puede interesar ...

2 Comentarios

ATELLEZ 8 febrero, 2020 - 4:46 AM

Da la impresión de que quien ha hecho esto no tiene la menor intención de que alguien pueda aprender….tan mala es la explicación. Falta el formulario de introducción de datos, sin eso estamos perdidos. Ahora comprendo por qué la gente se va de los estudios de informática…..¿Tanto trabajo hubiera costado comenzar con el formulario en html que conecte con el php? Este error lo tienen los señores sabihondos que se la dan de buenos profesores y la verdad es que de didáctica, no tienen ni idea:
Hay que ir de lo concreto a lo abstracto y de lo particular a lo general y no al revés.-
Alfonso Téllez

Responder
sapoclay 8 febrero, 2020 - 1:57 PM

Lo primero que he de decirte, es que este artículo no busca enseñarle nada a nadie. Esto no es más que e un ejercicio que hice hace ya bastantes años para un ciclo, y que publiqué para tener disponible para mi uso o para aquellos a los que les pudiese valer.

A mi me parece es que eres el típico «listo» que busca ejercicios para copiar / pegar y no tener que molestar la neurona. Es la gente así es la que suele dejar los estudios de informática :). Si te hubieses molestado en leer el código, verías que el formulario necesario está metido justo debajo del código PHP, ya que al ser uno de los primero ejercicios que por aquel entonces hice, no tenía los conocimiendos para separar en dos archivos diferentes el código PHP y el HTML. Evidentemente a medida que adquieres conocimientos, esto se debería hacer de otra forma.

En fin, solo me queda decirte que antes de ponerte a «rebuznar» en los comentarios de las páginas de la gente, aprendas a leer el código (sobre todo si está explicado línea a línea), ya que nadie va a publicar exactamente lo que tú estás buscando. Si quieres algo que vaya de lo concreto a lo abstracto y de lo particular a lo general, escribe tu propio código y no seas tan gorrón ni tan imbécil.

Salu2.

Responder

Deja tu comentario

* Al utilizar este formulario, acepta que este sitio web almacene y maneje sus datos.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.