Velden 2e tabel niet herkend bij gebruik van INNER JOIN

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dirk Huizinga

Dirk Huizinga

03/02/2019 13:12:17
Quote Anchor link
Hoi PHP vrienden,

ik heb twee tabellen OU en Person.

Hieronder de functie waarom het gaat. Ik maak in mijn SQL een INNER JOIN maar ik krijg bij de uitvoer helaas een foutmelding die ik niet kan plaatsen.. Maar ik ben nog niet zo'n expert in deze... ik dacht dat het zo moest werken.. maar waar het niet goed gaat kan ik niet verklaren. Iemand die daarbij kan en wil helpen?


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
//------------------------------------------------------------------------ FUNCTIE Divisie
    function divisie (){
        global $connection;
        
        
        $where = NULL;
        if (isset($_GET['ou'])){
            $where  = 'WHERE Z_ORG_CODE = "'.mysqli_real_escape_string($connection, $_GET['ou']).'"';
        }
                
        $sqlUitlezen = mysqli_query($connection, $sql = "
        SELECT
            ou.MSKEYVALUE_OU,
            ou.DISPLAYNAME,
            ou.Z_MX_VALIDTO,
            ou.Z_REFERENCE_MX_MANAGER,
            ou.Z_ORG_CODE
            person.
        FROM
            ou
        INNER JOIN
            person
        ON
            ou.Z_REFERENCE_MX_MANAGER = person.MSKEYVALUE_MEDEWERKER    
            
        ".$where." OR Z_ORG_DN_CODE LIKE '%" . mysqli_real_escape_string($connection, $_GET['ou'] ?? null) . "%'
    
        AND
            Z_MX_VALIDTO = '31-12-9999'
        AND
            MSKEYVALUE_OU <> 'OU:99999999'
        AND
            MSKEYVALUE_OU <> 'OU:88888888'
        AND
            MSKEYVALUE_OU <> 'OU:50317636'
        AND
            MSKEYVALUE_OU <> 'OU:50190318'
        AND
            MSKEYVALUE_OU <> 'OU:11111111'
        ORDER BY
            MSKEYVALUE_OU ASC
        ");
        
        $sqlAantal = mysqli_num_rows($sqlUitlezen);
        
        if ($sqlAantal > 0){
            echo '<article>';
            echo '<table id="customers">';
            echo '    <tr>';
            echo '    <td colspan="4" align="right"><h3>Aantal afdelingen binnen deze divisie ('.$sqlAantal.')</h3></td>';
            echo '    </tr>';
            echo '  <tr>';
            echo '    <th><h4>OU code</h4></th>';
            echo '    <th><h4>Divisie</h4></th>';
            echo '    <th colspan="2"><h4>Manager</h4></th>';
            echo '    </tr>';
                        
            while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){    
            
            echo '  <tr>';
            echo '    <td><h6>'.$sqlData['MSKEYVALUE_OU'].'</h6></td>';
            echo '    <td><h6>'.$sqlData['DISPLAYNAME'].'</h6></td>';
            echo '    <td><h6>'.$sqlData['MSKEYVALUE_MEDEWERKER'].'</h6></td>';
            echo '    <td align="center">
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tr>
                            <!--
                                <td><a href="ou.php?actie=divisie&ou='.str_replace(' ','+',$sqlData['Z_ORG_CODE']).'"><img src="../img/icon-afdelingen.png" height="20" title="Afdelingen"></a></td>
                            -->
                            <td><a href="person.php?actie=divisie2medewerkers&ou='.str_replace(' ','+',$sqlData['MSKEYVALUE_OU']).'"><img src="../img/icon-personen.png" height="20" title="Medewerkers"></a></td></td>
                            <!--
                            <td><img src="../img/icon-rollen.png" height="20" title="Rollen"></td>
                            -->
                            <td><A HREF="javascript:javascript:history.go(-1)"><img src="../img/icon-pagina-terug.png" height="12" title="Vorige pagina"></a></td>
                            
                            </tr>
                        </table>
                    </td>';
            echo '  </tr>';
            }
            echo '</table>';
            
            echo '</article>';
        }else{
            echo '<h3>Sorry, ik heb geen OU'."'s".' kunnen vinden!</h3>';
        }
    }
    //------------------------------------------------------------------------ einde functie



de foutmelding die ik krijg is:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\bp\members\inc\plugin.php on line 132

