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..


	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!';
		}
	}
- 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.
Het moet als volgt:

$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.
Nu staat je INNER JOIN weer voor je FROM. Die moet erna (maar voor de WHERE).
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!
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
Fijn dat het nu wel goed werkt! :)
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:
<?php
function whatever($in) {
    echo $in;
}

whatever($test = 'hallo');

echo $test;
?>

Dit levert:
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:
<?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:
<?php
if ($test == false) {
    // wordt uitgevoerd als $test equivalent is aan false
}
?>

Vaak worden om die reden waarde en variabele omgedraaid:
<?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:
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:
[color=#ff0000]Returns FALSE on failure.[/color] 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.

Reageren