niet werkende functie... zie alleen het issus niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dirk Huizinga

Dirk Huizinga

13/07/2019 16:52:43
Quote Anchor link
Hi guys,


hieronder een functie welken net werkt.

ergens zit een issue maar zie niet waar. Krijg de foutmelding Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in

Maar zie het gewoon niet... zal wel weer zo'n oh,ja dingetje zijn..

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
    function abu (){
        global $connection;
        
        $where = NULL;
        if (isset($_GET['ou'])){
            $where = 'WHERE Z_ORG_DN_CODE LIKE "%'.mysqli_real_escape_string($connection, $_GET['ou']).'%"';
        }
        
        $sqlUitlezen = mysqli_query($connection,
        $sql = "SELECT
        idm_ou.MSKEYVALUE_OU,
        idm_ou.DISPLAYNAME,
        idm_ou.Z_ORG_CODE,
        idm_ou.Z_ORG_DN_CODE,
        idm_ou.Z_REFERENCE_MX_MANAGER,
        idm_person.MX_LASTNAME,
        idm_person.ACHMEA_EMPLOYEENUMBER
        
        FROM idm_ou ".$where."
        
        INNER JOIN idm_person ON idm_ou.Z_REFERENCE_MX_MANAGER = idm_person.MSKEYVALUE_MEDEWERKER
        
        ORDER BY `MSKEYVALUE_OU` ASC");
        
        $sqlAantal = mysqli_num_rows($sqlUitlezen);
        
        if ($sqlAantal > 0){
            while ($sqlData = mysqli_fetch_assoc($sqlUitlezen)){    
            
            echo '<table border="0">';
            echo '<tr>';
            echo '<td><a href="?actie=abu&ou='.$sqlData['MSKEYVALUE_OU'].'"><img src="../img/pointer.png" height="14"></a></td>';
            echo '<td>&nbsp;</td>';
            echo '<td><h6><a href="?actie=abu&ou='.$sqlData['MSKEYVALUE_OU'].'">'.$sqlData['MSKEYVALUE_OU'].'</a></td>';
            echo '<td>&nbsp;</td>';
            echo '<td><h6><a href="?actie=abu&ou='.$sqlData['MSKEYVALUE_OU'].'">'.$sqlData['DISPLAYNAME'].'</a></td>';
            echo '</tr>';
            echo '</table>';
            }
            echo '<hr style="margin:5px 0 5px 0;">';
            echo '<h5>Aantal gevonden afdelingen <em>('.$sqlAantal.')</em></h5>';
            echo '<h6><a href="javascript:javascript:history.go(-1)">Klik hier om naar de vorige pagina te gaan</a></h6>';
        }else{
            echo 'Sorry, ik heb geen gegevens kunnen vinden!';
        }
    }
 
PHP hulp

PHP hulp

19/07/2019 04:46:08
 
- SanThe -

- SanThe -

13/07/2019 17:01:32
Quote Anchor link
$sqlUitlezen = mysqli_query($connection,
$sql = "SELECT ...");

Dit kan niet.
Je geeft hier als 2e parameter een boolean mee.

$sql = "SELECT ..." geeft true of false.

Toevoeging op 13/07/2019 17:03:53:

Oplossing:
$sqlUitlezen = mysqli_query($connection, $sql);

Of:
$sqlUitlezen = mysqli_query($connection, "SELECT ...");
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 17:16:56
Quote Anchor link
Thnx SanThe,

Ik had al wel zo'n vermoeden namelijk en had ook oorspronkelijk $sqlUitlezen = mysqli_query($connection, "SELECT ...");

Maar dan krijg ik toch ook dezelfde foutmelding dus het moet 'm toch nog ergens anders in zitten want de melding blijft als ik die oplossing gebruik.
 
- SanThe -

- SanThe -

13/07/2019 17:19:41
Quote Anchor link
Dan zal de query mislukt zijn.
Maak dus een nette foutafhandeling.
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 17:24:58
Quote Anchor link
ben niet zo'n ervaren programmeur .... geen idee wat je daarmee bedoel en hou je die dan moet maken,
 
- SanThe -

- SanThe -

13/07/2019 17:30:04
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 17:48:44
Quote Anchor link
geen flauw idee waar ik nu mee bezig ben :-) maar vooralsnog geen resultaat en zie ik weinig gebeuren.
 
Rob Doemaarwat

Rob Doemaarwat

