SELFPHP

Komfortable Checkboxen-Verwaltung mittels Binärwerte



Informationsseite

nach unten Autor
nach unten Beispiel
nach unten Beschreibung
nach unten Fazit
nach unten Download

nach unten 

Autor

Name: Damir Enseleit
Email: mail@selfphp3.de
Website: http://www.selfphp.info

 

nach obennach unten 

Beispiel

Anzeigebeispiel: So sieht's aus (Online)

<?PHP

function setBit(&$bitField,$n) {
    
    
// Ueberprueft, ob der Wert zwischen 0-33 liegt
    // $n ist hier der Wert der aktivierten Checkbox, z.B. 15
    // Somit waere hier die 15. Checkbox aktiviert
    
if(($n 0) or ($n 32)) return false
    
    
    
// Bit Shifting
    // Hier wird nun der Binaerwert fuer die aktuelle Checkbox gesetzt.
    // In unserem Beispiel wird hier nun die 15. Stelle von rechts auf 1 gesetzt
    // 100000000000000 <-- Dieses entspricht der Zahl 16384
    // | ist nicht das logische ODER sondern das BIT-oder
    
$bitField |= (0x01 << ($n-1));
    return 
true;
    
}

function 
clearBit(&$bitField,$n) {
    
    
// Loescht ein Bit oder ein Bitfeld
    // & ist nicht das logische UND sondern das BIT-and
    
$bitField &= ~(0x01 << ($n-1));
    return 
true;
    
}

function 
isBit($bitField,$n) {
    
    
// Ist die x-te Stelle eine 1?
    
return (($bitField & (0x01 << ($n-1))));
    
}

/*
* Die Menge der Checkboxen sollten hier angegeben werden
*/
if( $_POST["checkboxen"] < || $_POST["checkboxen"] > 32)
    
$checkboxen 32;
else
    
$checkboxen $_POST["checkboxen"];


/*
* Hier sollte der Wert aus einer Datenbank geholt werden
* Dies sollte aber nur beim ersten Aufruf geschehen
*/

if( !isset($_POST["checkbox_name"]) && !is_array($_POST["checkbox_name"]) && !isset($_POST["CheckboxenBinaer"]) ){
    
// Select der Datenbankabfrage hier einfuegen und den Wert
    // in $wertAbfrage speichern
    
$wertAbfrage 0;
    
    
// Ueberpruefung ob ein Wert vorhanden ist
    
if( !empty($wertAbfrage) )
        
$bitmask $wertAbfrage;
    else
        
$bitmask 0x0;
        
    
// Durchlaeuft schrittweise alle Elemente von $bitmask.
    
foreach(range(1,$checkboxen) as $position){
        
        
// Ueberprueft, ob die x-te Stelle eine 1 ist und speichert bei Erfolg
        // ein "checked" in das Arrayelement fuer die x-te Position.
        // Beispiel: $position ist 6. Nun wird die 6.Stelle von rechts innerhalb
        // der Variablen $bitmask auf eine 1 hin ueberprueft. Steht an dieser Stelle
        // eine 1, so wird in $formCheck[6] ein "checked" gespeichert.
        // Somit wird die sechste Checkbox aktiviert.
        
if(isBit($bitmask,$position)) {
            
$formCheck[$position] = " checked";
        }
        
    }
    
}
else{
    
    
// Das Formular wurde versendet und die Checkboxen muessen
    // nun konvertiert werden.
    
    // Wurde ueberhaupt eine Checkbox aktiviert?
    
If( isset($_POST["checkbox_name"]) ){    
        
        foreach(
$_POST["checkbox_name"] as $position){ 
        
            
// Setzen der einzelnen Checkboxen in der Binaerstruktur
            
setBit($bitmask,$position);
            
            
// Ist die Checkbox aktiviert?
            
if(isBit($bitmask,$position)) {
                
$formCheck[$position] = " checked";
            }
        
        }
                    
    }
    
    
// Hier kann nun auch der Wert wieder in die Datenbank geschrieben werden
        
$neuerWert $bitmask;
        
}

?>

<form name="form" method="post" action="<?PHP echo $PHP_SELF?>">
<?PHP
    
echo 'Der Dezimalwert für diese Anordnung ist: <b>' $bitmask '</b><br>';
    echo 
'Der Binärwert für diese Anordnung ist: <b>' decbin($bitmask) . '</b><br>';
    for(
$x=1;$x<=$checkboxen;$x++){
?>

<input type="checkbox" name="checkbox_name[]" value="<?PHP echo $x?><?PHP echo $formCheck[$x]; ?>>

<?PHP
    
}
?>
  <br>Menge der Checkboxen <input type="text" name="checkboxen" value="<?PHP echo $_POST["checkboxen"]; ?>">
  <br><input type="submit" name="CheckboxenBinaer" value="Send"><br>
</form>

 

nach obennach unten 

Beschreibung

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 Checkbox3 Checkbox4 Checkbox5 Checkbox6


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.



 

nach obennach unten 

Fazit

Das vorgestellte Beispiel soll nur als Denkanstoss dienen und aufzeigen, welche Möglichkeiten
die Arbeit mit Binärwerten bereitstellt. Sie können das Beispiel erweitern oder modifizieren um
die Technik für sich zu verfeinern und an Ihre Bedürfnisse anzupassen.

 

nach obennach unten 

Download

Der Download beeinhaltet folgende Dateien:
  • checkboxen_binaer_beispiel.php
  • checkboxen_binaer_erklaerung.txt
  • README.TXT
Download starten

 

nach oben
weiter:weiter Seite
zurück:zurück Seite Formulare
 

© 2001, 2002, 2003, 2004, 2005 E-Mail Damir Enseleit, mail@selfphp.de