login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[Php] Rank controleren? (Opgelost)

Offline Simax - 23/08/2007 19:18 (laatste wijziging 25/08/2007 15:03)
Avatar van SimaxOnbekend Beste mensen,

Ik heb in mijn database een tabel 'users' met als veld: us_rank.
Er zijn vier rank-mogelijkheden.

Namelijk..
Admin: toegang tot alle paginas.
Crewmember: toegang tot veel(bijna alle) paginas.
Member: toegang tot beperkt aantal paginas.
Unaccepted: toegang tot alleen-lezen paginas(standaard paginas).

Bijvoorbeeld..
  1. $standard = array("home","crew","news","services","incidents","contact");
  2. $admin = array("add_news","change_news","delete_news","view_news");
  3. $crewmember = array("add_news","change_news","view_news");
  4. $member = array("view_news",);

Hierin word dus opgeslagen welke paginas toegankelijk zijn.

Nu zou ik graag, als iemand succesvol is ingelogd,
de rank van de member willen controleren.
Aan de hand daarvan wil ik de bijhorende array includen, zodat de juiste rechten worden toegevoegd.

Iemand een voorbeeld?
Of een betere manier?

Alvast bedankt!

30 antwoorden

Gesponsorde links
Offline sir_green - 23/08/2007 20:14
Avatar van sir_green PHP interesse ik doe het op de volgende manier:

Ik geef iedereen een ranking zoals jij ook doe. Als iemand inlogd leest hij de tabel uit en slaat het op in een session

  1. $_SESSION['rechten'] = $obj->bevoegdheid;


Vervolgens kijk ik bij objecten en pagina's die niet voor elke ranking gewoon even met een if /else structuur wie wat te zien krijgt
Offline Simax - 23/08/2007 22:54
Avatar van Simax Onbekend Ok.

Bij het inloggen word ok bij mij een sessie aangenaamd waar de 'rank' in word opgeslagen.

Zou je eens een voorbeeld kunnen geven?
Offline DMM - 23/08/2007 22:59 (laatste wijziging 24/08/2007 16:43)
Avatar van DMM PHP beginner
  1. if(isset($_SESSION['rechten'])) {
  2.  
  3. if($_SESSION['rechten'] == 1) {
  4. echo "Je hebt bevoegdheid 1";
  5. } elseif($_SESSION['rechten'] == 2) {
  6. echo "Je hebt bevoegdheid 2";
  7. }
  8.  
  9. } else {
  10. echo "Geen sessie aanwezig";
  11. header("Location: login.php");
  12. // Hier maak je dan een sessie aan.
  13. }


EDIT: Ziehier een mooi (werkend) loginscript met sessies. http://www.site...&id=85
Offline Simax - 24/08/2007 16:37
Avatar van Simax Onbekend
DMM schreef:
[..code..]

EDIT: Ziehier een mooi (werkend) loginscript met sessies. http://www.site...&id=85


En wat is hier '$id' in jou geval?
Offline urqbz - 24/08/2007 16:41
Avatar van urqbz PHP interesse Mischien zou je ook kunnen controleren met een veld in je Database wat de rank van de gebruiker is.
Offline Simax - 24/08/2007 16:44 (laatste wijziging 24/08/2007 16:45)
Avatar van Simax Onbekend Hoe zou ik dit dan kunnen doen?

Edit
Wil graag de rank controleren van de gebruiker die is ingelogd.
Aan de hand daarvan wil ik toegankelijke paginas(in array) includen.
Offline urqbz - 24/08/2007 17:06 (laatste wijziging 24/08/2007 17:07)
Avatar van urqbz PHP interesse Ja dat begrijp ik ik bedoelde dus dat je naast alle andere velden in je database een veld je rank toevoegd.

  1. rank int(1);


