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).
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.
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.
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.
$naam = $_COOKIE['naam'];
// Ofwel
$naam = $_SESSION['naam'];
$query = mysql_query("SELECT rank FROM users WHERE naam = '$naam'") or die (mysql_error());
while($row = mysql_fetch_array($query)) {
if($row['rank'] == "admin") {
echo "Jij bent een Admin";
} elseif($row['rank'] == "member") {
echo "Jij bent een member";
}
} // Einde While
?>
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.
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.
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:
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)?
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).
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.
# De bezoeker krijgt standaard deze pagina's ook al heeft hij geen speciale rank.
$pages = $standard;
# Bestaat de variable genaamd rank?
if(isset($rank))
{
# 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.
$rank = strtolower($rank);
# 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).
if(isset($$rank))
{
# Voeg de twee array's met pagina's samen.
$pages = array_merge($standard, $$rank);
}
}
# De bezoeker krijgt standaard deze pagina's ook al heeft hij geen speciale rank.
# 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.
# 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).
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.
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.
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.