SELECT criteria niet het gewenste resultaat maar geeft ook geen melding
Ik zit al een aantal dagen blind te starten op een SELECT criteria en ik kom er niet uit. Wanner ik de SQL uitvoer dan krijg ik geen enkele foutmelding op scherm maar ik heb niet het uiteindelijke resultaat waar ik op hoopte... De laatste schakeling die ik nodig heb is het tonen van een rolnaam. Maar dus niet... Wil graag de hulp inroepen of iemand met me mee wil kijken naar mijn code...
De situatie is:
Ik heb vier entiteiten:
1 personen
2 rollen
3 activiteiten
4 autorisaties
en ik heb 3 koppeltabbelen
1 person2role
2 role2act
3 act2aut
nu wil een overzicht maken van een aan een persoon gekoppelde autorisatie die op haar beurt gekoppeld is aan een activteit en gekoppeld is aan een rol.
Nu staar ik me al 3 dagen blind over het laatste stuk. Ik heb ondertaand function gedefineerd. Deze toont bijna alle gegevens die ik wil. Echter het laatste stukje dus net niet.. hij toont de rol niet op het scherm. Bij het uitvoeren krijg ik ook geen foutmelding of wat dan ook.. dus waarschijnlijk een JOIN-dingetje oid. Maar ik ziet het domweg niet en geen melding... dus het blijft gissen. Natuurlijk kan ik de rol uit een aantal andere velden halen zoals bijvoorbeeld uit koppeltabel 'person2role' of 'role2act'. Ja hij laat dan ook een waarde zien. Maar ik wil de rol uit de tabel `idm_role` (uniekKenmerkRol) halen.. maar wanneer ik die aanroep krijg ik op de plek waar ik de rolnaam verwacht een blanco regel. Ik zie echter niet in waarom dit is. Maar van al die JOINS word ik ietwat tureluurs :-)
Zou iemand aub met me mee willen kijken wat er nu speelt? ik kom er niet uit... het stokt een beetje.
Hieronder heb ik de gehele code van de functie geplakt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
function medewerkerAutorisatie (){
global $connection;
$where = NULL;
if (isset($_GET['uniekKenmerkPerson'])){
$where = 'WHERE idm_person.MSKEYVALUE_MEDEWERKER = "'.mysqli_real_escape_string($connection, $_GET['uniekKenmerkPerson']).'" ';
}
$sqlUitlezen = mysqli_query($connection, "SELECT
idm_person.MSKEYVALUE_MEDEWERKER AS uniekKenmerkPerson,
idm_person.MX_CALLNAME AS voornaam,
idm_person.MX_LASTNAME AS achternaam,
idm_person2role.MSKEYVALUE_ROL,
idm_role2act.MSKEYVALUE_ROL,
idm_role2act.MSKEYVALUE_ACTIVITEIT,
idm_autorisatie.MSKEYVALUE_AUTORISATIE AS uniekKenmerkAutorisatie,
idm_autorisatie.MSKEYVALUE_DOELSYSTEEM AS uniekKenmerkDoelsysteem,
idm_autorisatie.MX_DISABLED,
idm_autorisatie.Z_PRIVILEGE_HBR,
idm_act2aut.MSKEYVALUE_ACTIVITEIT,
idm_activiteit.MSKEYVALUE_ACTIVITEIT AS uniekKenmerkActiviteit,
idm_role.MSKEYVALUE_ROL AS uniekKenmerkRol
FROM `idm_person`
LEFT JOIN `idm_person2role` ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN `idm_role2act` ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
LEFT JOIN `idm_act2aut` ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
LEFT JOIN `idm_autorisatie` ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
LEFT JOIN `idm_activiteit` ON idm_act2aut.MSKEYVALUE_ACTIVITEIT = idm_activiteit.MSKEYVALUE_ACTIVITEIT
LEFT JOIN `idm_role` ON idm_role2act.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
".$where."
GROUP BY idm_autorisatie.MSKEYVALUE_AUTORISATIE
");
$sqlAantal = mysqli_num_rows($sqlUitlezen);
$sqlData = mysqli_fetch_assoc($sqlUitlezen);
if ($sqlAantal > 1){
echo '<table id="idmdata">';
echo '<tr>';
if(($sqlAantal == 1)){
echo '<th colspan="5">'.$sqlData['voornaam'].' '.$sqlData['achternaam'].' heeft '.$sqlAantal.' autorisatie gekoppeld</th>';
}else{
echo '<th colspan="5">'.$sqlData['voornaam'].' '.$sqlData['achternaam'].' heeft '.$sqlAantal.' autorisaties gekoppeld</th>';
}
echo '</tr>';
echo '<tr>';
echo '<td colspan="4"><b>Autorisatie</b></td>';
echo '<td><b>Doelsysteem</b></td>';
echo '</tr>';
while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
echo '<tr>';
echo '<td width="1%"><a href="?actie=autcard&uniek_kenmerk='.strtolower($sqlData['uniekKenmerkAutorisatie']).'"><img src="../img/plus.png" height="14"></td>';
echo '<td>
<b>'.$sqlData['uniekKenmerkAutorisatie'].'</b>
<font size="-2">
<li><i>'.$sqlData['uniekKenmerkActiviteit'].'</i></li>
<li><b><i>'.$sqlData['uniekKenmerkRol'].'</i></b></li>
</font>
</td>';
if($sqlData['MX_DISABLED'] == 1){
echo '<td width="1%"><img src="../img/icon_inactive.png" height="14"></td>';
}else{
echo '<td width="1%"><img src="../img/icon_active.png" height="14"></td>';
}
if($sqlData['Z_PRIVILEGE_HBR'] != NULL){
echo '<td width="1%"><img src="../img/hoog_recht.png" height="14"></td>';
}else{
echo '<td width="1%"></td>';
}
echo '<td>'.$sqlData['uniekKenmerkDoelsysteem'].'</td>';
echo '</tr>';
}
echo '<th colspan="5"><button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button></th>';
echo '</tr>';
echo '</table>';
}else{
echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png" height="50%"></a></center>';
}
}
?>
function medewerkerAutorisatie (){
global $connection;
$where = NULL;
if (isset($_GET['uniekKenmerkPerson'])){
$where = 'WHERE idm_person.MSKEYVALUE_MEDEWERKER = "'.mysqli_real_escape_string($connection, $_GET['uniekKenmerkPerson']).'" ';
}
$sqlUitlezen = mysqli_query($connection, "SELECT
idm_person.MSKEYVALUE_MEDEWERKER AS uniekKenmerkPerson,
idm_person.MX_CALLNAME AS voornaam,
idm_person.MX_LASTNAME AS achternaam,
idm_person2role.MSKEYVALUE_ROL,
idm_role2act.MSKEYVALUE_ROL,
idm_role2act.MSKEYVALUE_ACTIVITEIT,
idm_autorisatie.MSKEYVALUE_AUTORISATIE AS uniekKenmerkAutorisatie,
idm_autorisatie.MSKEYVALUE_DOELSYSTEEM AS uniekKenmerkDoelsysteem,
idm_autorisatie.MX_DISABLED,
idm_autorisatie.Z_PRIVILEGE_HBR,
idm_act2aut.MSKEYVALUE_ACTIVITEIT,
idm_activiteit.MSKEYVALUE_ACTIVITEIT AS uniekKenmerkActiviteit,
idm_role.MSKEYVALUE_ROL AS uniekKenmerkRol
FROM `idm_person`
LEFT JOIN `idm_person2role` ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN `idm_role2act` ON idm_person2role.MSKEYVALUE_ROL = idm_role2act.MSKEYVALUE_ROL
LEFT JOIN `idm_act2aut` ON idm_role2act.MSKEYVALUE_ACTIVITEIT = idm_act2aut.MSKEYVALUE_ACTIVITEIT
LEFT JOIN `idm_autorisatie` ON idm_act2aut.MSKEYVALUE_AUTORISATIE = idm_autorisatie.MSKEYVALUE_AUTORISATIE
LEFT JOIN `idm_activiteit` ON idm_act2aut.MSKEYVALUE_ACTIVITEIT = idm_activiteit.MSKEYVALUE_ACTIVITEIT
LEFT JOIN `idm_role` ON idm_role2act.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
".$where."
GROUP BY idm_autorisatie.MSKEYVALUE_AUTORISATIE
");
$sqlAantal = mysqli_num_rows($sqlUitlezen);
$sqlData = mysqli_fetch_assoc($sqlUitlezen);
if ($sqlAantal > 1){
echo '<table id="idmdata">';
echo '<tr>';
if(($sqlAantal == 1)){
echo '<th colspan="5">'.$sqlData['voornaam'].' '.$sqlData['achternaam'].' heeft '.$sqlAantal.' autorisatie gekoppeld</th>';
}else{
echo '<th colspan="5">'.$sqlData['voornaam'].' '.$sqlData['achternaam'].' heeft '.$sqlAantal.' autorisaties gekoppeld</th>';
}
echo '</tr>';
echo '<tr>';
echo '<td colspan="4"><b>Autorisatie</b></td>';
echo '<td><b>Doelsysteem</b></td>';
echo '</tr>';
while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
echo '<tr>';
echo '<td width="1%"><a href="?actie=autcard&uniek_kenmerk='.strtolower($sqlData['uniekKenmerkAutorisatie']).'"><img src="../img/plus.png" height="14"></td>';
echo '<td>
<b>'.$sqlData['uniekKenmerkAutorisatie'].'</b>
<font size="-2">
<li><i>'.$sqlData['uniekKenmerkActiviteit'].'</i></li>
<li><b><i>'.$sqlData['uniekKenmerkRol'].'</i></b></li>
</font>
</td>';
if($sqlData['MX_DISABLED'] == 1){
echo '<td width="1%"><img src="../img/icon_inactive.png" height="14"></td>';
}else{
echo '<td width="1%"><img src="../img/icon_active.png" height="14"></td>';
}
if($sqlData['Z_PRIVILEGE_HBR'] != NULL){
echo '<td width="1%"><img src="../img/hoog_recht.png" height="14"></td>';
}else{
echo '<td width="1%"></td>';
}
echo '<td>'.$sqlData['uniekKenmerkDoelsysteem'].'</td>';
echo '</tr>';
}
echo '<th colspan="5"><button class="button1" style="vertical-align:middle"><span><div id="button"><a href="javascript:javascript:history.go(-1)"> Vorige pagina</a></div></span></button></th>';
echo '</tr>';
echo '</table>';
}else{
echo '<center><a href="javascript:javascript:history.go(-1)"><img src="../img/no-data.png" height="50%"></a></center>';
}
}
?>
ps... graaf niet op de opmaak letten... die gaat nog in een css verwerkt worden...
Gewijzigd op 26/05/2020 21:14:24 door - DHU -
mysqli_fetch_assoc leest een record, en zet de interne pointer een record verder.
Dus op regel 51 bevat $sqlData de gegevens van het eerste record, op regel 70 begin je met het tweede record.
Dit zal beter werken:
Code (php)
Daarnaast koppel je in de query de tabel idm_role aan idm_role2act, dat betekent indien een pesoon een rol heeft die geen activitieit gekoppeld heeft de waarden uit tabel idm_role leeg zijn.
Anders wordt het als je dit wijzigt in:
Code (php)
1
2
3
4
2
3
4
LEFT JOIN idm_person2role
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
Of helemaal volgens het boekje:
Code (php)
1
2
3
4
2
3
4
LEFT JOIN (idm_person2role
INNER JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL)
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
INNER JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL)
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
Gewijzigd op 27/05/2020 12:53:56 door Ger van Steenderen
Voor de idm_activiteit en idm_role tabellen kun je volgens mij ook rustig een INNER JOIN gebruiken, aangenomen dat de id's in de koppeltabellen ook bestaan in de overeenkomstige tabellen waar ze naar verwijzen. Dat zou moeten kloppen in een echte relationele database, ik hoop dat je dit ook afdwingt met foreign keys en alles (database-engine hopelijk InnoDB?).
Kijk eerst eens of de bovenstaande aanpassingen wel het gewenste resultaat opleveren, en dan (vervolgstap, apart probleem) zou je na kunnen gaan denken hoe je deze resultaten in een tabel giet. Het kan helpen om deze eerst in een datastructuur in PHP (genest array) te zetten, zodat het genereren van de tabel makkelijker wordt. Zo zou je op die manier rowspans van tevoren uit kunnen rekenen ofzo. Maar goed, opmaak is van latere zorg, het is eerst zaak dat je query de juiste resultaten teruggeeft.
EDIT: en ja wat @Ger zegt, je haalt (oa) aan het begin al een record op waar je niets mee doet :).
Code (php)
Dat kan korter :p
Code (php)
Gewijzigd op 27/05/2020 13:04:39 door Thomas van den Heuvel
Thomas van den Heuvel op 27/05/2020 13:00:25:
Voor de idm_activiteit en idm_role tabellen kun je volgens mij ook rustig een INNER JOIN gebruiken, aangenomen dat de id's in de koppeltabellen ook bestaan in de overeenkomstige tabellen waar ze naar verwijzen. Dat zou moeten kloppen in een echte relationele database, ik hoop dat je dit ook afdwingt met foreign keys en alles (database-engine hopelijk InnoDB?).
Nee, niet als je de joins achter elkaar zet zoals in mijn eerste voorbeeld, dan moet je doorgaan met LEFT JOIN anders maak je van de eerste LEFT JOIN ook een INNER JOIN.
Vandaar ook het tweede 'volgens het boekje' voorbeeld ;-)
Thomas van den Heuvel op 27/05/2020 13:00:25:
Wat als er gegevens van het eerste record in de tabelkop moeten?
Ger van Steenderen op 27/05/2020 13:54:48:
Wat als er gegevens van het eerste record in de tabelkop moeten?
Eh, fair enough. Maar dan zou ik sowieso het ophalen van de data en (tegelijkertijd/on-the-fly) het in een HTML-tabel proppen misschien wat verder uit elkaar splitsen. Wat je ophaalt en hoe je dit vervolgens weergeeft zijn echt twee verschillende dingen.
Ger van Steenderen op 27/05/2020 12:53:16:
Het is een combinatie van factoren.
mysqli_fetch_assoc leest een record, en zet de interne pointer een record verder.
Dus op regel 51 bevat $sqlData de gegevens van het eerste record, op regel 70 begin je met het tweede record.
Dit zal beter werken:
Dit lever exact hetzelfde resultaat het uniekKenmerkRol wordt niet getoond. Maar ook hier krijg ik geen melding wat er niet goed gaat....
Daarnaast koppel je in de query de tabel idm_role aan idm_role2act, dat betekent indien een pesoon een rol heeft die geen activitieit gekoppeld heeft de waarden uit tabel idm_role leeg zijn.
Anders wordt het als je dit wijzigt in:
Of helemaal volgens het boekje:
mysqli_fetch_assoc leest een record, en zet de interne pointer een record verder.
Dus op regel 51 bevat $sqlData de gegevens van het eerste record, op regel 70 begin je met het tweede record.
Dit zal beter werken:
Code (php)
Dit lever exact hetzelfde resultaat het uniekKenmerkRol wordt niet getoond. Maar ook hier krijg ik geen melding wat er niet goed gaat....
Daarnaast koppel je in de query de tabel idm_role aan idm_role2act, dat betekent indien een pesoon een rol heeft die geen activitieit gekoppeld heeft de waarden uit tabel idm_role leeg zijn.
Anders wordt het als je dit wijzigt in:
Code (php)
1
2
3
4
2
3
4
LEFT JOIN idm_person2role
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
LEFT JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL
Of helemaal volgens het boekje:
Code (php)
1
2
3
4
2
3
4
LEFT JOIN (idm_person2role
INNER JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL)
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
INNER JOIN idm_role
ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL)
ON idm_person.MSKEYVALUE_MEDEWERKER = idm_person2role.MSKEYVALUE_MEDEWERKER
Misschien moet ik even toelichten wat het gewenste resultaat is. Ik vraag een overzicht van autorisaties die aan een persoon is gekoppeld. Dat is niet het issue dus... dat lukt zonder problemen. Maar ik wil graag dan per autorisatie zien aan welke activiteit aan welk rol is gekoppeld. Dus niet wel rol iemand heeft en welk activeit -> autorisaties daar dan onderhangen. Dat is namelijk een andere benadering en kan je autorisaties mislopen. Dus ik wil bottom up kijken en niet top down.
De JOIN die hierboven staat staat ook mijn gebruikte JOINS
en de genoemde INNER JOIN idm_role ON idm_person2role.MSKEYVALUE_ROL = idm_role.MSKEYVALUE_ROL) bewerkstelligt naar mijn idee de Top Down methodiek...
Moet nu eerst weg... ga hier vanavand nog verder mee stoeien.... Ieders alvast bedankt voor het meedenken en voor de suggesies.