begin process at 2012 05 27 20:52:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > VÉRIFICATION DE LA VALIDITÉ D'UN BILLET DE BANQUE

VÉRIFICATION DE LA VALIDITÉ D'UN BILLET DE BANQUE


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :billets, banque, euro, vérification, numéro série Niveau :Débutant Date de création :13/12/2007 Date de mise à jour :21/12/2007 18:54:31 Vu / téléchargé :20 214 / 231

Auteur : The_magicien

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce script va, lorsque vous rentrez le numéro de série (avec la lettre au début) de n'importe quel billet Euro, vous dire si le billet que vous avez en votre possession est un vrai ou un faux. :)

Source

  • ##########################################
  • ## AUTRE VERSION DISPONIBLE DANS LE ZIP ##
  • ##########################################
  • <?php
  • if(isset($_POST['num']))
  • {
  • if(preg_match("/[^:alnum:]/", $_POST['num']))
  • {
  • $letter = $_POST['num']{0};
  • if(preg_match("/^[L-Z]/", $letter) && $letter != ("O"|"Q"|"W"))
  • {
  • switch ($letter)
  • {
  • case 'L':
  • $pre = '12';
  • $num = str_replace("L", "12", $_POST['num']);
  • break;
  • case 'M':
  • $pre = '13';
  • $num = str_replace("M", "13", $_POST['num']);
  • break;
  • case 'N':
  • $pre = '14';
  • $num = str_replace("N", "14", $_POST['num']);
  • break;
  • case 'P':
  • $pre = '16';
  • $num = str_replace("P", "16", $_POST['num']);
  • break;
  • case 'R':
  • $pre = '18';
  • $num = str_replace("R", "18", $_POST['num']);
  • break;
  • case 'S':
  • $pre = '19';
  • $num = str_replace("S", "19", $_POST['num']);
  • break;
  • case 'T':
  • $pre = '20';
  • $num = str_replace("T", "20", $_POST['num']);
  • break;
  • case 'U':
  • $pre = '21';
  • $num = str_replace("U", "21", $_POST['num']);
  • break;
  • case 'V':
  • $pre = '22';
  • $num = str_replace("V", "22", $_POST['num']);
  • break;
  • case 'X':
  • $pre = '24';
  • $num = str_replace("X", "24", $_POST['num']);
  • break;
  • case 'Y':
  • $pre = '25';
  • $num = str_replace("Y", "25", $_POST['num']);
  • break;
  • case 'Z':
  • $pre = '26';
  • $num = str_replace("Z", "26", $_POST['num']);
  • break;
  • }
  • if((strlen($num) == 13) OR (preg_match("/[^0-9]/", $num)))
  • {
  • if ( bcmod($num, "9") == 8)
  • {
  • echo "<br /><br /><h2><font color='green'>Votre billet est <b>vrai</b></font></h2><br /><br />";
  • }
  • else
  • {
  • echo "<br /><br /><h2><font color='red'>Votre billet est <b>faux</b></font></h2><br /><br />";
  • }
  • }
  • else
  • {
  • echo "<font color='red'><b>Numéro de série invalide!<br /><br /><font size='2'><u>Rappel:</u> 1 lettre (entre L et Z exceptées O, Q et W) puis 11 chiffres.</font></b></font><br /><br />";
  • }
  • }
  • else
  • {
  • echo "<font color='red'><b>Numéro de série invalide!<br /><br /><font size='2'><u>Rappel:</u> 1 lettre (entre L et Z exceptées O, Q et W) puis 11 chiffres.</font></b></font><br /><br />";
  • }
  • }
  • }
  • else
  • {
  • echo "<br /><br /><br />";
  • }
  • ?>
  • <form id="form1" name="form1" method="post" action="">
  • <label for="num">Numéro de série :</label>
  • <input type="text" name="num" id="num" maxlength="12" />
  • <p>
  • <input type="submit" name="Envoyer" id="Envoyer" value="Envoyer" />
  • <input type="reset" name="Envoyer2" id="Envoyer2" value="Réinitialiser" />
  • </p>
  • </form>
##########################################
## AUTRE VERSION DISPONIBLE DANS LE ZIP ##
##########################################

      <?php