13/07/2019 18:54:04
Quote Anchor link
Voor een snelle check kun je ook gewoon die $sql even op het scherm knallen:
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
   die("SELECT
        idm_ou.MSKEYVALUE_OU,
        idm_ou.DISPLAYNAME,
        idm_ou.Z_ORG_CODE,
        idm_ou.Z_ORG_DN_CODE,
        idm_ou.Z_REFERENCE_MX_MANAGER,
        idm_person.MX_LASTNAME,
        idm_person.ACHMEA_EMPLOYEENUMBER
        
        FROM idm_ou ".$where."
        
        INNER JOIN idm_person ON idm_ou.Z_REFERENCE_MX_MANAGER = idm_person.MSKEYVALUE_MEDEWERKER
        
        ORDER BY `MSKEYVALUE_OU` ASC");

Dan plak je 'm in je database programma (HeidiSQL, phpMyAdmin) en draai je 'm daar. Die vertelt je dan precies wat er mis mee is.

O, ik zie het al: je JOIN komt na je WHERE. Het moet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT *
FROM tabel
  JOIN andere_table ON dit = dat
WHERE zus = "zo"

Dus de WHERE na de evt. JOIN(S)
 
- Ariën -
Beheerder

- Ariën -

13/07/2019 21:00:16
Quote Anchor link
Verder kan je die hele echo-put in die while() in één string plaatsen.

Als het geen functie was zou je dit zelfs buiten PHP-blokken kunnen plaatsen.
Gewijzigd op 13/07/2019 22:31:28 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 23:24:30
Quote Anchor link
Rob Doemaarwat op 13/07/2019 18:54:04:
Voor een snelle check kun je ook gewoon die $sql even op het scherm knallen:
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
   die("SELECT
        idm_ou.MSKEYVALUE_OU,
        idm_ou.DISPLAYNAME,
        idm_ou.Z_ORG_CODE,
        idm_ou.Z_ORG_DN_CODE,
        idm_ou.Z_REFERENCE_MX_MANAGER,
        idm_person.MX_LASTNAME,
        idm_person.ACHMEA_EMPLOYEENUMBER
        
        FROM idm_ou ".$where."
        
        INNER JOIN idm_person ON idm_ou.Z_REFERENCE_MX_MANAGER = idm_person.MSKEYVALUE_MEDEWERKER
        
        ORDER BY `MSKEYVALUE_OU` ASC");

Dan plak je 'm in je database programma (HeidiSQL, phpMyAdmin) en draai je 'm daar. Die vertelt je dan precies wat er mis mee is.

O, ik zie het al: je JOIN komt na je WHERE. Het moet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT *
FROM tabel
  JOIN andere_table ON dit = dat
WHERE zus = "zo"

Dus de WHERE na de evt. JOIN(S)



op het scherm komt mijn SQL er dan als volgt uit te zien:



SELECT idm_ou.MSKEYVALUE_OU, idm_ou.DISPLAYNAME, idm_ou.Z_ORG_CODE, idm_ou.Z_ORG_DN_CODE, idm_ou.Z_REFERENCE_MX_MANAGER, idm_person.MSKEYVALUE_MEDEWERKER, idm_person.MX_LASTNAME, idm_person.ACHMEA_EMPLOYEENUMBER INNER JOIN idm_person ON idm_ou.Z_REFERENCE_MX_MANAGER = idm_person.MSKEYVALUE_MEDEWERKER FROM idm_ou WHERE idm_ou.Z_ORG_DN_CODE LIKE "%40000001%" ORDER BY idm_ou.MSKEYVALUE_OU ASC

Er zal ongetwijf iets mis zijn (echter ik ziet het niet. Maar dat is niet zo moeilijk. Ben geen expert) maar het werkt toch ook niet :-) Zelfs niet als de WHERE na de JOIN plaats.


wanneer ik de sql in PHP Admin of HeidiSQL draai krijg ik onderstaande melding:

#1064 - Er is iets fout in de gebruikte syntax bij 'INNER JOIN idm_person ON idm_ou.Z_REFERENCE_MX_MANAGER = idm_person.MSKEYVALUE_M' in regel 1

daar wordt wat afgekapt (bold gemaakt)... Waarom geen idee.


Voor mij is het hardnekkige kost die ik (nog) niet kan doorgronden.....
Gewijzigd op 13/07/2019 23:29:20 door Dirk Huizinga
 
- Ariën -
Beheerder

- Ariën -

13/07/2019 23:25:46
Quote Anchor link
En werkt die query in phpmyAdmin/Heidisql?

Hoe ziet de code er nu uit met de query erin?
heb je SanThe's aanpassing al verwerkt?
Gewijzigd op 13/07/2019 23:29:15 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 23:30:29
Quote Anchor link
- Ariën - op 13/07/2019 23:25:46:
En werkt die query in phpmyAdmin/Heidisql?

Hoe ziet de code er nu uit met de query erin?
heb je SanThe's aanpassing al verwerkt?




Zie boven.... De aanpassing die SanThe ben ik niet uitgekomen en snapte ik niet waar ik mee bezig was. helaas.
 
- Ariën -
Beheerder

- Ariën -

13/07/2019 23:35:52
Quote Anchor link
Het moet als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = "SELECT... FROM... etc... WHERE... bla"; // zelf invullen
 $sqlUitlezen = mysqli_query($connection, $sql);


En dus geen $sql = "SELECT bla....." in je functie zelf.

$sqlUitlezen kan je dan met een if-else controleren of deze gelukt is, of niet.. en in dat geval met mysqli_error($connection); tonen wat er fout gaat.
Gewijzigd op 13/07/2019 23:37:44 door - Ariën -
 
Rob Doemaarwat

Rob Doemaarwat

13/07/2019 23:36:59
Quote Anchor link
Nu staat je INNER JOIN weer voor je FROM. Die moet erna (maar voor de WHERE).
 
- Ariën -
Beheerder

- Ariën -

13/07/2019 23:39:31
Quote Anchor link
Als je dus foutafhandeling toevoegt, dan zie je een fout van MySQL.

Zonder foutafhandeling: PHP zegt dat het fout gaat, omdat de invoer wat de query krijgt niet klopt.
Met foutafhandeling: PHP zegt dat er wat misgaat met de query.
Foutafhandeling mét mysqli_error($connection): PHP zegt dat er wat misgaat in MySQL en laat de foutmelding van MySQL zien.

Dat is laatste wat je graag wilt bereiken!
Gewijzigd op 13/07/2019 23:40:13 door - Ariën -
 
Dirk Huizinga

Dirk Huizinga

13/07/2019 23:42:54
Quote Anchor link
Rob en Arien,

Thanx voor het meekijken...
@rob had je klaarblijkelijk niet helemaal goed begrepen... maar nu wel.... de sql rammelt nu lekker door...


nogmaals bedankt guyz
 
- Ariën -
Beheerder

- Ariën -

13/07/2019 23:47:10
Quote Anchor link
Fijn dat het nu wel goed werkt! :)
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2019 12:12:57
Quote Anchor link
Oef, even wat misverstanden rechtzetten.
- SanThe - op 13/07/2019 17:01:32:
$sqlUitlezen = mysqli_query($connection,
$sql = "SELECT ...");