En daarin aan 1 voor admin een 2 voor crewmember enz.
Als een gebruiker dan is ingelogd maak je een query die leest wat voor rank de gebruiker heeft en include je die pagina`s.
Offline Simax - 24/08/2007 17:12 (laatste wijziging 24/08/2007 17:13)
Avatar van Simax Onbekend Ik heb een veld 'rank' enum('admin', 'member').

Ik wil dus de rank controlen wanneer iemand succesvol is ingelogd. Vervolgens de toegankelijke paginas die zijn toegewezen aan de hand van een array toegankelijk maken.

Zou je eens een voorbeeld kunnen geven?

Edit
Zo wil ik voorkomen op elke pagina een controle uit te hoeven voeren.
Een pagina is includen is veel makkelijker.
Offline DMM - 24/08/2007 17:32
Avatar van DMM PHP beginner
  1. $naam = $_COOKIE['naam'];
  2. // Ofwel
  3. $naam = $_SESSION['naam'];
  4.  
  5. $query = mysql_query("SELECT rank FROM users WHERE naam = '$naam'") or die (mysql_error());
  6. while($row = mysql_fetch_array($query)) {
  7.  
  8. if($row['rank'] == "admin") {
  9. echo "Jij bent een Admin";
  10. } elseif($row['rank'] == "member") {
  11. echo "Jij bent een member";
  12. }
  13.  
  14. } // Einde While
  15.  
  16. ?>
Offline Simax - 24/08/2007 17:37
Avatar van Simax Onbekend En hoe include ik nu de array() met de toegankelijke paginas?
Offline simonopsomer - 24/08/2007 18:07
Avatar van simonopsomer Nieuw lid Dat hoef je niet te doen.
Je gebruik gewoon die if-else en geeft weer wat de gebruiker mag zien. Stel, het is een beheerpagina en de sessie bevat de rank admin, dan geef je de pagina weer. Anders geef je gewoon een melding.
"Je mag deze pagina niet bekijken" of iets deregelijks.
Offline Simax - 24/08/2007 18:34 (laatste wijziging 24/08/2007 21:19)
Avatar van Simax Onbekend Is dat wel zo makkelijk?
Volgens mij krijg je dan een oneindige code.

Edit
Als er iemand is ingelogd,
wil ik de 'rank' ophalen uit de database.

Als rank = admin, dan wil ik..
  1. $admin = array("toegestane paginas");

includen.

Iemand een idee?
Offline DMM - 24/08/2007 21:27
Avatar van DMM PHP beginner Dan zet je dat toch bovenaan elke pagina? Eerst voer je dus de controle uit of de gebruiker admin is. Als aan de voorwaarde voldaan is, wordt de pagina weergegeven, anders niet. Kijk naar mijn vorige code.
Offline Simon - 24/08/2007 21:28
Avatar van Simon PHP expert Je arrays zijn verkeerd opgebouwd, je moet het zo doen dat de paginas zelf een array zijn met daarin de ranks:
$view_news = array('member', 'admin', ...);
Dan kun je gemakkelijk op een pagina controleren of hij de pagina mag zien met:
  1. if(in_array($_SESSION['rank'], $view_news) { echo 'toon pagina'; } else { }
Offline Simax - 24/08/2007 22:01 (laatste wijziging 24/08/2007 22:32)
Avatar van Simax Onbekend Dan moet ik voor elke pagina een array aanmaken?
Een beetje overdreven niet? 

Edit
Maak nu gebruik van..
  1. $pages = array("home","crew","news","services","incidents","contact");
  2. if(isset($_GET["page"]))
  3. {
  4. if(in_array($_GET["page"],$pages))
  5. {
  6. if(file_exists($_GET["page"].".php"))
  7. {
  8. include $_GET["page"].".php";
  9. }
  10. else
  11. {
  12. echo ("<p class='error'>Ongeldige pagina opgegeven.</p>");
  13. }
  14. }
  15. else
  16. {
  17. echo ("<p class='error'>Ongeldige pagina opgegeven.</p>");
  18. }
  19. }

En wil dat naast $pages een array word geinclude waar toegankelijke paginas in staan voor bijvoorbeeld een admin.
Offline Grayen - 25/08/2007 12:15
Avatar van Grayen PHP ver gevorderde Je wilt dus een gebruik maken van een standaard array waarin alle pagina's staan die iedere bezoeker mag bezoeken en die array uitbreiden indien de bezoeker over een bepaalde rank bezit (zodat hij dus de pagina's die alleen die rank mogen kijken kan bezoeken)?

  1. <?php
  2. # Hier een script dat de us_rank van de user ophaalt en in $rank stopt.
  3. $rank = 'Crewmember';
  4.  
  5. $standard = array('home', 'crew', 'news', 'services', 'incidents', 'contact');
  6. $admin = array('add_news', 'change_news', 'delete_news', 'view_news');
  7. $crewmember = array('add_news', 'change_news', 'view_news');
  8. $member = array('view_news');
  9.  
  10. if(isset($_GET['page']))
  11. {
  12. $pages = $standard;
  13.  
  14. if(isset($rank))
  15. {
  16. $rank = strtolower($rank);
  17.  
  18. if(isset($$rank))
  19. {
  20. $pages = array_merge($standard, $$rank);
  21. }
  22. }
  23.  
  24. if(in_array($_GET['page'], $pages))
  25. {
  26. if(file_exists($_GET['page'].'.php'))
  27. {
  28. include $_GET['page'].'.php';
  29. }
  30. else
  31. {
  32. echo '<p class="error">Ongeldige pagina opgegeven.</p>';
  33. }
  34. }
  35. else
  36. {
  37. echo '<p class="error">Ongeldige pagina opgegeven.</p>';
  38. }
  39. }
  40. ?>
Offline Simax - 25/08/2007 13:02 (laatste wijziging 25/08/2007 14:41)
Avatar van Simax Onbekend Klopt,

Citaat:
Hier een script dat de us_rank van de user ophaalt en in $rank stopt

Maar hoe zou ik de rank van member kunnen controleren?

Edit
Is dit een mogelijkheid?

  1. $query = mysql_query("SELECT us_rank FROM users WHERE us_username = ."$_SESSION['username']".") or die(mysql_error());
  2. $result = mysql_fetch_assoc($query)
  3. {
  4. $result['us_rank'] = $rank;
  5. }
Offline Grayen - 25/08/2007 15:43
Avatar van Grayen PHP ver gevorderde Je string met daarin je SQL commando klopt niet, je wilt namelijk de sessie aan de variable "plakken" dat doe je inderdaad met punten, maar wel buiten de string, dus tussen de string en de variable (nu staat hij binnen de quotes dus behoort hij tot de string). De accolades op lijn 3 en 5 zijn totaal overbodig (waarschijnlijk was je in de war met een while loop). En je moet op regel 4 de twee variable omdraaien. Je wilt immers de variable $rank aanmaken en niet $result['us_rank'] (want die heb je al aangemaakt op regel 2).

  1. $query = mysql_query("SELECT us_rank FROM users WHERE us_username = ".$_SESSION['username']) or die(mysql_error());
  2.  
  3. $user = mysql_fetch_assoc($query);
  4.  
  5. $rank = $user['us_rank'];
Offline Simax - 25/08/2007 15:49
Avatar van Simax Onbekend Stel us_rank = admin.
Hoe weet $rank dan welke variable er uit de query komt?
Offline Babak - 25/08/2007 15:53 (laatste wijziging 25/08/2007 15:54)
Avatar van Babak MySQL interesse Waarom doe je zo moeilijk?

Maak een field met "accesslevel" tinyint 2

alleen lezen = 0
member = 1
crewmember = 2
admin = 3

en dan haal je gewoon die acceslevel eruit, en kijk je..
  1. <?php if($accesslevel > 1){ echo "je hoort bij de crew, joepie";}?>


klaar is kees
Offline Simax - 25/08/2007 15:54
Avatar van Simax Onbekend Heb je een voorbeeld?

En ik werk met rank, enum('admin','member');
Offline Babak - 25/08/2007 15:57
Avatar van Babak MySQL interesse Nou, dan doe je dat vanaf nu niet meer.. want zoals ik het net heb gedaan, is het perfect.

En die voorbeeld heb ik toch gegeven? Kijk, als je alleen wilt dat iemand alleen kan lezen doe je dit VÓÓR deze tekst vlak

  1. <?php if($accesslevel < 1){ } else{ ?>
  2.  
  3. hier je tekstvlak
  4.  
  5. <? }?>
Offline Simax - 25/08/2007 15:59
Avatar van Simax Onbekend En dit wil je op iedere pagina uitvoeren?
Offline Babak - 25/08/2007 16:01
Avatar van Babak MySQL interesse elke pagina? Als je met een forum werkt kan je dat gewoon 1 keer plaatsen.
Offline Simax - 25/08/2007 16:13 (laatste wijziging 25/08/2007 16:14)
Avatar van Simax Onbekend Ik werk niet met een form.

Nu controleer ik op elke pagina wat de rank van user is &
vervolgens of hij de pagina mag zien of juist niet.

Ik wil dit graag op één pagina controlen &
dan includen in index.php.
Als de pagina toegankelijk heeft de user toegang &
anders een error tonen.

De standaard paginas staan in een array.
Als de user is ingelogd word een extra array geinclude aan de hand
van zijn rank.

  1. $standard = array("home","crew","news","services","incidents","contact");
  2. $admin = array("add_news","change_news","delete_news","view_news");
  3. $member = array("view_news",);
Offline Grayen - 25/08/2007 16:15
Avatar van Grayen PHP ver gevorderde
Citaat:
Stel us_rank = admin.
Hoe weet $rank dan welke variable er uit de query komt?


Je hebt met de MySQL query het veld us_rank van de bezoeker uit je tabel gehaald. De waarde van dat veld hebben we opgeslagen in een array genaamd $user. Waarschijnlijk zit jij veelste moeilijk te denken op het moment, want wij hebben aangeven in welke variable de gegevens die we uit de query hebben gehaald moeten komen. Dus met die 3 regels code hebben wij alleen bepaald wat de us_rank van de bezoeker is, wat bijvoorbeeld admin kan zijn.

Vervolgens gaan wij in dat andere stuk script dat ik jouw heb gegeven bepalen welke array (met daarin de extra pagina's die hij mag gaan bezoeken) hij naast de array met de standaard pagina's krijgt.

  1. # De bezoeker krijgt standaard deze pagina's ook al heeft hij geen speciale rank.
  2. $pages = $standard;
  3.  
  4. # Bestaat de variable genaamd rank?
  5. if(isset($rank))
  6. {
  7. # Ze de waarde van rank om naar lowercase, omdat onze variable namen dit ook lowercase zijn en sommige waardes in de database met hoofdletter beginnen.
  8. $rank = strtolower($rank);
  9.  
  10. # Bestaat er een variable met dezelfde naam als de rank van de bezoeker. Bijvoorbeeld als $rank = admin, dan is de controle isset($admin) (zo leest php het dus eigenlijk).
  11. if(isset($$rank))
  12. {
  13. # Voeg de twee array's met pagina's samen.
  14. $pages = array_merge($standard, $$rank);
  15. }
  16. }


@Babak

Citaat:
Waarom doe je zo moeilijk?


De enige die moeilijk doet in dit geval ben jij . Er zijn zovéél manieren waarop je met rechten kan omgaan, jouw manier is een van de vele. Misschien vindt jij jouw manier op dit moment perfect, maar dat hoeft nog niet zo te zijn voor anderen.

Citaat:
Nou, dan doe je dat vanaf nu niet meer.. want zoals ik het net heb gedaan, is het perfect.


Laat hem vooral zijn complete database en script aanpassen, omdat jij denkt dat jij "de perfecte manier hebt" (die bestaat niet). Dat is natuurlijk onzin.

Ik raad Rimex gewoon aan verder te gaan met zijn systeem en zou hij een keer zijn ranken systeem totaal anders aanpakken dan kan hij het beter gelijk goed aanpakken en gaan werken met usergroups.

Maar voor de meeste (kleinere sites) is zijn methode voldoende.
Offline Babak - 25/08/2007 16:15 (laatste wijziging 25/08/2007 16:17)
Avatar van Babak MySQL interesse Form? Bedoel je forum?

Hmm..

hij kan ook gewoon op zijn add_news.php een if'je plaatsen?

  1. <? if($access < 2){ echo "je hebt geen toegang tot deze pagina"}?>


want hij heeft namelijk niet zo heel veel pagina's, dus kan dat ook gewoon!?
Offline Simax - 25/08/2007 16:20 (laatste wijziging 25/08/2007 16:21)
Avatar van Simax Onbekend @Grayen,
Citaat:
Ik raad Rimex gewoon aan verder te gaan met zijn systeem en zou hij een keer zijn ranken systeem totaal anders aanpakken dan kan hij het beter gelijk goed aanpakken en gaan werken met usergroups.

Is er een betere manier mogelijk dan?
Graag meer informatie hoe ik het beter aan kan pakken.

@Babak,
Heb wel meerdere paginas,
maar zomaar wat in de array gezet als voorbeeld.
Offline Grayen - 25/08/2007 16:52
Avatar van Grayen PHP ver gevorderde Als ik jouw was zou ik het op jouw methode houden. De andere manier (die ik gebruik) is redelijk ingewikkeld en is zéér weinig informatie over te vinden, althans ik kan het nergens vinden.

Maar de basis wil ik wel uitleggen.

Je hebt 5 MySQL tabellen.

* user (id en gegevens over de gebruiker) pirmary key = id
Beschikt over informatie over de gebruiker.

* function (id, name) primary key = id
Alle functies die een usergroup kan bezitten, bijvoorbeeld NEWS_EDIT.

* functionaccess (id, usergroup_id, function_id, type, priority) primary key = id
Hierin staat bij welke groep welke functies behoren en welke prioriteit een functie heeft. Een gebruiker kan immers bij meerdere usergroups horen en dus kan het zijn dat er twee dezelfde functies horen bij twee verschillende groepen, bij de een kan het type true hebben (hij heeft het recht) en bij de ander weer false (hij heeft het recht niet, deze gebruik je alleen als je van een functie weet dat hij standaard true is maar als hij bijvoorbeeld een rang lager wordt, zoals je zou kunnen maken bij waarschuwingen dat hij bepaalde rechten verliest, en er dus zeker van wilt zijn dat hij het recht verliest), met behulp van de prioriteit kan dan worden bepaald welk van de functies de bezoeker krijgt.

* usergroup (id, name) primary key = id
Hierin staan alle usergroups.

* usergroupaccess (id, user_id, usergroup_id) primary key = id
Hierin wordt bepaald bij welke usergroups een user allemaal hoort.

Ik hoop dat het een beetje duidelijk is. En dan is dan alleen nog maar de tabel structuur, dan moet je er nog voor gaan zorgen dat je met deze gegevens een goed werkend script krijgt. Best moeilijk dus, maar wel noodzakelijk voor grote systemen.

Ik raad je aan om gewoon verder te bouwen om het systeem dat je nu hebt, dat waarschijnlijk genoeg voor jouw site.
Offline Simax - 25/08/2007 16:53
Avatar van Simax Onbekend Ok, dankje voor de informatie.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.432s