if(isset($_POST['num']))
{
  if(preg_match("/[^:alnum:]/", $_POST['num'])) 
  {
  $letter = $_POST['num']{0};
    if(preg_match("/^[L-Z]/", $letter) && $letter != ("O"|"Q"|"W"))
    {
      switch ($letter) 
      {
        case 'L':
			$pre = '12';
			$num = str_replace("L", "12", $_POST['num']);
			break;
		case 'M':
			$pre = '13';
			$num = str_replace("M", "13", $_POST['num']);
			break;
		case 'N':
			$pre = '14';
			$num = str_replace("N", "14", $_POST['num']);
			break;
		case 'P':
			$pre = '16';
			$num = str_replace("P", "16", $_POST['num']);
			break;
		case 'R':
			$pre = '18';
			$num = str_replace("R", "18", $_POST['num']);
			break;
		case 'S':
			$pre = '19';
			$num = str_replace("S", "19", $_POST['num']);
			break;
		case 'T':
			$pre = '20';
			$num = str_replace("T", "20", $_POST['num']);
			break;
		case 'U':
			$pre = '21';
			$num = str_replace("U", "21", $_POST['num']);
			break;
		case 'V':
			$pre = '22';
			$num = str_replace("V", "22", $_POST['num']);
			break;
		case 'X':
			$pre = '24';
			$num = str_replace("X", "24", $_POST['num']);
			break;
		case 'Y':
			$pre = '25';
			$num = str_replace("Y", "25", $_POST['num']);
			break;
		case 'Z':
			$pre = '26';
			$num = str_replace("Z", "26", $_POST['num']);
			break;
	  }
	  if((strlen($num) == 13) OR (preg_match("/[^0-9]/", $num)))
	  {
	    if ( bcmod($num, "9") == 8) 
		{
		  echo "<br /><br /><h2><font color='green'>Votre billet est <b>vrai</b></font></h2><br /><br />";
		}
		else
		{
		  echo "<br /><br /><h2><font color='red'>Votre billet est <b>faux</b></font></h2><br /><br />";
		}
	  }
	  else
	  {
    	echo "<font color='red'><b>Numéro de série invalide!<br /><br /><font size='2'><u>Rappel:</u> 1 lettre (entre L et Z exceptées O, Q et W) puis 11 chiffres.</font></b></font><br /><br />";
	  }
	}
	else
	{
      echo "<font color='red'><b>Numéro de série invalide!<br /><br /><font size='2'><u>Rappel:</u> 1 lettre (entre L et Z exceptées O, Q et W) puis 11 chiffres.</font></b></font><br /><br />";
	}
  }
}
else
{
  echo "<br /><br /><br />";
}
    ?>
	
    <form id="form1" name="form1" method="post" action="">
      <label for="num">Numéro de série :</label>
      <input type="text" name="num" id="num" maxlength="12" />
      <p>
        <input type="submit" name="Envoyer" id="Envoyer" value="Envoyer" />
        <input type="reset" name="Envoyer2" id="Envoyer2" value="Réinitialiser" />
      </p>
    </form>

 Conclusion

