Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Tabellen IDs validieren und generieren mit dem MODULO10-Verfahren

Mitglied: Guenni

Guenni (Level 2) - Jetzt verbinden

26.12.2008, aktualisiert 02.09.2011, 10556 Aufrufe

Nahezu jede Datenbank bietet eine Funktion, die beim Anlegen eines Datensatzes
einen numerischen Schlüssel generiert, der automatisch inkrementiert wird.

Für einige Fälle mag dies ausreichend sein, aber es ergeben sich auch Nachteile, wenn
man sich dieser Funktion bedienen und Artikelnummern, Kontonummern etc. einfach
nur hochzählen und ohne validieren auf Gültigkeit verwenden würde.

Durch Tippfehler werden falsche Artikel ausgewählt oder Gelder werden auf falsche
Konten überwiesen, was beides wieder Aufwand und Kosten nach sich zieht, um Fehler
zu korrigieren.

Statt dessen kann man sich verschiedener Verfahren bedienen, neue ID's zu generieren
und mit einer Prüfziffer zu versehen, bzw. eine ID zu validieren.
Eines davon ist das MODULO10-Verfahren – Gewichtung 2,1,2,1,2,1,2,1,2.

ID validieren

Gegeben sei z.B. eine 10stellige ID: 0059735878, wobei die führenden Nullen entfallen können.
Die letzte Ziffer, die erwartete Prüfziffer, wird abgeschnitten.
Die Ziffern der verbleibenden ID, 005973587, werden nun von rechts nach links
abwechselnd mit 2,1,2,1,2 (Gewichtung) usw. multipliziert.
Ergebnis: 0 0 10 9 14 3 10 8 14
Die Quersummen der Produkte werden addiert: 0 + 0 + 1 + 9 + 5 + 3 + 1 + 8 + 5 = 32
Dann wird der Rest der Division durch 10 gebildet = 2
Das Ergebnis wird von 10 abgezogen = 8
Das Ergebnis modulo 10 ist die erwartete Prüfziffer.
Die letzte Modulo-Operation ist für den Fall, dass das Ergebnis der Subtraktion 10 ist. Dann
wird aus der 10 eine Null.

Neue ID's generieren

Genauso lassen sich neue ID's generieren. Angenommen, die oben verwendete ID sei die
zuletzt generierte. Die Prüfziffer wird abgeschnitten, der Rest wird um einen beliebigen Wert,
z.B. 1, erhöht: 5973587 + 1 = 5973588. Es kann auch jeder andere Wert aufaddiert werden.
Jetzt wird die Prüfziffer berechnet. Zuerst die Ziffern von rechts nach links wechselweise
mit 2,1,2,1 (Gewichtung) usw. multiplizieren, ergibt: 10 9 14 3 10 8 16
Dann Addition der Quersummen: 1 + 9 + 5 + 3 + 1 + 8 + 7 = 34
Rest der Division durch 10 = 4
Das Ergebnis von 10 abziehen = 6
Ergebnis modulo 10 ist die Prüfziffer, die nun an die neue Artikelnummer angehangen wird.
Die letzte Modulo-Operation ist für den Fall, dass das Ergebnis der Subtraktion 10 ist. Dann
wird aus der 10 eine Null.

Zum Testen ein PHP-Script:

Zum Testen werden mit dem Script einige ID's generiert. Anschließend kann man die ID's
mit Tippfehler in ein Textfeld eingeben und prüfen. Das habe ich jetzt mehrere Tage probiert
und nicht einmal habe ich per Zufall einen Tippfehler "eingebaut", der eine gültige Prüfziffer
produziert. Alles in allem also eine ziemlich sichere Methode, ID's zu generieren bzw.
zu validieren.

Gruß
Günni

