Bit-Operatoren !?

Daensch

Erfahrenes Mitglied
Hallo =)

Ich habe mal eine Frage:

Mein Problem ist, das ich eine Benutzerrechte Verwaltung "brauche" um meinen Leuten halt gewisse Sache zuzuweisen bzw verweigern kann.

Ich habe mir bereits einige Tuts mit Bit-Operatoren durchgelesen, doch die Richtige Verständnis blieb mir leider abhanden.

als bsp:
1000000 wäre bei mir admin
0000010 einfacher poster
0000110 einfacher poster mit newseintragrecht
usw.

Jetzt dachte ich an eine andere Variante wie:
$recht = "1010101"; // recht wird aus sql abgefragt
$recht_1 = $recht - 10 // 1010101 - 10 = 1121202; Abfrage zum Recht POSTER; anschliessend zahl kontrollieren ob andere zahlen vorhanden sind ausser 1 & 0 !

somit weiss ich, wenn ich pro stelle ( - 10 oder - 1000 ) das durch eine Rechnung laufen lasse eine NICHT aus 1 & 0 bestehende Zahl rausbekomme, das er das Recht NICHT HAT !

Ich gebe zu ein wenig umständlich =)

Dann dachte ich darüber etwas zu suchen was z.b. die 3 Stelle von rechts vergleicht ob sie 0 oder 1 ist!
Dazu weiss ich aber kein befehl... dachte erst an "explode" usw..
Aber noch nicht wirklich was zustande bekommen =)

Kann mir da vielleicht eine Hilfe geben!?
Oder ein Codeschnipsel...entwerfen!?
(wenn möglich eine Erklärung zu den Befehlen)

mfg Daensch

(PS: Ich find das sowieso geil. Ich mein ich suche ja nach bereitsbestehenden Themen ob ich eine Lösung für mein Problem finde, jedoch is das Schwierig wenn ich die gewissen Befehle nicht kenne)
 
Wie wäre es denn damit?

Deine erster op ist immer 6 Ziffern groß:

PHP:
$op1 = 100101; //hole aus db

Dein Vergleichs op sieht so aus:

PHP:
$op2 = 111011; //fest

Jetzt dein Resultat op:

PHP:
if(($op1 & op2) != $op1){ 
  //die 3 letzte stelle waar eine 1
}
else{ 
  //die 3 letzte stelle war eine 0
}

Habs nicht ausporbiert müsste aber eigentlich so klappen.

Gruß

RedWing
 
wäre auch eine Möglichkeit !

Was is aber wenn ich bzw derjenige kein Admin (wofür ja die erste 1 steht)
dann hätte ich:

$op1 = 001011;
$op2 = 111011; //fest

und in einer rechnung lässt er dann ja die ersten beiden null stellen weg !

obs dann auch geht? (muss das nacher mal praktisch testen wenn ich zu hause bin)

gibs sonst noch weitere Vorschläge ?!
=)
 
Wei wäre es damit?

PHP:
$op2 =  decbin('000001'); //aus db als string lesen
$op1 = 59; //fest <=> 111011

if(($op1 & $op2) != $op1) // siehe oben

Gruß

RedWing
 
So.. wie folgt:

Dein Vorschlag @REDWING funktioniert zwar, aber nur teilweise =(


Wir konzentrieren uns mal nur auf die Dritte Stelle von Rechts.
Wenn ich als Admin z.b.
100000 habe bin ich nur Admin
010000 Bedeutet z.b. schreiben von links
001000 Bedeutet z.b. editieren von sonstwas
000100 was anderes
000010 auch was anderes
000001 "
000000 Ohne jegliche Rechte ( inaktiv )

Jetzt erstelle ich einen User der z.b. mehre Rechte hat:
001101 (was ja mit decbin = 13 wär, sich von 59 ungleich is und somit inkorrekt ist)
ebenso:
100000 (decbin = 32 )

Ich möchte NUR eine einzelne Stelle abfragen können ob sie den wert 1 oder 0 hat! Weil mathematisch in Binär umzurechnen wäre zu kompliziert, dann müsste ich für jeden Rang
der verschiedene Benutzerrechte hat immer eine If schleife Programmieren ! (auf deutsch ich schreib mir n Wolf =) )

würde nicht sowas wie z.b.:

$code = "abfrage aus sql" // z.b. 111101
for ($i=1;$i=6;$i++)
{ array(codeabfrage,$i) explode $code
}
(abgesehen davon das das vielleicht falsch geschrieben ist)
Hoffe das jmd meine Idee versteht. Die zahl 111101 aufteilen in array-codeabfrage mit der jeweiligen Stelle die mit i gekenntziffert wird. Also pro durchlauf der Schleife eine weitere Stelle, so das die Ausgabe dann:
array(codeabfrage,1) = 1
array(codeabfrage,2) = 1
array(codeabfrage,3) = 1
array(codeabfrage,4) = 1
array(codeabfrage,5) = 0
array(codeabfrage,6) = 1
wäre!

