Query levert maar 1 record.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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";
?>
$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:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?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);
?>
$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
Gewijzigd op 17/07/2017 19:51:43 door Harry H Arends
Het enige wat ik me kan denken is dat er niet gefetched word, en dan wordt er een enkel record gebruikt.
Gewijzigd op 17/07/2017 20:55:01 door Ben van Velzen
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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";
$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);
if(!$result || ($numberCombination < 0)) { }
elseif($numberCombination > 0) {
for($i=0; $i<$numberCombination; $i++) {
$Row = mysqli_fetch_assoc($Result);
$pdf->SetFont('arialunicid0', '', 9);
$pdf->SetFont('helvetica', '', 9);
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_result($resultCountry, 0, e_country);// Vervangen door onderstaande regel
$country_name = mysqli_fetch_assoc($resultCountry);
$tbl = 'T E S T';
$report = ' Groom-Accomodation';
$html = '<br /><br />'.$Row['e_country'].' <font size="+4"><b>'.$numberCombination.'</b></font> ('.$Row['competing_for_country'].')<br />
<table cellspacing="0" cellpadding="0" border="1" width="100%">
<tr>
<th width="18"> </th>
<th width="175">Rider</th>
<!--th width="210">Horse</th--><!-- In 2015 vervallen -->
<th width="75">Bad Boekelo</th>
<th width="50">Caravan</th>
<th width="175">Groom</th>
</tr>
<tr>
<td>'.$Row['stableNumber'].'</td>
<td>'.$Row['stayHorseBox'].'</td>
<td>'.$Row['nameGroom'].'</td>
<td>'.$Row['genderGroom'].'</td>
<td>'.$Row['caravanNumber'].'</td>
</tr>
</table>';
}
}
}
?>
$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";
$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);
if(!$result || ($numberCombination < 0)) { }
elseif($numberCombination > 0) {
for($i=0; $i<$numberCombination; $i++) {
$Row = mysqli_fetch_assoc($Result);
$pdf->SetFont('arialunicid0', '', 9);
$pdf->SetFont('helvetica', '', 9);
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_result($resultCountry, 0, e_country);// Vervangen door onderstaande regel
$country_name = mysqli_fetch_assoc($resultCountry);
$tbl = 'T E S T';
$report = ' Groom-Accomodation';
$html = '<br /><br />'.$Row['e_country'].' <font size="+4"><b>'.$numberCombination.'</b></font> ('.$Row['competing_for_country'].')<br />
<table cellspacing="0" cellpadding="0" border="1" width="100%">
<tr>
<th width="18"> </th>
<th width="175">Rider</th>
<!--th width="210">Horse</th--><!-- In 2015 vervallen -->
<th width="75">Bad Boekelo</th>
<th width="50">Caravan</th>
<th width="175">Groom</th>
</tr>
<tr>
<td>'.$Row['stableNumber'].'</td>
<td>'.$Row['stayHorseBox'].'</td>
<td>'.$Row['nameGroom'].'</td>
<td>'.$Row['genderGroom'].'</td>
<td>'.$Row['caravanNumber'].'</td>
</tr>
</table>';
}
}
}
?>
Kies één vaste vorm, zodat je die vergissing nooit kunt maken.
in combinatie met GROUP BY is eigenlijk altijd fout.
Ok. Niet per se, omdat in de situatie dat je weet welke kolommen er vanuit dat * komen, en je vervolgens al die kolommen in group by gooit, het toch goed gaat. Maar omdat iemand die dat snapt geen SELECT * had gebruikt.
Dat gezegd hebbend:
GROUP BY heeft helemaal niets te zoeken in deze query.
Ik zie namelijk geen aggregatie functie, zoals SUM() of COUNT() in je query staan. Dus wat valt er te groupen? Klinkt meer als een misbruik tot een soort van DISTINCT dat als zij-effect bij groupby kan optreden.
Een onvoorspelbaar zij-effect ook nog eens. Wat in eerste instantie correct lijkt zal vroeg of laat vreselijk foute resultaten gaan opleveren.
Dan een voorstel hoe deze query wel juist te maken. Ik wil graag op voorhand alle gegevens uit de drie tabellen om deze in een raport te gaan gebruiken. als dat eenvoudiger kan graag.
en als dat niet levert, wat je wilt, dan verder kijken hoe op te lossen
Bij alle raporten wordt er per land een pagina gemaakt en op de pagina kan een ruiter meerdere paarden hebben
kijkt (joint) in de koppeltabel naar welke paard-id's daarbij horen
en haalt uit de paardentabel op basis van het paard-id het paard erbij.
Dat is wat je query doet.
En nu? Wat is je vraag?
btw: SELECT tabel.* is gemakzuchtig. Heb je alle kolommen echt nodig? Het je dan geen last van dubbel voorkomede kolomnamen (horse.name, person.name bijvoorbeeld)
; een ruiter heeft een family_name en voornam plus tussenvoegsels
; bij de paarden is dit een current_name
Er moet voor elk raport een template gemaakt worden met allemaal verschillende velden
Daarom wil ik voor het gemak één sqlCombination boven aan elk template zodat ik maar op één plek iets hoef te wijzigen indien nodig
Maar heb je nu nog een probleem met je query?
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
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
<?php
$report = $_GET['report'];
$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
ORDER
BY person.competing_for_country, 2010Combination.compNumber ASC";
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
"There is een error opening table for listing Combinations; ".mysqli_error($dblink);
}
$EV_Year = date('Y');
$numberCombination = mysqli_affected_rows($dblink);
if ($result = mysqli_query($dblink, $sqlCombination)) {
$html=$EV_Year;
/* fetch associative array */
while ($row = mysqli_fetch_row($result)) {
$html .= $Row[0] . " - ";
$html .= $Row[1] . "<br />";
$html .= $numberCombination . "<br />";
}
}
?>
De geproduceerde output levert wel het juiste aantal records maar $row[x] is leeg.
=+=+=+=+=+=+=+=+
Gevonden, stoome fout $Row moet $row zijn
$report = $_GET['report'];
$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
ORDER
BY person.competing_for_country, 2010Combination.compNumber ASC";
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
"There is een error opening table for listing Combinations; ".mysqli_error($dblink);
}
$EV_Year = date('Y');
$numberCombination = mysqli_affected_rows($dblink);
if ($result = mysqli_query($dblink, $sqlCombination)) {
$html=$EV_Year;
/* fetch associative array */
while ($row = mysqli_fetch_row($result)) {
$html .= $Row[0] . " - ";
$html .= $Row[1] . "<br />";
$html .= $numberCombination . "<br />";
}
}
?>
De geproduceerde output levert wel het juiste aantal records maar $row[x] is leeg.
=+=+=+=+=+=+=+=+
Gevonden, stoome fout $Row moet $row zijn
Gewijzigd op 18/07/2017 17:35:37 door Harry H Arends
En ik mocht dan debuggen waarom de verkeerde waarden verschenen.
Doe je zelf en je opvolgers een lol en gebruik myqli_fetch_assoc() en dan vervolgens $row['kolomnaam']
Zeker als je SELECT persoon.* gebruikt en je op geen enkele manier zekerheid hebt over de volgorde van de kolommen: als je dit live zet en bij het omzetten wordt de database net iets anders aangemaakt, staan de kolommen in een andere volgorde.
Daarnaast, waarom voer je dezelfde query 2x uit, 1 keer richting $Result en 1 keer richting $result?
Dat wat ik toepas staat ook hier http://php.net/manual/en/function.mysql-fetch-assoc.php
Gewijzigd op 19/07/2017 20:13:25 door Harry H Arends
Gewijzigd op 20/07/2017 09:38:10 door - Ariën -
Of bedoelde jij dat er bij deuitvoering nu maar één keer die opdracht wordt uitgevoerd?
Die query hoef je maar een keer uit te voeren. Wat heb je nu aan code dan?
OP de eerste pagina komt straks een overzicht met aantallen en dan per land een pagina met detail informatie.
Dit is de huidige code:
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
47
48
49
50
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
47
48
49
50
<?php
$report = $_GET['report'];
$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
ORDER
BY person.competing_for_country, 2010Combination.compNumber ASC";
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
$html = "There is een error opening table for listing Combinations; ".mysqli_error($dblink);
} else {
$EV_Year = date('Y') . "<br />";
$numberCombinations = mysqli_affected_rows($dblink);
if ($result = mysqli_query($dblink, $sqlCombination)) {
$html .= $EV_Year;
/* fetch associative array */
while ($row = mysqli_fetch_assoc($result)) {
// while ($row = mysqli_fetch_row($result)) {
$html .= $row["fei_id"] . " - ";
$html .= $row["nf"] . " - ";
$html .= $row["first_name"] . " ";
$html .= $row["family_name"] . "<br />";
$html .= $row["groups"] . " - ";
$html .= $row["e_country"] . " - ";
$html .= $numberCombinations . "<br />";
if($riderNF != $Row['competing_for_country']) {
$sqlCountry = "SELECT e_country FROM country WHERE ISO_A3 = '".$Row['competing_for_country']."'";
$html .= $sqlCountry . "<br />";
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 />";
}
// Maak een pagina voor ieder land in de lijst
}
}
}
?>
$report = $_GET['report'];
$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
ORDER
BY person.competing_for_country, 2010Combination.compNumber ASC";
$Result = mysqli_query($dblink, $sqlCombination);
if(!$Result) {
$html = "There is een error opening table for listing Combinations; ".mysqli_error($dblink);
} else {
$EV_Year = date('Y') . "<br />";
$numberCombinations = mysqli_affected_rows($dblink);
if ($result = mysqli_query($dblink, $sqlCombination)) {
$html .= $EV_Year;
/* fetch associative array */
while ($row = mysqli_fetch_assoc($result)) {
// while ($row = mysqli_fetch_row($result)) {
$html .= $row["fei_id"] . " - ";
$html .= $row["nf"] . " - ";
$html .= $row["first_name"] . " ";
$html .= $row["family_name"] . "<br />";
$html .= $row["groups"] . " - ";
$html .= $row["e_country"] . " - ";
$html .= $numberCombinations . "<br />";
if($riderNF != $Row['competing_for_country']) {
$sqlCountry = "SELECT e_country FROM country WHERE ISO_A3 = '".$Row['competing_for_country']."'";
$html .= $sqlCountry . "<br />";
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 />";
}
// Maak een pagina voor ieder land in de lijst
}
}
}
?>
ziet er nog een beetje rommelig uit i.v.m. testen
Gewijzigd op 20/07/2017 12:22:11 door Harry H Arends