01.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
02.
<html> 
03.
<head> 
04.
<title>Untitled</title> 
05.
</head> 
06.
<script type="text/javascript"
07.
<!-- 
08.
/* 
09.
* Vor dem Laden wird durch eine Funktion eine neue Nummer generiert, die in einem Textfeld angezeigt wird. 
10.
* Damit diese nicht verändert werden kann, wird das Textfeld beim Laden der Seite "gesperrt"
11.
*/ 
12.
function lock_field(){ 
13.
 document.frmFormular.art_nr.disabled=true; 
14.
15.
/* 
16.
* Da gesperrte Textfelder nicht gesendet werden, muß die Sperrung wieder aufgehoben werden. In der Formulardeklaration 
17.
* wird deshalb folg. Funktion beim Senden aufgerufen. 
18.
*/ 
19.
function unlock_field(){ 
20.
 document.frmFormular.art_nr.disabled=false; 
21.
22.
// --> 
23.
</script> 
24.
<body onload="lock_field()"
25.
<? 
26.
//********************************************
27.
// Datenbankverbindung aufbauen 
28.
//********************************************
29.
include('net-comm/inc/session.inc.php'); 
30.
/* 
31.
Die folg. Funktion gibt 1 zurück, wenn der Parameter 2 ist, 
32.
bzw. gibt 2 zurück, wenn der Parameter 1 ist 
33.
*/ 
34.
function swap($arg){ 
35.
 if($arg==2) return 1; 
36.
 if($arg==1) return 2; 
37.
38.
/* 
39.
Die folg. Funktion gibt die Quersumme eines Arguments zurück. 
40.
Da nur zweistellige Zahlen übergeben werden, reicht es, zu prüfen, 
41.
ob das Argument größer 9 ist. 
42.
*/ 
43.
function quer_sum($arg){ 
44.
 if($arg>9){ 
45.
  $r=$arg-10; 
46.
	$r+=1; 
47.
	return $r
48.
 }else
49.
 			 return $arg
50.
51.
52.
 
53.
/* 
54.
Die folg. Funktion generiert eine neue Artikelnummer 
55.
*/ 
56.
function neue_art_nr(){ 
57.
 /* 
58.
 Zuerst wird die letzte(größte) Artikelnummer abgefragt 
59.
 Der Datentyp der Artikelnummer ist varchar(10) 
60.
 */ 
61.
 $query="select max(artnr) as Art_Nr from tabelle1"
62.
 $result=mysql_query($query); 
63.
 $row=mysql_fetch_array($result,MYSQL_ASSOC); 
64.
 /* 
65.
 Die letzte Stelle der Artikelnummer ist die Prüfziffer. 
66.
 Da die Artikelnummer als Zeichenkette vorliegt, kann die 
67.
 Prüfziffer einfach mittels einer Funktion abgeschnitten werden. 
68.
 */ 
69.
 $row['Art_Nr']=substr($row['Art_Nr'],0,-1); 
70.
 /* 
71.
 Um nun eine neue Artikelnummer generieren zu können, wird  
72.
 der String in einen INT-Wert konvertiert und in einer Variablen abgelegt. 
73.
 */ 
74.
 $int_row=intval($row['Art_Nr']); 
75.
 /* 
76.
 Artikelnummer wird um einen beliebigen Wert inkrementiert. 
77.
 */ 
78.
 $int_row+=3; 
79.
 /* 
80.
 Um auf einzelne Stellen der Artikelnummer zu weiteren Berechnungen 
81.
 zugreifen zu können, wird die Artikelnummer wieder in einen String 
82.
 konvertiert 
83.
 */ 
84.
 $str_row=strval($int_row); 
85.
 /* 
86.
 Die einzelnen Stellen der Artikelnummer werden von rechts nach links 
87.
 abwechselnd mit 2,1,2,1,2,1 usw. multipliziert. 
88.
 Dazu wird ein Multiplikator $m mit 2 initialisiert, und innerhalb der 
89.
 for-Schleife durch die Funktion swap(s.o.) abwechselnd auf 1 oder 2 gesetzt. 
90.
 Die Produkte werden als Zeichenkette in einer Variablen gespeichert. 
91.
 */ 
92.
 $m=2; 
93.
 $str_row2=""
94.
 for($i=strlen($str_row)-1;$i>=0;$i--){ 
95.
  $str_row2.=strval($str_row[$i]*$m); 
96.
	$m=swap($m); 
97.
98.
 /* 
99.
 Aus den Produkten der Multipikationen werden die Quersummen gebildet. 
100.
 Diese Summen werden in der Variablen $sum_pro aufaddiert. 
101.
 */ 
102.
 $sum_pro=0; 
103.
 for($i=0;$i<strlen($str_row2);$i++){ 
104.
  $sum_pro+=quer_sum($str_row2[$i]); 
105.
106.
 /* 
107.
 Die Variable $sum_pro bekommt das Ergebnis $sum_pro modulo 10 zugewiesen. 
108.
 */ 
109.
 $sum_pro=$sum_pro%10; 
110.
 /* 
111.
 Die Variable $sum_pro bekommt das Ergebnis 10-$sum_pro zugewiesen 
112.
 */ 
113.
 $sum_pro=10-$sum_pro
114.
 /* 
115.
Für den Fall, dass das Ergebnis der Subtraktion 10 ist, bekommt die 
116.
Variable Ergebnis modulo 10 zugeweisen. Dann ist die Prüfziffer 0.  
117.
*/ 
118.
 $sum_pro=$sum_pro%10; 
119.
 /* 
120.
 Das Ergebnis, die Prüfziffer der neuen Artikelnummer, wird an die neue  
121.
 Artikelnummer angehangen. 
122.
 */ 
123.
 $str_row.=$sum_pro
124.
 /* 
125.
 Rückgabe der neuen Artikelnummer. 
126.
 */ 
127.
 return $str_row
128.
129.
/* 
130.
Die folg. Funktion errechnet aus einer Artikelnummer die zu erwartende 
131.
Prüfziffer. Die Artikelnummer wird ohne Prüfziffer übergeben. 
132.
Die Funktion verwendet die gleichen Algorithmen, wie oben. 
133.
*/ 
134.
function pruefziffer($art_nr){ 
135.
 $m=2; 
136.
 $str_row2=""
137.
 for($i=strlen($art_nr)-1;$i>=0;$i--){ 
138.
  $str_row2.=strval($art_nr[$i]*$m); 
139.
	$m=swap($m); 
140.
141.
 $sum_pro=0; 
142.
 for($i=0;$i<strlen($str_row2);$i++){ 
143.
  $sum_pro+=quer_sum($str_row2[$i]); 
144.
145.
 $sum_pro=$sum_pro%10; 
146.
 $sum_pro=10-$sum_pro
147.
 $sum_pro=$sum_pro%10; 
148.
 return $sum_pro
149.
150.
/* 
151.
Der nachfolg. Code trägt die neue Artikelnummer in die Datenbank ein, 
152.
nachdem das Formular gesendet wurde. 
153.
*/ 
154.
if(isset($_POST['cmd'])){ 
155.
 $cmd=$_POST['cmd']; 
156.
 if($cmd=="Anlegen"){ 
157.
  $art_nr=$_POST['art_nr']; 
158.
  $query="insert into tabelle1(artnr) values('$art_nr')"
159.
	mysql_query($query); 
160.
	?> 
161.
	<script type="text/javascript"
162.
<!-- 
163.
window.location.href='a_modulo10.php'; 
164.
// --> 
165.
</script> 
166.
	<? 
167.
168.
/* 
169.
Der nachfolg. Code berechnet die Gültigkeit einer Artikelnummer. 
170.
Die Nummer wird ohne die Prüfziffer an eine Funktion übergeben. 
171.
*/ 
172.
 if($cmd=="Suchen"){ 
173.
  $suche_art_nr=$_POST['suche_art_nr']; 
174.
	if(strlen(trim($suche_art_nr))==0){ 
175.
	 echo "Bitte eine Nummer eingeben"
176.
	 echo "<a href='#' onclick='history.back()'> Zurück </a>"
177.
	 exit
178.
179.
	$pruefziffer=substr($suche_art_nr,-1); 
180.
	$art_nr_ohne_pz=substr($suche_art_nr,0,-1); 
181.
	echo "Gesuchte Artikelnummer: ".$suche_art_nr."<br>"
182.
	echo "Prüfziffer: ".$pruefziffer."<br>"
183.
	if(!($pruefziffer==pruefziffer($art_nr_ohne_pz))){ 
184.
	 echo "Die Prüfziffer $pruefziffer ist falsch!<br>"
185.
	 echo "Erwartete Prüfziffer: ".pruefziffer($art_nr_ohne_pz).".<br>"
186.
	 echo "Eine Datenbankabfrage wird nicht durchgeführt.<br><br>"
187.
	}else
188.
				echo "Die Prüfziffer $pruefziffer ist richtig!<br>"
189.
				echo "Eine Datenbankabfrage wird durchgeführt.<br><br>"
190.
191.
192.
193.
/* 
194.
Das nachfolgende Formular enthält ein Textfeld mit einer gültigen Artikelnummer und  
195.
eine Schaltfläche "Anlegen".  
196.
Nach dem Senden wird die angezeigte Artikelnummer in die DB eingetragen, und die nächste, 
197.
gültige Artikelnummer wird angezeigt. 
198.
Im leeren Textfeld kann eine Nummer eingegeben und geprüft werden. 
199.
*/ 
200.
?> 
201.
<form action="a_modulo10.php" method="post" name="frmFormular" onsubmit="unlock_field()"
202.
<input type="text" value="<? echo neue_art_nr(); ?>" name="art_nr" /> 
203.
<input type="submit" name="cmd" value="Anlegen"/><br> 
204.
<input type="text" name="suche_art_nr" /> 
205.
<input type="submit" name="cmd" value="Suchen"/><br> 
206.
</form> 
207.
</body> 
208.
</html> 
209.
 
Ähnliche Inhalte
Basic

Visual Basic Script (VBS): HTML-Tabelle generieren

Tipp von GurkenhobelBasic3 Kommentare

Für all jene, die schnell mal eine simple HTML-Tabelle benötigen, ist das folgende Skript gedacht. Der Name der fertigen ...

Windows Server

Teamviewer-IDs von angemeldeten Benutzern auslesen

Tipp von BirdyBWindows Server10 Kommentare

Auch wenn es im Allgemeinen verpönt ist, nutzen wir derzeit noch den Teamviewer für den Remotesupport. Unter Anderem läuft ...

PHP

Matheaufgaben generieren für Kinder

Anleitung von GuenniPHP3 Kommentare

Dieser Generator erstellt Aufgaben der vier Grundrechenarten "plus, minus, mal, geteilt". Es werden nur einfache Aufgaben generiert, keine kombinierten ...

Verschlüsselung & Zertifikate

Powershell: StartSSL StartAPI für das automatisierte Validieren und Anfordern von SSL-Zertifikaten verwenden

Anleitung von colinardoVerschlüsselung & Zertifikate

WICHTIGER HINWEIS: StartCom und WoSign Zertifikate werden seit einiger Zeit von den großen Betriebsystemen und Browsern nicht mehr als ...

Neue Wissensbeiträge
Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 1 TagWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 1 TagSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Datenschutz

Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10

Information von Penny.Cilin vor 2 TagenDatenschutz8 Kommentare

Hallo, passend zum Thema Ablösung LIMUX in München ein Beitrag bei Heise (siehe Link folgend). Behörden ignorieren Sicherheitsbedenken gegenüber ...

Sicherheit
Information Security Hub Munich airport
Information von brammer vor 2 TagenSicherheit

Hallo, Neues Center für Cyber Kriminalität am Münchener Flughafen brammer

Heiß diskutierte Inhalte
DSL, VDSL
Mindestgeschwindigkeiten DSL Telekom
Frage von justlukasDSL, VDSL13 Kommentare

Hallo zusammen, Seit diesem Jahr habe ich Verständnisprobleme mit dem Verhalten der Telekom. Wir haben seit einem Jahr VDSL ...

Switche und Hubs
LANCOM-Switch: Probleme (no link) mit SFP-Modulen?
Frage von THETOBSwitche und Hubs10 Kommentare

Hi zusammen, ich habe folgendes Problem: Und zwar habe ich an einem Standort drei Switche verbaut - LANCOM GS-2326P+, ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall10 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)8 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...