Petites explications quand au travail du script.
En fait, la vérification d'un billet de banque (Euro) se fait de la manière suivante : On prend la première lettre du numéro de série et on détermine son rang dans l'alphabet. Ensuite on rassemble ce chiffre (par exemple 21 si c'est la lettre U) avec le reste du numéro de série.
Ce nombre doit donner 8 lorsqu'on le met modulo 9. Si le résultat est différent de 8, le billet est faux ;)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

13 décembre 2007 23:46:35 :
Remise en forme
21 décembre 2007 18:51:45 :
Autre version mise en ligne (de Kankrelune et Neigedhiver)
21 décembre 2007 18:54:31 :
Nouvelle version mise en ligne (beaucoup plus simple) issue d'un "mix" entre les commentaires de Kankrelune et Neigedhiver (Merci à eux ;))

 Sources de la même categorie

EXEMPLE D'APPLICATION DE L'ALGORITHME DE DIJKSTRA EN PHP par philtr8
CLEF POUR EAN 13 ET 14 par RaftY
FONCTION DE CALCUL DU NOMBRE DE DUEL UNIQUE POUR UN NOMBRE N... par mtrix000
Source avec Zip Source avec une capture TRIANGLE DE PASCAL ET SON ÉQUATION par vendeeHdLR89
Source avec Zip CONVERTISSEUR LAMBERT2 ÉTENDU EN COORDONNÉE GÉOGRAPHIQUE (LO... par varfendell

 Sources en rapport avec celle ci

Source avec Zip VÉRIFICATION DE FORMULAIRE EN PHP par psonic13
Source avec Zip Source avec une capture PHPJSVFORM : DES CLASSES PHP, DES JAVASCRIPTS POUR CRÉER FAC... par synanceia
CLASSE DE VÉRIFICATION DE DONNÉES par swaenboutu
Source avec Zip [PHP5] - CLASSE DE VÉRIFICATION DE FORMULAIRE par codefalse
PHP5 - CLASSE DE VÉRIFICATION DE FORMULAIRE SIMPLE par NainPuissant

Commentaires et avis

Commentaire de Evangun le 14/12/2007 00:24:45

Hello,
Je ne connaissais pas ce truc, c'est marrant ! Ceci dit, si j'étais faussaire, je le connaîtrais, et du coup je ferais des numéros corrects :)

Commentaire de neigedhiver le 14/12/2007 02:55:15

Salut,

Quelques petites améliorations sur les regex : plutôt que d'en faire je ne sais pas combien dans ton script, tu peux te contenter de n'en faire qu'une.
Je crois comprendre à la lecture de ton code qu'un numéro de série est composée d'une lettre entre L et Z inclus, à l'exception de O, Q et W, suivie de 11 chiffres. Une seule regex suffit pour vérifier la validité du numéro et récupérer la lettre et le numéro :

if (preg_match('`^([^a-koqw])([0-9]{11})`i', $_POST['num'], $matches)) {
  // Numéro syntaxiquement valide
}
else {
  // Numéro invalide !
}

Si le numéro est syntaxiquement correct, $matches est alors un tableau de ce genre :

    * [0]=>S15509500765
    * [1]=>S
    * [2]=>15509500765

$matches[0] est la chaine qui correspond au motif
$matches[1] la lettre, et $matches[2] la série de chiffres.

Déjà, tu économises des perfs (une seule pcre au lieu de 3) et tu gagnes en quantité de code (et donc en lisibilité) : tu n'as plus qu'un seul test qui débouche sur le message d'erreur numéro invalide.

Ensuite, pour la valeur des lettres... Switch n'est pas optimal, puisque le script parcourt toutes les possibilités jusqu'à tomber sur la bonne.

Puisqu'on a utilisé une regex très sévère en terme de filtrage, on sait que la lettre ne peut être qu'une lettre entre L et Z sauf O, Q et W et pas un autre caractère. On peut donc utiliser directement sa valeur ascii :

$pre = ord(strtoupper($matches[1])) - 64;

Ca, c'est fait : une ligne qui te fait économiser 49 lignes de ton switch($letter)

Ensuite, pour concaténer le tout et obtenir un nombre :

$num = (int) ($matches[1] . $matches[2]);

Maintenant, plus qu'à vérifier la validité du numéro :

if ( bcmod($num, "9") == 8)

Ca, c'est beurk. Mettre 9 entre guillemets change son type en chaine de caractères. bcmod, qui opère sur des nombres, va devoir le changer encore en nombre, alors qu'il était déjà dans le bon type.

if (bcmod($num, 9) == 8)

Voilà : 3 lignes au lieu de plusieurs dizaines. T'as gagné tellement de lignes et en lisibilité que tu peux même te permettre d'ajouter des commentaires ^^ Parce que ça manque, et c'est dommage, tu t'es donné la peine de faire un code XHTML 1.0 Transitionnal valide...

Et si tu veux faire encore plus propre, tu peux mettre tout le html à la fin du script, pour bien séparer le traitement de l'affichage.

Encore un dernier détail... Dans un soucis de factorisation (qui consiste à ne pas écrire 2 fois un code identique utilisé à 2 endroits différents) tu peux modifier l'affichage du message final vrai ou faux billet.

Par exemple :

$billet = (bcmod($num, 9) == 8) ? 'vrai' : 'faux';

Utilise une classe pour la mise en forme de ton texte (et pas un h2 qui sert à identifier un titre, et uniquement à cela, et pas à écrire plus gros);

echo '<p id="resultat" class="' . $billet . '">Votre billet est ' . $billet . ' !</p>';

Dans ton css :

p#resultat {
  font-weight: bold;
  background-color: transparent;
}

