Door
Harry H Arends
op 17-07-2017 19:50
gewijzigd op 17-07-2017 19:51
5.962 views
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:
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.
Dan zou de query dus als start op iets uitkomen als:
SELECT person.*, horse.*, 2010Combination.*, country.e_country
FROM FEIPerson AS person
JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid
JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid
JOIN country ON country.ISO_A3 = person.competing_for_country
Houd er ook even rekening mee dat je de query op regel 44 nog een keer uitvoert. Waarom eigenlijk?
>> Maar ik zie dat je de beide INNER's hebt weggelaten??
Correct. Die hoef je niet te noemen. Net als bij LEFT JOIN, wat een LEFT OUTER JOIN is.
>> Omdat ik het aantal vrouwelijke verzorgers moet weten die een caravan nodig hebben
Waarom voer je dan DEZELFDE query opnieuw uit?
Die regel kan je gewoon verwijderen. Als je in je query wilt filteren, dan kan je met $_GET je query aanpassen. Denk wel aan escaping, of gebruik vaste waardes die je vooraf controleert.
Die regel kan je gewoon verwijderen. Als je in je query wilt filteren, dan kan je met $_GET je query aanpassen. Denk wel aan escaping, of gebruik vaste waardes die je vooraf controleert.
Dit werkt toch alleen maar met $Row en niet met $Result.
Hoe tel je dan met $_GET
Lijkt me inderdaad wel zo handig. Eerder had je zelfs helemaal geen code die $numFemale en $numMale bepalen. Het kan nog wel verstandig zijn om voor de lus even iets te doen als
<?php
$numFemale = 0;
$numMale = 0;
?>
<?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' ";
// +-----Table header --------------------------------------------------------+
$tbl = '<table cellspacing="0" cellpadding="0" border="1" width="100%">
<tr>
<th width="30"> </th>
<th width="50">Caravan</th>
<th width="200">Name</th>
<th width="150">Telefoon</th>
<th width="145">Horse</th>
<th width="">Country</th>
</tr> ';
// </table>';
$previousCountry = " ";
$report = $_GET['report'];
$sqlCombiBASIC = "
SELECT person.*, horse.*, 2010Combination.*, country.* , country.*
FROM FEIPerson AS person
JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid
JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid
JOIN country ON country.ISO_A3 = person.competing_for_country ";
$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 />";
} else { // database is aanwezig en geopend
$numFemale = $numMale = 0;
$EV_Year = date('Y') . "<br />";
$numberCombinations = mysqli_affected_rows($dblink);
$html .= $EV_Year;
$html = "<br />=========================<br />";
/* fetch associative array */
while ($Row= mysqli_fetch_assoc($Result)) {
$tbl .= ' <tr>
<td>'.$Row["compNumber"].'</td>
<td>'.$Row["caravanNumber"].'</td>
<td>'.$Row["nameGroom"].'</td>
<td>+'.$Row["cellGroom"].'</td>
<td>'.$Row["current_name"].'</td>
<td>'.$Row["competing_for_country"].'</td>
</tr>';
// -----------------------------------------------------------+
// Verkrijg aantal vrouwelijke verzorgers (Groom)
if($Row["genderGroom"] == 'Female') $numFemale++;
//Doe dit ook voor mannelijke groom's
elseif($Row["genderGroom"] == 'Male') $numMale++;
// -----------------------------------------------------------+
if($previousCountry!=$Row["competing_for_country"]) {
$previousCountry=$Row["competing_for_country"];
// add a page
$pdf->AddPage('P', 'A4');
// -----------------------------------------------------------+
$pdf->writeHTML($tbl, true, false, true, false, ' ');
// -----------------------------------------------------------+
} else { $previousCountry=$Row["competing_for_country"];}
} // end while
} // end
// Maak een pagina voor totalen
$sql = "<br />=========================<br />";
$sql .= "Aantal Groom in caravan: ". $numberCombinations . "<br />";
$sql .= "Aantal Vrouwlijk: ". $numFemale . "<br />";
$sql .= "Aantal Manlijk: ". $numMale . "<br />";
$sql .= "<br />=========================<br />";
// add a page
$pdf->AddPage('P', 'A4');
// -----------------------------------------------------------+
$pdf->writeHTML($sql, true, false, true, false, ' ');
// -----------------------------------------------------------+
?>
en is te vinden op deze link
Er is echter nog één probleem; In de while controleer ik of een volgend land aan de beurt is deze moet starten op een nieuwe pagina, echter wordt het nieuwe land (regel) nog op de pagina van het vorige land geplaatst. De output van de link is waarschijnlijk duidelijker dan mijn uitleg.
Hoe zou ik dit beter kunnen doen??