dilluns, 10 de març del 2014

PHP. HTML5. Validar DNI



El DNI a Espanya, consta de 8 dígits seguit de 1 lletra en majúscula. L'elecció de la lletra no és arbitraria i es calcula a partir de calcular el mòdulo resultant de dividir el número de DNI entre 23.


Això en dona una posició dins d'una taula estàndar de lletres. Simplement busquem a quina lletra correspon el número resultant i tindrem la lletra que li correspon al número

Per tant:

1. Ha de constar de 9 posicions:

2. La posició 1 a la 8 són nombre

3. La posició 9 és una lletra en majúscula

4. Si dividim el nombre entre 23 el mòdul ens dóna un nombre, que correspon a una posició de la taula de lletres. Si la lletra introduïda coincideix amb la lletra que ens indica la taula de lletres el DNI és correcte


0
1
2
3
4
5
6
7
8
9
10
T
R
W
A
G
M
Y
F
P
D
X
11
12
13
14
15
16
17
18
19
20
21
22
B
N
J
Z
S
Q
V
H
L
C
K
E


EXEMPLE.

Suposem que volem validar si al número de DNI 12345678 li correspon la lletra Z: 12345678- Z

Calculem el mòdul de 23.  12345678 % 23 = 14. 

La posició que ens dona és la 14. La busquem a la taula. La posició 14 és la Z per tant el DNI és correcte.

Com validar a PHP+HTML5

En primer lloc, usem HTML5 per usar els atributs required ( per obligar a entrar el camp) i pattern com a patrò de validació del camp:

<form action="Validar.php" method="post">
DNI
<input required type="text" name="DNI"  pattern="\d{8}[A-Z]{1}" title="Has d'introduir un número de 8 posicions" placeholder="8 números i 1 lletra majúscula" /><br>

<input type="submit" name="Enviar" value="Enviar">
</form>

L'expressió regular \d{8}[A-Z]{1} ens indica que volem 8 dígits seguit d'una lletra en majúscules

Un cop enviat el formulari , agafem les 8 primeres posicions

$numero=substr($valor,0,8);

Agafem la última posició que correspon a la lletra

$lletra=substr($valor,-1);

Calculem el mòdul

$posicio=$numero%23;

Busquem a quina posició correspon a la taula

$cadena="TRWAGMYFPDXBNJZSQVHLCKET";
$lletra2=substr($cadena,$posicio,1);

Finalment comparem la lletra que ens han entrat amb la que hem calculat. Si són iguals, el DNI és correcte.

Finalment , el codi sencer:
<!DOCTYPE html>
<html lang="es">
   <!-- capçalera -->
 <head> 
 <meta charset="UTF-8" />
 <meta name="description" content="Formularis HTML5">
    <meta name="keywords" content="HTML5">
    <meta name="author" content="DeveloperMobilesWeb"> 
 <title>Exemple de camps amb HTML5</title>
 </head>
 <!-- cos del document-->
 <body> 
 <?php
 function validarDNI($valor){ 
   $numero=substr($valor,0,8);
   $lletra=substr($valor,-1);
   $cadena="TRWAGMYFPDXBNJZSQVHLCKET";
   $posicio=$numero%23;
   $lletra2=substr($cadena,$posicio,1); 
   
   if ($lletra==$lletra2){
   return "valid";
   }else
   {
   return "no valid";
   }  
 }
 if (isset($_REQUEST['Enviar'])){ 
  echo validarDNI($_REQUEST['DNI']);  
 }
  else {?>
 <form action="Validar.php" method="post">
 DNI
 <input required type="text" name="DNI"  pattern="\d{8}[A-Z]{1}" title="Has d'introduir un número de 8 posicions" placeholder="8 números i 1 lletra majúscula" /><br> 
 <input type="submit" name="Enviar" value="Enviar"> 
 </form> 
 <?php
 }
 ?> 
 </body> 
 <html>

Cap comentari:

Publica un comentari a l'entrada