Binnen mijn script gebruik ik deze sql opdracht om alle regels uit een tabel te lezen.

<?php
$sqlCombination = "
	SELECT person.*, horse.*, 2010Combination.* 
	FROM FEIPerson AS person
	INNER 
			JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid 
	INNER 
			JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid 
	GROUP 
			BY 2010Combination.personFEIid
	ORDER 
			BY person.competing_for_country, 2010Combination.compNumber ASC";
?>

En dit is het stukje script dat ik gebruik om o.a. het aantal regels te weten te komen:

<?php
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
	$html = 'There is een error opening table for listing Combinations; '.mysqli_error();
	$pdf->writeHTML($html, true, false, true, false, ' ');
	}
$numberCombination = mysqli_affected_rows($dblink);
?>

In $numberCombination komt dan het aantal regels te staan, echter deze waarde is foutief.
Kijkend met PHPMYADMIN op de webserver staan in de tabel 3 regels terwijl de waarde in $numberCombination 1 is.
Waar kan dit verschil vandaan komen aangezien ik geen enkele WHERE clausule in de sql opdracht heb staan.

Harry
Dat bedoel ik dus, je voert de query onnodig twee keer uit op lijn 13 en 20.
Die hele if-statement (lijn 20) is niet nodig omdat je al je resource hebt uit $Result

(en let eens op die hoofdletters!)
Je zoekt nu achteraf het land/ de landen bij een ruiter.
Kunnen dat meerdere landen zijn? Je haalt er nu namelijk maar 1 op.


Daarbij, dit zou je ook in de hoofdquery er direct bij kunnen zoeken.
(Maar waar komt $riderNF vandaan?)

Een query in een lus maakt je pagina doorgaans niet echt sneller
Probeer daarom altijd te kijken of je dat in een JOIN kan verwerken.
Ivo P op 20/07/2017 12:33:22

Je zoekt nu achteraf het land/ de landen bij een ruiter.
Kunnen dat meerdere landen zijn? Je haalt er nu namelijk maar 1 op.


Voor het eerste land werkte dat, maar ik heb het iets aangepast

<?php
			if($riderNF != $Row['competing_for_country']) {
				$sqlCountry = "SELECT e_country FROM country WHERE ISO_A3 = '".$Row['competing_for_country']."'";
		
		
		if (!(@ $resultCountry = mysqli_query($dblink, $sqlCountry))) {
					$html = 'There was an error running your query: '.mysqli_error($dblink);
					$pdf->writeHTML($html, true, false, true, false, ' ');
					}
				
				$country_name = mysqli_fetch_assoc($resultCountry);
				$html .= $Row['competing_for_country']. "<br />";
				$riderNF = $country_name;
			}
?>

Er kunnen meerdere land voorkomen. Deze staan in $result op volgorde door de order in de query

<?php
ORDER BY person.competing_for_country, 2010Combination.compNumber ASC
?>

opm. $sqlCountry bevat de voledig landsnaam in officieele schrijfwijze aan de hand van de ISI_A3 landen code.

Die opmerking van Ariën over hoofdletters geldt overigens niet alleen voor $Result, maar ook voor $Row. En eigenlijk voor je gehele code...
Willem vp op 20/07/2017 15:36:18

Die opmerking van Ariën over hoofdletters geldt overigens niet alleen voor $Result, maar ook voor $Row. En eigenlijk voor je gehele code...

Vanmiddag eerst maar even het hoofd leeg gemaakt en toen alles met de kam bekeken en dit is het resultaat:

<?php
// Vul hier een rapport specifiek clausule in.
// In dit rapport gaat het om welke combinaties hebben een onderkomen in de caravan nodig
$sqlCombiWHERE = " WHERE 2010Combination.accomGroom = 'YES' ";
$report = $_GET['report'];
$sqlCombiBASIC = "
	SELECT person.*, horse.*, 2010Combination.* 
	FROM FEIPerson AS person
	INNER 
			JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid 
	INNER 
			JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid ";
$sqlCombiORDER = "
	ORDER 
			BY person.competing_for_country, 2010Combination.compNumber ASC ";
$sqlCombination = $sqlCombiBASIC . $sqlCombiWHERE . $sqlCombiORDER;

if(!$Result = mysqli_query($dblink, $sqlCombination)) {
	$html = "There is een error opening table for ". $report. "; ".mysqli_error($dblink)."<br />";
		$html .= "<br />=========================<br />";
		$html .= $sqlCombination ; // for debug only

} else {
$EV_Year = date('Y') . "<br />";
$numberCombinations = mysqli_affected_rows($dblink);
 
//$Result = mysqli_query($dblink, $sqlCombination);
$html .= $EV_Year;
		$html .= "<br />=========================<br />";
    /* fetch associative array */
	while ($Row= mysqli_fetch_assoc($Result)) {
		$html .= $Row["fei_id"] . " - ";
		$html .= $Row["competing_for_country"] . " - ";
		$html .= $Row["first_name"] . " ";
		$html .= $Row["family_name"] . " -> ";
		$html .= $Row["groups"] . " - ";
		$html .= $Row["e_country"] ;
		$html .= "<br />";
//		$html .= $numberCombinations . "<br />";
	}
		$html .= "<br />=========================<br />";
		$html .= "Query: ". $sqlCombination . "<br />";
		$html .= "Aantal Groom in caravn: ". $numberCombinations . "<br />";
$Result = mysqli_query($dblink, $sqlCombination);
		$html .= "Aantal Vrouwlijk: ". $numFemale . "<br />";
		$html .= "Aantal Manlijk: ". $numMale . "<br />";
		$html .= "<br />=========================<br />";
				
			if($riderNF != $Row['competing_for_country']) {
				$sqlCountry = "SELECT e_country FROM country WHERE ISO_A3 = '".$Row['competing_for_country']."'";
		
		if (!(@ $resultCountry = mysqli_query($dblink, $sqlCountry))) {
					$html = 'There was an error running your query: '.mysqli_error($dblink);
					$pdf->writeHTML($html, true, false, true, false, ' ');
					}
				
				$country_name = mysqli_fetch_assoc($resultCountry);
				$html .= $Row['competing_for_country']. "<br />";
				$riderNF = $country_name;
			}
// Maak een pagina voor ieder land in de lijst
//	}
}
?>

De pagina zelf is hier te vinden.

Nog steeds draai je een query voor het land apart. Waarom eigenlijk? Dit moet je gewoon bij de hoofdquery joinen. Daarbij is de logica voor het uitvoeren van de query een beetje wazig, en wordt dit maar half doorgevoerd.
Ben van Velzen op 20/07/2017 21:19:46

Nog steeds draai je een query voor het land apart. Waarom eigenlijk? Dit moet je gewoon bij de hoofdquery joinen. Daarbij is de logica voor het uitvoeren van de query een beetje wazig, en wordt dit maar half doorgevoerd.

Kun jij mij dan precies uitleggen hoe ik dat in de hoofd query inpas.
Ik heb nanelijk geen idee hoe dat vorm moet krijgen.??

Uit welke tabel komt competing_for_country? Pas dan kan ik daar wat zinnigs van maken.
deze waarde staat in person.competing_for_country en de landen staan in de tabel country

Reageren