line 132 een line die in de bovengenoemde functie staat.. .te weten: $sqlAantal = mysqli_num_rows($sqlUitlezen);
 
PHP hulp

PHP hulp

15/02/2019 21:10:07
 
- Ariën -
Beheerder

- Ariën -

03/02/2019 13:45:37
Quote Anchor link
PHP zegt nu enkel dat het fout gaat, en dat hij een boolean terugkrijgt i.p.v. result. Dus vraag eens nanens PHP aan MySQL wat er fout gaat door mysqli_error($connection); te gebruiken.

$sql even tijdelijk outputten helpt ook vaak mee bij dergelijke debugging.
Gewijzigd op 03/02/2019 13:46:26 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

03/02/2019 14:07:18
Quote Anchor link
Hoi Ariën

ik heb
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo mysqli_error($connection);

direct onder MySqli en vóór
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sqlAantal = mysqli_num_rows($sqlUitlezen);
geplaats en ik krijg onderstaande return:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. FROM ou INNER JOIN person ON ou.Z_REFERENCE_MX_MANAGER ' at line 7

Maar dit is voor me acacadabra ik snap niet goed wat er nu staat.
 
Ozzie PHP

Ozzie PHP

03/02/2019 14:14:10
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
  ou.MSKEYVALUE_OU,
  ou.DISPLAYNAME,
  ou.Z_MX_VALIDTO,
  ou.Z_REFERENCE_MX_MANAGER,
  ou.Z_ORG_CODE
  person.

Aan het eind gaat hier iets fout. Haal die "person." eens weg en kijk eens wat er dan gebeurt.
 
Bart Smulders

Bart Smulders

03/02/2019 14:14:31
Quote Anchor link
Bij de mysqli_real_escape_string stelde ik mij de vraag of hij daar geen fouten op geeft.
Wat bij waar en wat bij niet waar.
Van PHP versie 7 is gebruik met ?? ook toegelaten maar misschien beter deze functie buiten query zetten?

mysqli_real_escape_string($connection, (($_GET['ou']) ? 'null' : 'False'));

Ik heb de () rond je var $_GET geplaatst en rond de functie.

Je hebt pas je controle of er output is nadat je de gegevens wil gaan tonen...

Als voorbeeld
$results = $mysqli->query("SELECT * FROM table");
if($results->num_rows === 0) <---------Dit mis je
{
echo 'No results';
}
else
{
//HERE YOU PROCESS
while(){....}
}
 
Rob Doemaarwat

Rob Doemaarwat

03/02/2019 14:40:20
Quote Anchor link
Dirk Huizinga op 03/02/2019 14:07:18:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. FROM ou INNER JOIN person ON ou.Z_REFERENCE_MX_MANAGER ' at line 7

Vanaf dat punt snapt MySQL het ook niet meer.

Ozzie PHP op 03/02/2019 14:14:10:
Haal die "person." eens weg en kijk eens wat er dan gebeurt.


Die "person." is (vermoedelijk) wel het probleem, en weghalen zal het wel oplossen, maar ik neem aan dat je hier "person.*" bedoelde (= "alle velden uit de person tabel").

Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
            ou.MSKEYVALUE_OU,
            ou.DISPLAYNAME,
            ou.Z_MX_VALIDTO,
            ou.Z_REFERENCE_MX_MANAGER,
            ou.Z_ORG_CODE
            person.*
        FROM
            ou
        INNER JOIN
            person
//enz
 
Dirk Huizinga

Dirk Huizinga

03/02/2019 15:28:07
Quote Anchor link
Ozzie PHP op 03/02/2019 14:14:10:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
  ou.MSKEYVALUE_OU,
  ou.DISPLAYNAME,
  ou.Z_MX_VALIDTO,
  ou.Z_REFERENCE_MX_MANAGER,
  ou.Z_ORG_CODE
  person.

Aan het eind gaat hier iets fout. Haal die "person." eens weg en kijk eens wat er dan gebeurt.



ooopsie... die person. achter de select is nog 'n restantje van een probeersel. Heeft niet geholpen. Wanneer ik weghaal en ik execute de sql weer dan krijg ik de foutmelding:

Notice: Undefined index: MSKEYVALUE_MEDEWERKER in C:\wamp64\www\bp\members\inc\plugin.php on line 152

