mirror of
https://gitlab.com/harald.mueller/aktuelle.kurse.git
synced 2024-10-19 18:05:02 +02:00
105 lines
5.2 KiB
Plaintext
105 lines
5.2 KiB
Plaintext
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ö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äre es nicht schön, wenn alle Checkboxenwerte in einer Spalte gespeichert werden
|
|
könnte?
|
|
|
|
Dieses Beispiel zeigt wie es geht.
|
|
Checkboxen können nur zwei Zustände annehmen und sind daher entweder
|
|
aktiviert( TRUE bzw. 1 ) oder deaktiviert( FALSE bzw. 0 ). Dieses Merkmal findet
|
|
man auch in der Binärdarstellung wieder und kann daher zur Verwendung für diese
|
|
Technik herangezogen werden. Binä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ärwert aus und würde bei der Konvertierung
|
|
in eine Dezimalzahl auch ein Ergebnis liefern.
|
|
Um aber die Checkboxen auch in eine binäre Art zu bekommen, ist ein kleiner
|
|
Umstrukturierungsvorgang von Nöten. Binärwerte werden grundsä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ärwert einfach umdrehen und genau das erledigt das Skript von selbst,
|
|
da die Werte bereits von rechts her bestückt werden. In unserem kleinen Beispiel wäre nun der
|
|
Binärwert 10011. Diesen Binärwert in eine Dezimalzahl konvertiert, ergibt 19.
|
|
Die Zahl 19 ist jetzt der Wert, der auch in die Datenbank gespeichert wird. Er enthält alle
|
|
Informationen über die Aktivierungsart aller Checkboxen, da beim Aufbau der Checkboxen die
|
|
Zahl 19 wieder in ein Binä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
|
|
ü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önnen. Zur Erinnerung, nichtaktivierte Checkboxen werden nicht ü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äufen die Checkboxen von links, während die Binä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ärwert
|
|
mit der Anordnung 00 auch als Dezimalzahl 0 ergeben würde.
|
|
|
|
2.Durchlauf:
|
|
Checkbox2 ist aktiviert und somit 1.
|
|
Unser Binärwert wird nun von der rechten Seite her verändert.
|
|
Die 2.Stelle des Binärwertes wird auf 1 gesetzt.
|
|
Der Wert ist nun 10
|
|
|
|
3.Durchlauf:
|
|
Checkbox3 ist aktiviert und somit 1.
|
|
Unser Binärwert wird nun von der rechten Seite her verändert.
|
|
Die 3.Stelle des Binä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ärwert wird nun von der rechten Seite her verändert.
|
|
Die 6.Stelle des Binärwertes wird auf 1 gesetzt. Somit erhä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ü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. |