p.vrai {
  color: green;
}

p.faux {
  color: red;
}

Et là, tu auras un code php performant, élégant, documenté (si tu mets des commentaires ;) ) et séparé du code html.
Quant au html, en plus d'être valide, il sera aussi sémantiquement correct.

Commentaire de kankrelune le 14/12/2007 12:32:01

([^a-koqw])

==>

([a-k^oqw])

sinon c'est marrant pour valider le code d'un billet de banque effectivement... mais ça s'arrête là un billet pouvant bien entendu être faux avec un code valide... .. .

@ tchaOo°

Commentaire de neigedhiver le 14/12/2007 12:43:59

Tu voulais surement dire :
([l-z^oqw])

Les deux regex sont à peu près équivalentes :
http://www.lumadis.be/regex/test_regex.php?lang=fr&pat1=%60^([^a-koqw])([0-9]{11})%60i&pat1typ=preg_match&pat2=%60^([^a-koqw])([0-9]{11})%60i&pat2typ=preg_match&txt=S15509500765&result=Ti

La première est un coup plus rapide, un coup plus lente...

Commentaire de kankrelune le 14/12/2007 12:48:13

Merde j'avais compris l'exception dans le sens inverse... j'ai rien dis... par contre y a quand même un truc qui cloche car tu exclu des caractère sans spécifier quel caractère peut apparaitre... mieux vaut peut être mettre...

([L-Z^OQW])

je rajouterais un $ à la fin pour bien délimiter la chaine que l'on attend... .. .

function validate($num)
{
    if(!empty($num))
    {
        if(preg_match('~^([L-Z^OQW])([0-9]{11})$~i', $num, $matches))
        {
             return (bcmod(
                          (int)str_replace(
                                      $matches[1],
                                      ord(strtoupper($matches[1])) - 64,
                                      $matches[0]), 9) === 8)
        }
    }
    return false;
}

A tester j'ai codé ça en vrac... .. .


@ tchaOo°

Commentaire de neigedhiver le 14/12/2007 12:48:19

Hum... Je sais pas si le lien s'affiche bien, il est peut-être trop long...
Voici : http://www.orphyx.net/shortlink.php?l=1

Commentaire de neigedhiver le 14/12/2007 12:51:01

J'avais effectivement zappé qu'il fallait ^et $ en début et en fin de regex...

Et effectivement, mieux vaut spécifier quels caractères afficher, plutôt que ceux à exclure...

Est-ce que l'excuse de l'heure est valable...  ?

Commentaire de kankrelune le 14/12/2007 12:51:32

le mien est plus rapide et surtout le tien ne fait pas de différence entre 015509500765 et S15509500765... .. . ;)

@ tchaOo°

Commentaire de kankrelune le 14/12/2007 12:52:31

t'inquiète pas... on ne t'en tiendra pas rigueur... .. . ;)

@ tchaOo°

Commentaire de kankrelune le 14/12/2007 13:01:56

Au final après test...

`^([l-npr-vx-z])([0-9]{11})$`i

les deux autre laissent passer des codes invalides... .. .

@ tchaOo°

Commentaire de kankrelune le 14/12/2007 15:39:09

>> Neigedhiver : bcmod prend des chaines de caractères en argument et renvoie une chaine... .. .

function validateSerial($num)
{
    if(!empty($num)|| preg_match('`^([l-npr-vx-z])([0-9]{11})$`i', $num, $matches))
    {
         return (bcmod(
                      str_replace(
                                  $matches[1],
                                  ord(strtoupper($matches[1])) - 64,
                                  $matches[0]), '9') === '8');
    }
    return false;
}

@ tchaOo°

Commentaire de kankrelune le 14/12/2007 15:40:12

Muarf je suis con moi... .. .



function validateSerial($num)
{
    if(!empty($num) && preg_match('`^([l-npr-vx-z])([0-9]{11})$`i', $num, $matches))
    {
         return (bcmod(
                      str_replace(
                                  $matches[1],
                                  ord(strtoupper($matches[1])) - 64,
                                  $matches[0]), '9') === '8');
    }
    return false;
}

