>60 Checkboxen sinnvoll in db speichern, aber wie?

@Reima: Du schreibst in deinem Beitrag, dass das beschriebene System nur für Textfiles geeignet wäre und du bei einer DB lieber einzelne Spalten für die einzelnen Rechte anlegen würdest.
Es wäre aber doch trotzdem performanter wenn man ein varchar($länge) hätte und das dann auf genau deine Art überprüft, oder? Ich jedenfalls mache das so.
 
Original geschrieben von sam
@Wolfsbein: Zeigen! :-)
Was soll ich dir da zeigen? Du hast eine Spalte Rechte mit der Anzahl Stellen die du brauchst. Wenn ein User jetzt z.B. eine neue Umfrage erstellen will, dann werden seine Rechte aus der DB ausgelesen und dann auf die von Reima beschriebene Art überprüft. Fertig.
 
Kann man das nicht einfacher lösen?

das System ist doch schon einfach - klingt nur anfangs schwer - ist es aber nicht

als erste benötigt man ja eine tabelle
welches Bundesland welches Bit entspricht.
Bei bis zu 80 Möglichkeiten würde sich auch hier eine eigene Tabelle in der DB anbieten:
bundesland | wert
hessen | 0
NRW | 1
Bayern | 2
Berlin | 3
usw

der Wert ist dann die Bitstelle in dem Rechtesystem.

Wenn du mit Integer als Recht arbeites kannste mit "2 hoch wert" arbeiten
um das Bit zu setzen oder abzufragen

Wenn du mit einem String arbeites als
Rechte System kannste mit sowas arbeiten:
recht[$wert]

Was für Integer spricht:
Abfragen wie zeige mir alle Kunden die was mit Hessen und Bayern am Hut haben sind mit Integer einfacher zu Bauen -
Dafür must du die Rechte auf 6 Integerfelder verteilen was den Progaufwand etwas in die Höhe treibt

Bei Stringrechten haste weniger Progaufwand
aber die Kombiabfrage wird zum Akt.

Mit andern Worten je mehr Auswertungabfragen du braucht umso eher die Integerversion :-)
 
Original geschrieben von melmager
als erste benötigt man ja eine tabelle
welches Bundesland welches Bit entspricht.
Bei bis zu 80 Möglichkeiten würde sich auch hier eine eigene Tabelle in der DB anbieten:
bundesland | wert
hessen | 0
NRW | 1
Bayern | 2
Berlin | 3
usw
Das habe ich schon alles in der db...
Für den Wert kann ich ja den Primärschlüssel
nehmen, oder?
Nur wie gehts dann weiter? Wenn ihr chinesisch
reden würdet, würde ich mehr verstehen als
jetzt :-)
Soll ich die ganzen Werte der Checkboxen
mit '10010101...' in einem Feld in der
db speichern?
 
Soll ich die ganzen Werte der Checkboxen
mit '10010101...' in einem Feld in der
db speichern?

ja :-) >> wenn du keine Auswertungsabfragen brauchst

<input type=checkbox name=recht[] value=idbundesland >

dann:

$rechtebit = str_repeat("0",80);
for ($lo=0;$lo<sizeof($recht);$lo++) {
$tmp = $recht[$lo];
$rechtebit[$tmp] = "1";
}
echo "$rechtebit<br>";

das war hin :-)

#$rechtebit aus db
for ($lo=0;$lo<80;$lo++) {
if ($rechtebit[$lo] == "1") {
$idbundesland[] = $lo;
}
}
#in array idbundeland ist das ergebnis

und zurück :-)

z.B. für einen Filter wieder auslesen zu
können?
welche Art Filter ?

Ist leider wichtig sonst reden wir dir noch ein ungeeignetes System ein :-(
 
Zuletzt bearbeitet:
Original geschrieben von melmager
$rechtebit = str_repeat("0",80);
for ($lo=0;$lo<sizeof($recht);$lo++) {
$tmp = $recht[$lo];
$rechtebit[$tmp] = "1";
}
echo "$rechtebit<br>";
Das funktioniert schonmal ganz gut, danke ;)
Die 80 steht für die Länge, oder? Das muss
ich dann also nur an die Anzahl meiner
Boxen anpassen...
Das werde ich morgen mal richtig durchtesten

Mit 'Filter' meinte ich, dass ich später
bestimmte Datensätze aus der db holen
muss, die mit dem Gebiet/den Gebieten
übereinstimmen...

edit: Wäre die 'Explode-Methode' denn
schnell genug?
 
Jo Explode ist OK

es geht wirklich um die Filter sache :-)

bei der Char Version haste als "Rechte"
zb. sowas "0110"

Wenn du jetz ein Filter brauchst um zu ermitteln wer in "0010" oder in "0100"
ist geht die abfrage so:

select * from kunden where rechte like "_1___" or rechte like "__1_"

bei 60 zeichen mit entspechend 60 mal den _ (der bedeutet ein beliebiges Zeichen)

stell dir mal vor du musst ein filter bauen der 8 Bundesländer ermittelt von 60 möglichen - ein ewig langes ding :-(

-----
Bei Explode haste als Rechte ja die IDs von den Bundesländern im Feld:
zb so: 2|3|30

da geht der filter suche nach 2 oder 3 so: (auch bei 80 möglichen versionen)

select * from kunden where rechte like "%2|%3|%"
% bedeutet beliebig viele Zeichen

sehr viel kürzer gelle :-)
 
Zurück