Andü: Menge von Boolean-Variablen in einem Wert speichern

Hallo!

Ich würde gern eine Menge von Boolean-Variablen in einem Wert speichern, sprich so, dass in einer Datenbank nur eine Spalte verwendet wird.

Bei den Datei-Rechten auf Web-Server wird das beispielsweise auch so gemacht - ich weiß aber nicht wie diese Methode heißt.

Sie baut auf der Potenz von 2 auf und addiert diese dann...

Beispiel:
A=1 B=1 C=1 --> 1+2+4 --> 7 speichern
A=1 B=0 C=1 --> 1+4   --> 5 speichern
A=0 B=1 C=1 --> 2+4   --> 6 speichern

Wie nennt man diese Methode? ...und wie kann man das sinnvoll verwalten, also aus dem gespeicherten Wert die einzelnen Booleans wieder zurück bekommen?

Gruß Andü

  1. hi,

    Ich würde gern eine Menge von Boolean-Variablen in einem Wert speichern, sprich so, dass in einer Datenbank nur eine Spalte verwendet wird. [...]
    Wie nennt man diese Methode?

    Unser zahlensystem, dass mit zehn Ziffern arbeitet, nennt sich Dezimalsystem.
    Und wie heißt das System, welches nur zwei "Ziffern" kennt ...?

    und wie kann man das sinnvoll verwalten, also aus dem gespeicherten Wert die einzelnen Booleans wieder zurück bekommen?

    Das kommt wohl darauf an, wo du das machen willst - im PHP-Script, oder DB-seitig.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Unser zahlensystem, dass mit zehn Ziffern arbeitet, nennt sich Dezimalsystem.
      Und wie heißt das System, welches nur zwei "Ziffern" kennt ...?

      Ist mir schon bewusst, dass das Binär heißt - aber die Variablen, welche nur 0 und 1 haben heißen eben Boolean.

      Das kommt wohl darauf an, wo du das machen willst - im PHP-Script, oder DB-seitig.

      Verarbeiten will ich das PHP-mäßig. Wo und wie ich dass dann speicher ist ja völlig egal!

      Um es anders auszudrücken:
      Ich will eine Funktion welche mir diese summierten Zweierpotenzen aus meinen angegebenen Werten addiert und eine, welche das wieder rückwärts macht.
      Quasi geb ich die gespeicherte Zahl in die Funktion ein und die sagt mir ob speziell Boolean-Variable 3 (oder halt auch 10) FALSE oder TRUE ist.

      Wie das Prinzipiell funktioniert weiß ich, aber ich tu mich schwer damit eine Funktion/Algorithmus zu finden, welcher mir das übernimmt.

      PS: Vielleicht ist es noch sinnvoll mit zu erwähnen, dass ich eben damit Rechte für ein BlogSystem verwalten will und mir nicht 30 SQL-Spalten für 30 verschiedene Zugriffsrechte (welche ja jeweils nur FALSE oder TRUE sein können) anlegen will.

      1. echo $begrüßung;

        Ich will eine Funktion welche mir diese summierten Zweierpotenzen aus meinen angegebenen Werten addiert und eine, welche das wieder rückwärts macht.

        Schau dir doch mal das error_reporting an und wie dort die Zweierpotenzen enthaltenden E_XXX-Konstanten miteinander verbunden werden.

        echo "$verabschiedung $name";

      2. Hallo Andü,

        PS: Vielleicht ist es noch sinnvoll mit zu erwähnen, dass ich eben damit Rechte für ein BlogSystem verwalten will und mir nicht 30 SQL-Spalten für 30 verschiedene Zugriffsrechte (welche ja jeweils nur FALSE oder TRUE sein können) anlegen will.

        Das ist aber eigentlich sinnvoll - schließlich kannst du den Optionen so viel besser sprechende Namen geben. Allerdings unterstützt MySQL z.B. nicht den Boolean-Datentyp.

        Wenn du die Optionen doch nur als Boolean abspeichern willst, gibt es z.B. diese Methode:
        0001101001
        D.h. du speicherst einen String ab, und jedes Zeichen (entweder 0 oder 1) steht für den Status dieser Option. Das ist allerdings etwas speicheranfälliger, da du ja eigentlich nur Boolsche Variablen brauchst.

        Was du auch machen kannst, ist den einzelnen Optionen Zahlen zu geben:
        [latex]2^0 = 1[/latex]
        [latex]2^1 = 2[/latex]
        [latex]2^2 = 4[/latex]
        [latex]2^3 = 8[/latex]
        [latex]2^4 = 16[/latex]
        [latex]2^5 = 32[/latex]
        und so fort.

        Dann speicherst du die Optionen im Gesamten als eine Zahl ab, man nehme z.B. die Zahl 7, die sich aus den ersten drei Optionen (1 + 2 + 4) ergibt. Den Algorithmus, um aus einer solchen Zahl die einzelnen Optionen herauszufinden, verrate ich jetzt aber nicht - das solltest du noch alleine hinbekommen... ;-)

        Dennoch: In einer Zeit, wo es Datenbanken gibt, die diese Dinge viel besser speichern können, ist das nicht wirklich gut. Was willst du machen, wenn eine der Optionen plötzlich mehr als 2 Zustände haben darf? Schon bist du mit diesem Prinzip aufgeschmissen, und musst komplett umsteigen. Daher geht meine Empfehlung an eine echte Datenbank-Lösung via Tabelle.

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
        1. Was du auch machen kannst, ist den einzelnen Optionen Zahlen zu geben:
          [latex]2^0 = 1[/latex]
          [latex]2^1 = 2[/latex]
          [latex]2^2 = 4[/latex]
          [latex]2^3 = 8[/latex]
          [latex]2^4 = 16[/latex]
          [latex]2^5 = 32[/latex]
          und so fort.

          Dann speicherst du die Optionen im Gesamten als eine Zahl ab, man nehme z.B. die Zahl 7, die sich aus den ersten drei Optionen (1 + 2 + 4) ergibt. Den Algorithmus, um aus einer solchen Zahl die einzelnen Optionen herauszufinden, verrate ich jetzt aber nicht - das solltest du noch alleine hinbekommen... ;-)

          Sagte ich ja bereits...

          Dennoch: In einer Zeit, wo es Datenbanken gibt, die diese Dinge viel besser speichern können, ist das nicht wirklich gut. Was willst du machen, wenn eine der Optionen plötzlich mehr als 2 Zustände haben darf? Schon bist du mit diesem Prinzip aufgeschmissen, und musst komplett umsteigen. Daher geht meine Empfehlung an eine echte Datenbank-Lösung via Tabelle.

          Dachte halt bloß, dass es wesentlich speicher schonender ist als mit so vielen Spalten - außerdem muss man auch bloß einen Wert lesen und kennt gleich alle Rechte ohne jede Spalte einzeln zu untersuchen.