SELECT criteria niet het gewenste resultaat maar geeft ook geen melding

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- DHU -

- DHU -

26/05/2020 21:09:54
Quote Anchor link
Hallo PHP'ers en SQL' ers,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)">&nbsp;&nbsp;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 -
 
PHP hulp

PHP hulp

15/07/2020 02:43:51
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/05/2020 12:53:16
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($sqlAantal > 0) {
    $pointer = 1;
    echo '<table>';
    while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
        if ($pointer === 1) {
            // toon tabel kop
        }
        // toon data
        $pointer++;
    }

    echo '</table>';
}

?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Of helemaal volgens het boekje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 27/05/2020 12:53:56 door Ger van Steenderen
 
Thomas van den Heuvel

Thomas van den Heuvel

27/05/2020 13:00:25
Quote Anchor link
Ik denk dat die GROUP BY roet in het eten gooit? Haal deze gewoon weg? Waar groepeer je uberhaupt op?

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($sqlAantal > 0) {
    $pointer = 1;
    echo '<table>';
    while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
        if ($pointer === 1) {
            // toon tabel kop
        }
        // toon data
        $pointer++;
    }

    echo '</table>';
}

?>

Dat kan korter :p
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if ($sqlAantal > 0) {
    echo '<table>';
    // toon tabel kop
    while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
        // toon data
    }
    echo '</table>';
}

?>
Gewijzigd op 27/05/2020 13:04:39 door Thomas van den Heuvel
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/05/2020 13:54:48
Quote Anchor link
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:
Dat kan korter :p
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if ($sqlAantal > 0) {
    echo '<table>';
    // toon tabel kop
    while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
        // toon data
    }
    echo '</table>';
}

?>

Wat als er gegevens van het eerste record in de tabelkop moeten?
 
Thomas van den Heuvel

Thomas van den Heuvel

27/05/2020 15:35:22
Quote Anchor link
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.
 
- DHU -

- DHU -

27/05/2020 16:47:30
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($sqlAantal > 0) {
    $pointer = 1;
    echo '<table>';
    while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){
        if ($pointer === 1) {
            // toon tabel kop
        }
        // toon data
        $pointer++;
    }

    echo '</table>';
}

?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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

Of helemaal volgens het boekje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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




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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.