Hallo,
Ik ben bezig met een rechten systeempje. Het toevoegen van de rechten lukt wel. Maar nu ben ik met de pagina bezig waar je de rechten kunt veranderen. Maar hij laat de modules vaker zien dan 1x.. Ik wil gewoon alle modules 1x en als hij/zij de rechten ervoor heeft daarlangs een aangevinkt hokje, en anders niet aangevinkt. Dit is mijn code:
Aanvullend bericht:PHP Code:
<form action="<?= $_SERVER["PHP_SELF"] ?>" method="post">
<table>
<tr>
<td><label for="naam">Naam:</label></td>
<td><input type="text" name="naam" id="naam" /></td>
</tr>
<tr>
<td><label for="email">E-mail:</label></td>
<td><input type="text" name="email" id="email" /></td>
</tr>
<tr>
<td><label for="wachtwoord">Wachtwoord:</label></td>
<td><input type="password" name="wachtwoord" id="wachtwoord" /></td>
</tr>
<?php
$dbc = new dbController();
$dbc->connect();
$result = $dbc->runQuery("
SELECT
*
FROM
modules AS m
INNER JOIN
rechten
WHERE
gebruiker = '" . mysql_real_escape_string($_GET["gebruiker"]) . "'
GROUP BY
m.id
");
if(!$dbc->isResultEmpty($result))
{
while($row = $dbc->fetchAsObject($result))
{
?>
<tr>
<td><label for="<?= $row->module_naam ?>"><?= $row->module_naam ?></label></td>
<td><input type="checkbox" name="<?= $row->module_id ?>" id="<?= $row->module_naam ?>" value="<?= $row->module_id ?>" <?php if($row->mid === $row->module_id){ ?> checked="checked" <?php } ?> /></td>
</tr>
<?php
}
}
$dbc->close();
?>
</table>
<br />
<input type="submit" name="verstuur" value="Opslaan" />
</form>
Of weet misschien iemand een rechtensysteempje dat hiervoor hanidg is?
- rechtensysteempje
-
25-01-2010, 16:14 #1Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
rechtensysteempje
Laatst aangepast door gast17013 : 27-01-2010 om 17:09 Reden: Automatisch samengevoegd.
-
25-01-2010, 16:54 #2
- Berichten
- 256
- Lid sinds
- 14 Jaar
Luuk, het is heel moeilijk om hier een oorzaak aan te wijzen zonder de layout van je tabellen maar ik doe een gooi:
Zou het kunnen dat
Code:<?php if($row->mid === $row->module_id){ ?>
Code:<?php if($row->m.id === $row->module_id){ ?>
-
25-01-2010, 17:04 #3ProAffiliate
- Berichten
- 506
- Lid sinds
- 16 Jaar
Zit het niet gewoon in de query? krijg je wel het gewenste resultaat als je de query direct op de db uitvoert zonder php.
Eventueel een "group by" module id zou dit kunnen oplossen
-
25-01-2010, 17:05 #4Particulier
- Berichten
- 1.054
- Lid sinds
- 17 Jaar
@Ruud van der Velden
Lijkt me sterk, eerder 'id' dan.
@Michel Willemse
Idd, is er een 1-op-1 relatie? Of kan een gebruiker meerdere regels in rechten hebben, of andersom. Debug even zelf wat.
-
25-01-2010, 18:35 #5Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
Ik krijg gewoon 3x dezelfde modules...
Aanvullend bericht:
Maar ik wil dat ze maar 1x te voor schijn komen. Maar ondertussen wel checked ofdat er eentje is aangevinkt ja of nee.Laatst aangepast door gast17013 : 25-01-2010 om 21:36 Reden: Automatisch samengevoegd.
-
25-01-2010, 22:24 #6
- Berichten
- 256
- Lid sinds
- 14 Jaar
Want? Aangezien de één van de tabellen een alias 'm' meekrijgt en ik ervan uit ga dat daarin een kolom 'id' voorkomt lijkt me mijn aanname niet zo gek toch.
Luuk: dit werkt toch niet? Je stelt halve vragen. Hoe moeten wij nou weten waarom iets drie keer voorkomt? Daarvoor hebben we minimaal nodig:
de database-structuur, de inhoud van de betreffende tabelen én de query. Het resultaat van de query zou ook helpen. Jij geeft alleen de query en dan moeten wij proberen te achterhalen hoe de database is opgezet.
Weet je wat een 'inner join' zonder join conditions precies doet in mysql? Wat is het resultaat van je query als je die bijvoorbeeld in PHPMyAdmin invoert? Het is allemaal digitaal, dus je hoeft alleen maar te knippen/plakken.
-
26-01-2010, 07:33 #7Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
Database structuur:
Code:-- phpMyAdmin SQL Dump -- version 3.2.0.1 -- http://www.phpmyadmin.net -- -- Machine: localhost -- Genereertijd: 26 Jan 2010 om 06:31 -- Serverversie: 5.1.36 -- PHP-Versie: 5.3.0 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Database: `mwa` -- -- -------------------------------------------------------- -- -- Tabelstructuur voor tabel `gebruikers` -- CREATE TABLE IF NOT EXISTS `gebruikers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(250) NOT NULL, `wachtwoord` varchar(250) NOT NULL, `naam` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ; -- -- Gegevens worden uitgevoerd voor tabel `gebruikers` -- INSERT INTO `gebruikers` (`id`, `email`, `wachtwoord`, `naam`) VALUES (1, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca ', 'Luuk Bijveld'), (19, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'draken..'), (20, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'zdfgsdf'), (18, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'draken..'); -- -------------------------------------------------------- -- -- Tabelstructuur voor tabel `modules` -- CREATE TABLE IF NOT EXISTS `modules` ( `id` int(11) NOT NULL AUTO_INCREMENT, `module_id` int(11) NOT NULL, `module_naam` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ; -- -- Gegevens worden uitgevoerd voor tabel `modules` -- INSERT INTO `modules` (`id`, `module_id`, `module_naam`) VALUES (2, 2, 'Gebruikers beheer'), (4, 4, 'Nieuws'), (3, 3, 'Gebruiker toevoegen'); -- -------------------------------------------------------- -- -- Tabelstructuur voor tabel `rechten` -- CREATE TABLE IF NOT EXISTS `rechten` ( `id` int(11) NOT NULL AUTO_INCREMENT, `mid` int(11) NOT NULL, `gebruiker` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ; -- -- Gegevens worden uitgevoerd voor tabel `rechten` -- INSERT INTO `rechten` (`id`, `mid`, `gebruiker`) VALUES (2, 2, 'Luuk Bijveld'), (3, 3, 'Luuk Bijveld'), (4, 4, 'Luuk Bijveld'), (16, 2, 'draken..'), (15, 4, 'draken..'), (14, 2, 'draken..'), (17, 4, 'draken..'), (18, 2, 'zdfgsdf'), (19, 3, 'zdfgsdf');
-
26-01-2010, 09:05 #8
- Berichten
- 330
- Lid sinds
- 17 Jaar
Volgens mij komt het door je INNER JOIN. Je hebt ook geen voorwaarde aan je INNER JOIN verbonden. Hierdoor kunnen dubbele records ontstaan (met hetzelfde id).
Probeer dit eens (niet getest dus weet niet of het werkt).
PHP Code:SELECT
m.*
FROM
modules AS m
LEFT JOIN
rechten AS r
ON
m.module_id = r.mid
WHERE
m.gebruiker = '" . mysql_real_escape_string($_GET["gebruiker"]) . "'
GROUP BY
m.id
ORDER BY
m.id ASC
Laatst aangepast door Arjen Rademaker : 26-01-2010 om 09:14
-
26-01-2010, 09:37 #9
- Berichten
- 256
- Lid sinds
- 14 Jaar
Luuk,
Je gebruikt een vreemde manier om een database op te zetten.
Wat me opvalt:
Je gebruikt in de tabel 'modules' een 'id' en een 'module_id'. Waarom zou je dat doen. De 'id' volstaat toch?
Vervolgens heb je een tabel 'gebruikers' met o.a. een kolom 'id' en een 'naam'. Prima, hier gebruik je toch ook geen 'gebruiker_id', waarom zou je dat wel doen bij modules?
In de tabel rechten, gebruik je dan vreemd genoeg de 'naam' uit de 'gebruikers'-tabel. Dat is vreemd, want je zou hier echt het 'id' willen gebruiken! Stel voor dat 'Luuk Bijveld' later zijn naam wil wijzigen in 'Luuk Blijveld' dan moet dat in jouw geval overal worden aangepast. Dat is nou net niet de bedoeling. Of 2 gebruikers die toevallig dezelfde voor een achternaam hebben (Jan de Vries)? Gebruik dus liever het 'id' veld. Dat is ook nog eens veel efficienter voor de database engine.
De tabel 'Rechten' zou dan een zogenaamde cross-table moeten worden. Die heb je nodig voor veel-op-veel relaties in relationele databases.
In die tabel heb je dan slechts 2 kolommen nodig die samen een primary key vormen:
gebruiker_id (verwijst naar gebruiker.id)
module_id (verwijst naar module.id)
Code:CREATE TABLE `gebruikers` ( `id` int(11) NOT NULL auto_increment, `email` varchar(250) NOT NULL, `wachtwoord` varchar(250) NOT NULL, `naam` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ; -- -- Dumping data for table `gebruikers` -- INSERT INTO `gebruikers` VALUES(1, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca ', 'Luuk Bijveld'); INSERT INTO `gebruikers` VALUES(19, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'draken..'); INSERT INTO `gebruikers` VALUES(20, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'zdfgsdf'); INSERT INTO `gebruikers` VALUES(18, '[email protected]', 'acaba87c90a738373fafccd5a0f0eaca', 'draken23'); -- -------------------------------------------------------- -- -- Table structure for table `modules` -- CREATE TABLE `modules` ( `id` int(11) NOT NULL auto_increment, `naam` varchar(250) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ; -- -- Dumping data for table `modules` -- INSERT INTO `modules` VALUES(2, 'Gebruikers beheer'); INSERT INTO `modules` VALUES(4, 'Nieuws'); INSERT INTO `modules` VALUES(3, 'Gebruiker toevoegen'); -- -------------------------------------------------------- -- -- Table structure for table `rechten` -- CREATE TABLE `rechten` ( `gebruiker_id` int(11) NOT NULL, `module_id` int(11) NOT NULL, PRIMARY KEY (`gebruiker_id`,`module_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Dumping data for table `rechten` -- INSERT INTO `rechten` VALUES(1, 2); INSERT INTO `rechten` VALUES(1, 4); INSERT INTO `rechten` VALUES(18, 2); INSERT INTO `rechten` VALUES(18, 3); INSERT INTO `rechten` VALUES(19, 2); INSERT INTO `rechten` VALUES(19, 3); INSERT INTO `rechten` VALUES(19, 4);
Code:SELECT m.naam as Modulenaam , MAX( r.module_id = m.id ) AS Rechten FROM modules m JOIN ( rechten r LEFT JOIN gebruikers g ON ( g.id = r.gebruiker_id ) ) WHERE r.gebruiker_id =1 GROUP BY m.naam
resultaat:
Code:Modulenaam Rechten Gebruiker toevoegen 0 Gebruikers beheer 1 Nieuws 1
-
27-01-2010, 16:46 #10Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
Sorry, mar hij doet het niet..
-
27-01-2010, 16:48 #11
- Berichten
- 330
- Lid sinds
- 17 Jaar
Daar hebben we veel aan zeg..... Wat doet het niet? Welke foutmeldingen krijg je? Wat heb je geprobeerd? Wel een erg passieve houding zo.
-
27-01-2010, 17:08 #12Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
Sorry voor het vorig antwoord. Maar ik heb nu zelf iets geprobeerd. Gewoon een group by in mijn eigen query zetten. Ik krijg dan gewoon elke module maar 1x dat probleem is nu opgelost. Maar er is een volgend probleem ontstaan daardoor, ik heb zelf alle rechten tot alles. Maar hij laat dat niet zien.
Even voor de duidelijkheid: Dit was voor de nieuwe query:
Nieuws 1
Nieuws 0
Niuews 0
Gebruikers beheer 0
Gebruikers beheer 1
gebruiers beheer 0
Gebruiker toevoegen 0
Gebruiker toevoegen 0
Gebruiker toevoegen 1
De nieuwe query:
Nieuws 1
Gebruikers beheer 0
Gebruiker toevoegen 0
Je ziet dat hij nou bij het beheer en toevoegen niet laat zien dat ik daar de rechten voor heb. Hoe kan ik zorgen dat hij dat wel laat zien?
Aanvullend bericht:
Zie voor de nieuwe query mijn beginpostLaatst aangepast door gast17013 : 27-01-2010 om 17:09 Reden: Automatisch samengevoegd.
-
27-01-2010, 17:09 #13
- Berichten
- 330
- Lid sinds
- 17 Jaar
Kan je je totale query posten wat je nu gebruikt? En gebruik je nog steeds de begin indeling van de database of heb je het aangepast aan de hand van de post van Ruud (dit alleen even voor de duidelijkheid).
-
27-01-2010, 17:10 #14
- Berichten
- 256
- Lid sinds
- 14 Jaar
Luuk, er zijn mensen die soms veel werk in een vraag steken. Jouw vraag is er één waar ik best even op heb zitten kl*ten. Deels omdat ik het zelf interessant vind om zoiets uit te zoeken, deels om jou op weg te helpen. Immers, we moeten allemaal onderaan beginnen.
Maar, het lijkt me niet meer dan redelijk dat je zelf ook wat investeert.
De query zou gewoon moeten werken op een beetje standaard MySQL server. Tenminste als je ook de tabellen over hebt genomen zoals ik die heb gepost.
De query die ik laat zien is overigens te uitgebreid (2 joins erin) maar dat komt omdat ik initieel ook de naam van de gebruiker wilde tonen. Dit is echter niet nodig dus onderstaande query volstaat:
Code:SELECT m.naam as Modulenaam , MAX( r.module_id = m.id ) AS Rechten FROM modules m JOIN rechten r WHERE r.gebruiker_id =1 GROUP BY m.naam
Code:SELECT m.naam as Modulenaam , g.naam AS Gebruiker, MAX( r.module_id = m.id ) AS Rechten FROM modules m JOIN ( rechten r LEFT JOIN gebruikers g ON ( g.id = r.gebruiker_id ) ) WHERE r.gebruiker_id =1 GROUP BY m.naam, g.naam
Ome Ruud.
-
27-01-2010, 17:36 #15Particulier
- Berichten
- 394
- Lid sinds
- 15 Jaar
Sorry verkeerd
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic