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í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úmero erroneo de caracteres. Tiene que tener 8 nú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ú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" />
||
<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.
?>
2 Comentarios