=)

Mit freundlichen Grüssen

Daensch
 
Folgendes habe ich jetzt zusammen gebastelt und es Funktioniert =D Hab meine Schulbücher durchwälzt und ne Formel gefunden zum errechnen des Binär codes ! Umgesetzt sieht das so aus:

PHP:
<?
// STARTEN DER SEITE MIT blabla.php?bincode=00101010     ( oder einem anderem ! )
// Binärcodescript für maximal 8 Stellen
// 128  64  32  16  8  4  2  1 
//  0    0     0    0   0  0  0  0

$umwand = bindec($bincode);
echo "Code : $bincode : umgewandelt in : $umwand !<br>";

// 1. Stelle von links
if($umwand - 128 >= 0)  // wenn UMWAND - 128 grösser oder gleich 0 dann..
	{$erg1= 1;             // erg für 1.Stelle auf 1 setzten !
	$umwand = $umwand - 128;}    // und das Ergebnis aus der IF Schleife um 128 reduzieren
	else                                      // sonst
	{$erg1= 0;}                            // erg für 1.Stelle auf 0 Setzen
echo "1. Stelle : $erg1 <br>";          // Test ausgabe !

// 2. Stelle von links
if ($umwand - 64 >= 0)
	{$erg2= 1;
	$umwand = $umwand - 64;}
	else
	{$erg2= 0;}
echo "2. Stelle : $erg2 <br>";

// 3. Stelle von Links
if ($umwand - 32 >= 0)
	{$erg3= 1;
	$umwand = $umwand - 32;}
	else
	{$erg3= 0;}
echo "3. Stelle : $erg3 <br>";

// 4. Stelle von Links
if ($umwand - 16 >= 0)
	{$erg4= 1;
	$umwand = $umwand - 16;}
	else
	{$erg4= 0;}
echo "4. Stelle : $erg4 <br>";

// 5. Stelle von Links
if ($umwand - 8 >= 0)
	{$erg5= 1;
	$umwand = $umwand - 8;}
	else
	{$erg5= 0;}
echo "5. Stelle : $erg5 <br>";

// 6. Stelle von Links
if ($umwand - 4 >= 0)
	{$erg6= 1;
	$umwand = $umwand - 4;}
	else
	{$erg6= 0;}
echo "6. Stelle : $erg6 <br>";

// 7. Stelle von Links
if ($umwand - 2 >= 0)
	{$erg7= 1;
	$umwand = $umwand - 2;}
	else
	{$erg7= 0;}
echo "7. Stelle : $erg7 <br>";

// 8. Stelle von Links
if ($umwand - 1 >= 0)
	{$erg8= 1;
	$umwand = $umwand - 1;}
	else
	{$erg8= 0;}
echo "8. Stelle : $erg8 <br>";
	
	if ($erg1 == 1) {echo "Zugriff erlaubt auf 1<br>";} else {echo "Zugriff nicht erlaubt auf 1<br>";}
	if ($erg2 == 1) {echo "Zugriff erlaubt auf 2<br>";} else {echo "Zugriff nicht erlaubt auf 2<br>";}
	if ($erg3 == 1) {echo "Zugriff erlaubt auf 3<br>";} else {echo "Zugriff nicht erlaubt auf 3<br>";}
	if ($erg4 == 1) {echo "Zugriff erlaubt auf 4<br>";} else {echo "Zugriff nicht erlaubt auf 4<br>";}
	if ($erg5 == 1) {echo "Zugriff erlaubt auf 5<br>";} else {echo "Zugriff nicht erlaubt auf 5<br>";}
	if ($erg6 == 1) {echo "Zugriff erlaubt auf 6<br>";} else {echo "Zugriff nicht erlaubt auf 6<br>";}
	if ($erg7 == 1) {echo "Zugriff erlaubt auf 7<br>";} else {echo "Zugriff nicht erlaubt auf 7<br>";}
	if ($erg8 == 1) {echo "Zugriff erlaubt auf 8<br>";} else {echo "Zugriff nicht erlaubt auf 8<br>";}
?>

Für die die es sonst noch interessiert ist alles Dokumentiert !

mfg

Daensch

ps: bei fragen mailt mir am besten, oder falls was unklar sein sollte : liam@lkh-clan.de
 
Zuletzt bearbeitet:
Warum hast du eigentlich nicht gleich mit UND und OR gearbeitet?

Sagen wir das mal so:
PHP:
define("FLAG_USER_NORMAL", 2); // entspricht 10
define("FLAG_USER_NEWS", 6); // enspricht 110
define("FLAG_USER_ADMIN", 64); // enspricht 1000000