en laat die MSKEYVALUE_MEDEWERKER nou net één van de waarden van mij INNER JOIN zijn.



Toevoeging op 03/02/2019 15:35:59:

Bart Smulders op 03/02/2019 14:14:31:
Bij de mysqli_real_escape_string stelde ik mij de vraag of hij daar geen fouten op geeft.
Wat bij waar en wat bij niet waar.
Van PHP versie 7 is gebruik met ?? ook toegelaten maar misschien beter deze functie buiten query zetten?

mysqli_real_escape_string($connection, (($_GET['ou']) ? 'null' : 'False'));

Ik heb de () rond je var $_GET geplaatst en rond de functie.

Je hebt pas je controle of er output is nadat je de gegevens wil gaan tonen...

Als voorbeeld
$results = $mysqli->query("SELECT * FROM table");
if($results->num_rows === 0) <---------Dit mis je
{
echo 'No results';
}
else
{
//HERE YOU PROCESS
while(){....}
}




Toevoeging op 03/02/2019 15:37:04:

Bart Smulders op 03/02/2019 14:14:31:
Bij de mysqli_real_escape_string stelde ik mij de vraag of hij daar geen fouten op geeft.
Wat bij waar en wat bij niet waar.
Van PHP versie 7 is gebruik met ?? ook toegelaten maar misschien beter deze functie buiten query zetten?

mysqli_real_escape_string($connection, (($_GET['ou']) ? 'null' : 'False'));

Ik heb de () rond je var $_GET geplaatst en rond de functie.


Sorry Bart,
Hier raak je me kwijt. Sorry. Maar ik weet niet goed wat ik hiermee kan en of zou moeten.

Je hebt pas je controle of er output is nadat je de gegevens wil gaan tonen...

Als voorbeeld
$results = $mysqli->query("SELECT * FROM table");
if($results->num_rows === 0) <---------Dit mis je
{
echo 'No results';
}
else
{
//HERE YOU PROCESS
while(){....}
}




Toevoeging op 03/02/2019 15:41:15:

Rob Doemaarwat op 03/02/2019 14:40:20:
Dirk Huizinga op 03/02/2019 14:07:18:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. FROM ou INNER JOIN person ON ou.Z_REFERENCE_MX_MANAGER ' at line 7

Vanaf dat punt snapt MySQL het ook niet meer.

Ozzie PHP op 03/02/2019 14:14:10:
Haal die "person." eens weg en kijk eens wat er dan gebeurt.


Die "person." is (vermoedelijk) wel het probleem, en weghalen zal het wel oplossen, maar ik neem aan dat je hier "person.*" bedoelde (= "alle velden uit de person tabel").

Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
            ou.MSKEYVALUE_OU,
            ou.DISPLAYNAME,
            ou.Z_MX_VALIDTO,
            ou.Z_REFERENCE_MX_MANAGER,
            ou.Z_ORG_CODE
            person.*
        FROM
            ou
        INNER JOIN
            person
//enz





wanneer ik person. vervang door person.* (wat voor alle velden staat) volgt de melding:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\bp\members\inc\plugin.php on line 133


Toevoeging op 03/02/2019 16:06:23:

dom dom dom.....
wanneer je de select heel erg goed kijkt heb
het laatste veld welk ik uitlees uit de tabel ou NIET afgesloten met een ,

daar staat en valt het dus mee...

maar ik wil jullie bedank voor jullie aanvullingen, tips en handvaten...
want door het plaatsen van die komma.. heb ik gewenste result

(topic mag gesloten worden)
 
- Ariën -
Beheerder

- Ariën -

03/02/2019 16:08:06
Quote Anchor link
Wat een brei aan quote-blokken :-p

Maar je haalt MSKEYVALUE_MEDEWERKER niet op in je SELECT.

Edit: Mooi dat het opgelost is.
Gewijzigd op 03/02/2019 16:17:13 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

03/02/2019 16:26:40
Quote Anchor link
Het gaat hier ook niet zozeer om dit specifieke probleem (de realisatie dat dit probleem niet uniek is is ook handig, gooi de foutmelding maar eens in de Goegel) maar meer hoe je hier mee omgaat.

In een ander topic is precies hetzelfde aan de hand.

Het enige advies wat ik je kan geven is dat je leert dit soort foutmeldingen te lezen.

De beste manier om te leren programmeren is wat mij betreft nog steeds door te leren debuggen.
 



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.