niet werkende functie... zie alleen het issus niet
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)
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
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> </td>';
echo '<td><h6><a href="?actie=abu&ou='.$sqlData['MSKEYVALUE_OU'].'">'.$sqlData['MSKEYVALUE_OU'].'</a></td>';
echo '<td> </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!';
}
}
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> </td>';
echo '<td><h6><a href="?actie=abu&ou='.$sqlData['MSKEYVALUE_OU'].'">'.$sqlData['MSKEYVALUE_OU'].'</a></td>';
echo '<td> </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!';
}
}
$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 ...");
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.
Maak dus een nette foutafhandeling.
ben niet zo'n ervaren programmeur .... geen idee wat je daarmee bedoel en hou je die dan moet maken,
https://www.phphulp.nl/php/tutorial/data-verwerking/foutafhandeling-query-sql/735/
Wel aanpassen aan mysqli.
Wel aanpassen aan mysqli.
geen flauw idee waar ik nu mee bezig ben :-) maar vooralsnog geen resultaat en zie ik weinig gebeuren.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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");
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:
Dus de WHERE na de evt. JOIN(S)
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 -
Rob Doemaarwat op 13/07/2019 18:54:04:
Voor een snelle check kun je ook gewoon die $sql even op het scherm knallen:
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:
Dus de WHERE na de evt. JOIN(S)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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");
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:
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 - DHU -
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 -
- 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?
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.
Code (php)
1
2
2
$sql = "SELECT... FROM... etc... WHERE... bla"; // zelf invullen
$sqlUitlezen = mysqli_query($connection, $sql);
$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 -
Nu staat je INNER JOIN weer voor je FROM. Die moet erna (maar voor de WHERE).
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 -
Thanx voor het meekijken...
@rob had je klaarblijkelijk niet helemaal goed begrepen... maar nu wel.... de sql rammelt nu lekker door...
nogmaals bedankt guyz
Fijn dat het nu wel goed werkt! :)
- SanThe - op 13/07/2019 17:01:32:
$sqlUitlezen = mysqli_query($connection,
$sql = "SELECT ...");
Dit kan niet.
$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.
$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)
Dit levert:
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)
1
2
3
4
5
6
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
}
?>
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)
1
2
3
4
5
2
3
4
5
<?php
if ($test == false) {
// wordt uitgevoerd als $test equivalent is aan false
}
?>
if ($test == false) {
// wordt uitgevoerd als $test equivalent is aan false
}
?>
Vaak worden om die reden waarde en variabele omgedraaid:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if (false == $test) {
// wordt uitgevoerd als $test equivalent is aan false
}
?>
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