//Flags für einen bestimmten user definieren
$user_flag = $user_flag | FLAG_USER_NEWS;
//user kann nun news posten
//diese dezimale Zahl in der Datenbank speichern


.
.
.
//Flag für bestimmten User aus der Datenbank auslesen und in $uflag speichern

if(($uflag & FLAG_USER_NEWS) == FLAG_USER_NEWS) {
//kann news posten
}

if(($uflag & FLAG_USER_ADMIN) == FLAG_USER_ADMIN) {
//user ist admin
}

Das wäre für mich die einfachste variante und spart auch speicherplatz in der DB ;)
 
das mit dem definieren hatte ich auch zeitweilig probiert.. hat bei mir nich so gut geklappt =(

Aber dann hab ich ja immer noch das problem das ich z.b. dem Newsposter ein recht mehr, z.b. auch das Recht zum addn von downloads geben möchte..

einen anderen aber nur das recht zum addn von downloads, aber nicht das recht auf News !

dann müsste ich schon wieder pro option unzählige zahlen nehmen !
Vielleicht gehts auch noch anders als diese Varianten.. aber ich zufrieden mit meiner Lösung =) genau das was ich halt wollte !

Denn die Ränge sind fest.. jeder User bekommt bei mir einen 8 vielleicht auch 10 stelligen Binärcode und das script weiss dann halt was er von allen optionen er darf und was nicht !
Die Möglichkeiten sind wie in einem 8 stelligen Zahlenschloss, wenn du verstehst was ich mein =)


aber von wegen zumüllen kommt mir grad ne verbesserung... statt den code z.b. 100010101 direkt zu speichern könnte ich ja auch den dec wert eintragen ! dann kommt sich das gleich !
 
das kannst du genauso machen
jedes bit hat eine eigenschaft
also zum beispiel
1 ist normaler user
10 ist user mit newsrechten
100 ist user mit download-addrechten

Nun kannst du alles mit | verbinden
zum beispiel ein Nutzer, der News posten darf aber keine Downloads machen darf
PHP:
define("FLAG_USER_NORMAL", 1); // entspricht 1
define("FLAG_USER_NEWS", 2); // enspricht 10
define("FLAG_USER_DOWNLOAD", 4) // entspricht 100
define("FLAG_USER_ADMIN", 64); // enspricht 1000000 

$user_flag = FLAG_USER_NORMAL | FLAG_USER_NEWS;

Da könnteste einen machen mit nur Download-Zeug-Fähigkeiten
PHP:
define("FLAG_USER_NORMAL", 1); // entspricht 1
define("FLAG_USER_NEWS", 2); // enspricht 10
define("FLAG_USER_DOWNLOAD", 4) // entspricht 100
define("FLAG_USER_ADMIN", 64); // enspricht 1000000 

$user_flag = FLAG_USER_NORMAL | FLAG_USER_DOWNLOAD;

Oder vielleicht mit beidem?
PHP:
define("FLAG_USER_NORMAL", 1); // entspricht 1
define("FLAG_USER_NEWS", 2); // enspricht 10
define("FLAG_USER_DOWNLOAD", 4) // entspricht 100
define("FLAG_USER_ADMIN", 64); // enspricht 1000000 

$user_flag = FLAG_USER_NORMAL | FLAG_USER_NEWS | FLAG_USER_DOWNLOAD;

Ist auch meiner Meinung besser lesbar, weil es in anderen Sprachen genauso gemacht wird ;)

Aber wie du willst
 
Daensch hat gesagt.:
[...]
Jetzt erstelle ich einen User der z.b. mehre Rechte hat:
001101 (was ja mit decbin = 13 wär, sich von 59 ungleich is und somit inkorrekt ist)
ebenso:
100000 (decbin = 32 )
Warum ist denn 001101b == 13d deiner Meinung nach falsch? Und wie kommst du auf 59?

Daensch hat gesagt.:
Ich möchte NUR eine einzelne Stelle abfragen können ob sie den wert 1 oder 0 hat! Weil mathematisch in Binär umzurechnen wäre zu kompliziert, dann müsste ich für jeden Rang
der verschiedene Benutzerrechte hat immer eine If schleife Programmieren ! (auf deutsch ich schreib mir n Wolf =) )
Hä? Mathematisch in Binär umrechnen? If-Schleife?

Wenn ich mir deine Codeschnipsel so anschaue, glaub ich irgendwie, dass du von den Tutorials tatsächlich nicht viel verstanden hast. Mit Binärarithmetik an sich hat das nämlich nicht viel zu tun. Also entweder hältst du dich an die richtigen Erläuterungen von KoMtuR oder du implementierst deine Benutzerrechtverwaltung gleich ganz anders. Alles andere ist ziemlich unsinnig.
 
Zurück