@ tchaOo°

Commentaire de The_magicien le 14/12/2007 22:19:08

@ Evangun : Ce code n'est pas difficile à générer singulièrement. Cependant, si on veut entrer dans l'optique d'un faussaire il veut faire beaucoup d'argent donc si on veut générer des milliers, des millions de numéros de série, ça prend beaucoup plus de temps et c'est plus simple de mettre des numéros complètement aléatoires.

@ Kankrelune et Neigedhiver : Je ne sais pas si je vais faire les modifications parce que sinon, ce ne sera plus le code que moi j'ai fait donc c'est également par respect pour ce que vous m'avez proposé, je ne voudrais pas m'approprier le travail des autres.

Merci pour ces commentaires.

Commentaire de neigedhiver le 16/12/2007 15:43:20

@Kankrelune : Bravo pour le monologue, j'aurais pas fait mieux.

@The_Magicien : Ben si on poste en commentaire, c'est pour que tu puisses bénéficier des améliorations qu'on propose. Tu ne t'appropries pas notre travail, on te le donne. C'est pas pareil.

Et puis même si tu considères que ce n'est pas toi qui a écrit ce code, il l'a été en tout cas à ton initiative : il ne me serait pas venu à l'idée de me renseigner sur la manière dont vérifier un numéro de série d'un billet Euro, de même qu'il ne me serait pas venu à l'idée non plus d'écrire un code pour le vérifier.
Les commentaires avaient donc pour but de te montrer comment faire plus simple, plus efficace et plus élégant (en plus, là, t'as directement une fonction utilisable dans n'importe quelle application). Ils avaient aussi pour vocation de le montrer à tout le monde.

Tu peux donc sans scrupule l'utiliser. Si tu ne veux pas le mettre à la place de ton code, ce que je peux comprendre, tu peux le mettre à la suite ;)
Mais je t'en prie... On se fout de droits d'auteurs sur des commentaires sur une source ^^

Commentaire de The_magicien le 22/12/2007 13:24:44

Modifications effectuées ;)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Vérification URL [ par guiguimac ] bonjour,est-ce que qq'un aurait un script PHP qui regarde si une URL fonctionne ou pas ?merci d'avance !guiguimac *** vérification cookie *** [ par kodiask ] bjr jr voudrai faire un anti-flood avec cookie et g un problème voila, alor g mon livre dd'or kan jenvoi un message je veu ke ca créer un cookie. et Vérification de liens morts côté serveur [ par repier77 ] BonjourNous devons mettre en place un outil de gestion de contenu open source typetikiwiki ou PHP nuke pour un portail d'information sur des news dive questionnaire avec vérification des réponses et redirection URL [ par lodie7 ] Je suis débutante en php et je dois créer un questionnaire pour des enfants, suivant si ils ont bien répondu ou non, ils sont redirigés vers une page Vérification de mot de passe [ par xtz ] Bonjour/bonsoir,j'essaye de faire une fonction qui pourrait vérifier qu'un mot de passe soit d'au moins 8 caractères au total, et contienne au moins 2 Bibliotheque GD2 et symbole Euro [ par _benjy ] Bonjour, un petit problème avec la bibliotèque GD2, je n'arrive pas à ecrire le symbole euro (¤), et même le plus (+), avec la function imagettftext, vérification de chaines de caractères [ par Rankin ] Bonjour &#224; tous, Bon mon probl&#232;me n'est pas original mais malgr&#233; les r&#233;ponses que j'ai trouv&#233;es sur ce forum, je n'arrive pas vérification de champ d'un formulaire [ par cobrachris ] j'ai lu plusieur post mais j'ai pas vraiment trouver.Voila je vous explique rapidement.J'aimerais cr&#233;er unformulaire pour enregistrer des lieux e Vérification des données avec PHP [ par nino69 ] Bonjour,Je cherche &#224; tester si le champ, par exemple log, n'est pas vide:if ($_POST["newlog"] !=""){........}Jusqu'&#224; l&#224; pas de probl&#2 vérification de formulaire [ par nino69 ] Bonjour, j'ai cr&eacute;e un formulaire et une v&eacute;rification en PHP. Si l'un des champs est mal rempli, le code PHP envoye un message &agrave; l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,312 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales