aktuelle.kurse/oldies/m133/4_Modulinhalte_und_Uebungen/00-Anwendungen-Beispiele-Uebungen/PHP_Referenz/tipps_tricks/formulare/checkboxen_binaer_erklaerung.txt

105 lines
5.2 KiB
Plaintext
Raw Normal View History

2022-03-17 11:19:26 +01:00
Wie speichert man z.B. 32 Checkboxen in einer Datenbank?
Diese Frage stellt sich sehr oft bei der Programmierung und sicherlich gibt es da
verschiedene Ansatzm<7A>glichkeiten. So k<>nnte die Tabelle, in der die Werte f<>r die
Checkboxen ( 1 oder 0, bzw. TRUE oder FALSE ) gespeichert werden, in 32 Spalten
aufgeteilt werden. Dieses Technik ist aber eher die schlechteste Wahl, da die Tabelle
sehr schnell zu einem Giganten anwachsen w<>rde.
W<EFBFBD>re es nicht sch<63>n, wenn alle Checkboxenwerte in einer Spalte gespeichert werden
k<EFBFBD>nnte?
Dieses Beispiel zeigt wie es geht.
Checkboxen k<>nnen nur zwei Zust<73>nde annehmen und sind daher entweder
aktiviert( TRUE bzw. 1 ) oder deaktiviert( FALSE bzw. 0 ). Dieses Merkmal findet
man auch in der Bin<69>rdarstellung wieder und kann daher zur Verwendung f<>r diese
Technik herangezogen werden. Bin<69>rwerte werden nur durch die zwei Zahlen 1 und 0
dargestellt.
Hat man z.B. 5 Checkboxen, von denen die erste, die zweite und die f<>nfte Checkbox
aktiviert ist, so kann man dies auch mit folgender Schreibweise darstellen - 11001.
Diese Darstellung sieht genau wie ein Bin<69>rwert aus und w<>rde bei der Konvertierung
in eine Dezimalzahl auch ein Ergebnis liefern.
Um aber die Checkboxen auch in eine bin<69>re Art zu bekommen, ist ein kleiner
Umstrukturierungsvorgang von N<>ten. Bin<69>rwerte werden grunds<64>tzlich von rechts her
aufgebaut (was auch Sinn macht, da man f<>r 0000000000001 auch direkt 1 schreiben k<>nnte),
die Checkboxen aber von links bzw. von oben.
Daher muss man den Bin<69>rwert einfach umdrehen und genau das erledigt das Skript von selbst,
da die Werte bereits von rechts her best<73>ckt werden. In unserem kleinen Beispiel w<>re nun der
Bin<EFBFBD>rwert 10011. Diesen Bin<69>rwert in eine Dezimalzahl konvertiert, ergibt 19.
Die Zahl 19 ist jetzt der Wert, der auch in die Datenbank gespeichert wird. Er enth<74>lt alle
Informationen <20>ber die Aktivierungsart aller Checkboxen, da beim Aufbau der Checkboxen die
Zahl 19 wieder in ein Bin<69>rwert konvertiert wird ( 10011 ).
Allerdings m<>ssen im Vorfeld die Checkboxen ein wenig angepasst werden.
1.) Die Checkboxen erhalten alle den gleichen Namen und werden somit als Array
<EFBFBD>bermittelt. In unserem Fall heissen die Checkboxen alle checkbox_name[] (wichtig
sind hier die eckigen Klammern, da nur so ein Array aufgebaut wird).
Somit kann man hier auch von einer Gruppe sprechen.
2.) Alle Checkboxen werden im Value-Wert durchnummeriert (1- max.32). Dieses ist
ein wichtiger Punkt, da nur so die richtigen Checkboxen aktiviert oder deaktiviert werden
k<EFBFBD>nnen. Zur Erinnerung, nichtaktivierte Checkboxen werden nicht <20>bermittelt. Auch wenn
Sie 32 Checkboxen haben und nur 16 aktivieren, so erhalten wir beim Absenden auch nur
ein Array mit 16 Elementen. Da wir aber als Value-Wert die "Position" gespeichert haben,
ist es ein leichtes die n<>tigen Felder zu initialisieren.
3.) Die Spalte f<>r die Speicherung des Wertes in der Datenbank muss auf Integer
eingestellt werden.
Beispiel:
Bei der Initialisierung unserer Variablen, setzen wir den Startwert auf 0. Wird nun das
untenstehende Beispiel abgeschickt, so passiert folgendes. Bitte beachten Sie aber,
das bei den Durchl<68>ufen die Checkboxen von links, w<>hrend die Bin<69>rwerte von rechts
gelesen werden.
----------------------------------------------------------------------------------------------
| 0 | 1 | 1 | 0 | 0 | 1 |
|----------------------------------------------------------------------------------------------
|Checkbox1 - - | Checkbox2 -X- | Checkbox3 -X- | Checkbox4 - - | Checkbox5 - - | Checkbox6 -X- |
----------------------------------------------------------------------------------------------
1.Durchlauf:
Checkbox1 ist deaktiviert und somit 0.
In diesem Fall bleibt unser Wert bei 0, da der Startwert ja schon 0 war und ein Bin<69>rwert
mit der Anordnung 00 auch als Dezimalzahl 0 ergeben w<>rde.
2.Durchlauf:
Checkbox2 ist aktiviert und somit 1.
Unser Bin<69>rwert wird nun von der rechten Seite her ver<65>ndert.
Die 2.Stelle des Bin<69>rwertes wird auf 1 gesetzt.
Der Wert ist nun 10
3.Durchlauf:
Checkbox3 ist aktiviert und somit 1.
Unser Bin<69>rwert wird nun von der rechten Seite her ver<65>ndert.
Die 3.Stelle des Bin<69>rwertes wird auf 1 gesetzt.
Der Wert ist nun 110
4.Durchlauf:
Checkbox4 ist deaktiviert und somit 0.
In diesem Fall bleibt unser Wert bei 110.
5.Durchlauf:
Checkbox5 ist deaktiviert und somit 0.
In diesem Fall bleibt unser Wert bei 110.
6.Durchlauf:
Checkbox6 ist aktiviert und somit 1.
Unser Bin<69>rwert wird nun von der rechten Seite her ver<65>ndert.
Die 6.Stelle des Bin<69>rwertes wird auf 1 gesetzt. Somit erh<72>lt
auch nun die 4. und 5.Stelle Ihren Wert, jeweils die 0.
Der Wert ist nun 100110
Den Wert 100110 lassen wir uns nun mit der Funktion bindec() als Dezimalzahl ausgeben
und erhalten als Ergebnis die Zahl 38. Diese Zahl speichern wir nun in unsere Tabelle ab.
Das war es schon!
Wir haben nun eine schlanke L<>sung f<>r ein grosses Problem. In Zukunft
wird unser Skript nur noch mit der einzelnen dezimalen Zahl arbeiten um die Checkboxen
zu best<73>cken.
Achtung!
Einen kleinen Haken gibt es aber. Wir k<>nnen mit dieser Methode nur max. 32 Checkboxen
verwalten, da wir bei dieser Zahl an die Grenze eines Integer-Wert gehen.
Gruppen k<>nnen aber in rauhen Mengen erstellt werden.