Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Anleitung Entwicklung PHP

Mitglied: Guenni

Guenni (Level 2) - Jetzt verbinden

26.12.2008, aktualisiert 02.09.2011, 10393 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.
 
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Netzwerkprotokolle
gelöst Einsatz von VLAN-IDs - kein Gateway erkannt (5)

Frage von honeybee zum Thema Netzwerkprotokolle ...

Microsoft Office
Word Dokument (vorausgefüllte Formulare) aus Excel Tabelle generieren (1)

Frage von Server4Alle zum Thema Microsoft Office ...

CSS
gelöst CSS width in Outlook 2013 bei Tabellen ohne Funtion, warum? (3)

Frage von Pago159 zum Thema CSS ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...