Dit kan niet.

Dat is simpelweg niet waar. Dit kan prima.

- SanThe - op 13/07/2019 17:01:32:
Je geeft hier als 2e parameter een boolean mee.

$sql = "SELECT ..." geeft true of false.

Ook dat klopt niet. Het (geëvalueerde) resultaat van een toekenning is wederom de toegekende waarde.

Beschouw de volgende code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
function whatever($in) {
    echo $in;
}


whatever($test = 'hallo');

echo $test;
?>

Dit levert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
hallohallo

Werkt prima en is gewoon toegestaan. Of het verstandig is om zo te programmeren is een tweede. De kans is namelijk aanwezig dat je de volgende fout maakt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if ($test = false) {
    // dit wordt nooit uitgevoerd, want de geevalueerde waarde
    // van de toekenning, en daarmee het if-statement, is false

}
?>

Omdat je eigenlijk het volgende bedoelde:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($test == false) {
    // wordt uitgevoerd als $test equivalent is aan false
}
?>

Vaak worden om die reden waarde en variabele omgedraaid:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (false == $test) {
    // wordt uitgevoerd als $test equivalent is aan false
}
?>

Omdat je dan, als je dan een =-teken vergeet, een foutmelding krijgt.

Dit is wederom een vraagstuk waarbij het probleem niet het probleem is, maar de aanpak. Alles begint bij het goed lezen van de foutmelding, hier staat letterlijk alle informatie in die je nodig hebt:
Quote:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given

Laat dit even bezinken. Lees het eens hardop voor. De eerste parameter van mysqli_num_rows() zou een object moeten zijn van het type mysqli_result, maar dit was een boolean (waarschijnlijk de waarde false). Deze is op zijn beurt afkomstig uit mysqli_query(). We pakken de documentatie erbij. Wat we willen weten is: wanneer retourneert mysqli_query() een bools resultaat? Of, algemener, wat kan mysqli_query() uberhaupt allemaal retourneren? En wat betekenen deze waarden? Dit staat onder het kopje Return Values. Hier staat:
Quote:
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.


We zouden ten overvloede simpelweg de waarde van $sqlUitlezen kunnen dumpen naar het scherm met behulp van var_dump() ofzo, maar nu staat het al min of meer vast (daar het een SELECT query betreft) dat er iets misgaat bij de uitvoering van de query. Meestal betekent dit op zijn beurt weer dat de SQL een verkeerde syntax (opbouw) heeft.

Een verdere (en vrij korte) analyse van de mogelijke SQL-vormen zou je dan moeten leiden naar de veroorzaker van de foutmelding, zoals al correct werd opgemerkt door @Rob: de plaatsing van het WHERE-onderdeel is verkeerd.

Het probleem hier is dus (wederom) niet de concrete foutmelding, maar het ontbreken van handvaten noch het hebben van een strategie voor het boven water krijgen van wat er misgaat. Dit begint met het analyseren van de foutmelding en duidelijkheid verkrijgen over de toestand (waarden) van de betrokken variabelen. Dit heet in de volksmond ook wel debuggen.

Debuggen is bij uitstek geschikt om te leren programmeren want het dwingt je om inhoudelijk te doorgronden wat er achtereenvolgens in je programma gebeurt. Als je dit gewoon systematisch doet dan leidt dit je vrijwel altijd rechtstreeks naar de veroorzaker van de problemen.
Gewijzigd op 14/07/2019 16:08:51 door Thomas van den Heuvel
 



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.