php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.04.2008, 17:03  
Erfahrener Benutzer
 
Registriert seit: 27.04.2008
Beiträge: 104
SilentSight befindet sich auf einem aufstrebenden Ast
Standard Problem bei binärem Rechtesystem

Hi,

wie schon im Titel zu lesen ist, habe ich ein Problem mit der Rechteverwaltung.
Diese wird binär verglichen.

Bsp.
Forenadmin: 001 // 1
Gästebuchverwaltung: 010 // 2
Benutzerverwaltung: 100 // 4
...

Wenn der Benutzer also Forenadmin ist und auch noch die Benutzer verwalten darf, hat er das Recht 5.

Ich habe folgende Funktion um anzeigen zu lassen, ob entweder der eingeloggte Benutzer, oder ein mit dem zweiten Parameter übergebener Benutzer ein Recht haben (Parameter 1):

PHP-Code:
function getRight($userright$uid NULL) {
    
$rights_sel mysql_query('SELECT * FROM rights');
    
$rights = array();
        
    while(
$rights_fetch mysql_fetch_assoc($rights_sel)) {
        
$rights[$rights_fetch['name']] = $rights_fetch['bit'];
    }
        
    if(isset(
$uid)) {
        
$user_sel mysql_query('SELECT rights FROM accounts WHERE id = "'.$uid.'"');
    } else {
        
$user_sel mysql_query('SELECT rights FROM accounts WHERE id = "'.$_SESSION['uid'].'"');
    }
        
    
$user mysql_fetch_assoc($user_sel);

    foreach(
$rights as $name => $bit) {
        if((
$user['rights'] & $userright) == $bit) {
            return 
true;
        }
    }
        
    return 
false;

Und meine Datenbankstruktur "rights" sieht so aus:

Code:
name    | bit
Recht 1 | 1
Recht 2 | 2
Recht 3 | 4
Recht 4 | 8
Recht 5 | 16
Recht 6 | 32
Meine Rechte-Abfrage in der Benutzerverwaltung sieht so aus:

PHP-Code:
for($i 0$right mysql_fetch_assoc($userrights); $i++) {
    echo 
'<input type="checkbox" name="rights[]" id="right_'.$i.'" value="'.$right['bit'].'" '.((getRight($right['bit'], $_GET['uid']) ? 'checked="checked"' '').' /><label for="right_'.$i.'"> '.$right['name'].'</label><br />';

Die uid ist in der URL mitgegeben, und die Benutzerrechte wurden davor schon mit einer SQL-Query ausgelesen.

Leider werden immer Checkboxen ausgewählt, welche ich nicht nachvollziehen kann...

Vll. kann mir ja einer von euch sagen, warum meine Funktion nicht funktioniert...

Ich freue mich über jede Antwort.

Grüße SilentSight
SilentSight ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.04.2008, 18:23  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Hallo,
theoretisch müsste das funktionieren, praktisch leider nicht. Das liegt daran, dass PHP mit so großen Zahlen nicht mehr rechnen kann. Das ganze funktioniert nur bis 31. Danach gibt PHP auf.
Wenn du größere zahlen brauchst, musst du es in einzelne Pakete aufteilen. Diese multiplizierst du dann. Bei 32 wäre das also:

($userrights & (1 << 31)) * ($userrights & (1 << 1))

Geändert von Manko10 (27.04.2008 um 18:25 Uhr).
Manko10 ist offline   Mit Zitat antworten
Alt 27.04.2008, 18:30  
Erfahrener Benutzer
 
Registriert seit: 27.04.2008
Beiträge: 104
SilentSight befindet sich auf einem aufstrebenden Ast
Standard

Ich dachte dass PHP nur ab 32-stelligen Zahlen nicht mehr rechnen kann?
Ich probier deine Möglichkeit trotzdem mal aus...
SilentSight ist offline   Mit Zitat antworten
Alt 27.04.2008, 18:33  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Mag auch sein, dass ich deinen Ansatz falsch verstanden habe.
PHP macht bis zum Recht 31 mit. Danach nicht mehr.
Manko10 ist offline   Mit Zitat antworten
Alt 27.04.2008, 18:41  
Erfahrener Benutzer
 
Registriert seit: 27.04.2008
Beiträge: 104
SilentSight befindet sich auf einem aufstrebenden Ast
Standard

Achso, ich hab ja garnich gesagt, dass ich nur 6 Rechte hab...
Aber trotzdem gehts nicht...
SilentSight ist offline   Mit Zitat antworten
Alt 27.04.2008, 18:54  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Versuche statt

if(($user['rights'] & $userright) == $bit)

mal

if(($user['rights'] & (1 << $userright)) > 0)

Dann müsste es gehen.
Manko10 ist offline   Mit Zitat antworten
Alt 27.04.2008, 19:02  
Erfahrener Benutzer
 
Registriert seit: 27.04.2008
Beiträge: 104
SilentSight befindet sich auf einem aufstrebenden Ast
Standard

Ne geht immernoch nich...
Jetz sind andere Boxen aktiv...

Hab echt keine Ahnung was da immer schief läuft
SilentSight ist offline   Mit Zitat antworten
Alt 27.04.2008, 19:17  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Ich habe deine Funktion mal auf ein Minimum heruntergebrochen. Das gibt zurück, ob der User das übergeben Recht hat oder nicht:
PHP-Code:
function getRight($userright$uid null) {
    
$uid $uid ? (int)$uid : (int)$_SESSION['uid'];
    
    
$result mysql_query("SELECT rights FROM accounts WHERE id = $uid");    
    
$rights mysql_fetch_object($result)->rights;
    
    return ((
$rights & (<< $userright)) > 0);

Manko10 ist offline   Mit Zitat antworten
Alt 27.04.2008, 19:25  
Erfahrener Benutzer
 
Registriert seit: 27.04.2008
Beiträge: 104
SilentSight befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Manko10 Beitrag anzeigen
Das gibt zurück, ob der User das übergeben Recht hat oder nicht:

PHP-Code:
function getRight($userright$uid null) {
    
$uid $uid ? (int)$uid : (int)$_SESSION['uid'];
    
    
$result mysql_query("SELECT rights FROM accounts WHERE id = $uid");    
    
$rights mysql_fetch_object($result)->rights;
    
    return ((
$rights & (<< $userright)) > 0);

Dadurch sind trotzdem noch die selben Boxen aktiv
Das muss doch irgendwie funktionieren...
Google spukt auch nix aus
SilentSight ist offline   Mit Zitat antworten
Alt 27.04.2008, 19:33  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Hast du die Rechte denn auch auf die richtige Art und Weise errechnet?
Die Syntax zum setzen ist für jedes Recht

2^recht * hat_dieses_recht

Diese Werte werden addiert. Also z.B.

2^1 * 1 = 1
2^2 * 1 = 4
2^3 * 0 = 0
2^4 * 1 = 16
2^5 * 0 = 0
2^6 * 1 = 64
----------------
Summe: 85

Die Summe repräsentiert die Rechte.

Und beachte auch, dass in PHP zum potenzieren nicht der Operator ^ verwendet wird (der steht nämlich für das bitweise XOR). Um in PHP Zahlen zu potenzieren, ist die Funktion pow($basis, $expontent) da.

Geändert von Manko10 (27.04.2008 um 19:35 Uhr).
Manko10 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
Sessions Problem StephenKing PHP Tipps 2008 3 16.10.2007 08:30
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
[Erledigt] wieder ein Problem bei phpmailer und smtp PHP Tipps 2006 24 07.02.2006 01:07
Problem bei Massenmails versenden mit der Funktion mail PHP-Fortgeschrittene 3 19.01.2005 13:36
Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Problem mit Weiterleitung PHP Tipps 2004-2 16 22.12.2004 17:49
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
PHP Upload (Master Value/Local Value Problem) PHP-Fortgeschrittene 5 23.11.2004 07:21
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34
[Erledigt] Problem mit Timestamp! PHP Tipps 2004 24 08.06.2004 19:51
Login Problem PHP Tipps 2004 4 04.06.2004 18:46
foreach problem mAy^daY PHP Tipps 2004 3 02.06.2004 20:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php bitweise rechte, pho binärem rechtesystem, rechtesystem php, php rechtesystem smarty

Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum