Programma - Competitie - Gedeeltelijk
Ik heb weer een probleem... Ik zal eerst de situatie uitleggen.
Doel: Ik heb op mijn site 4 regels waarop ik de laatste 2 gespeelde wedstrijden (+ uitslag) en 2 aankomende wedstrijden wil laten zien. Met als uitzonderingsituaties het begin en het einde van het seizoen.
Stel: X = aantal te tonen te spelen wedstrijden
Y = aantal te tonen gespeelde wedstrijden
Dan zijn er 5 situaties:
1: X = 4 & Y = 0 (= begin van het seizoen)
2: X = 3 & Y = 1 (= 1 wedstrijd na begin seizoen)
3: X = 2 & Y = 2 (= midden van het seizoen)
4: X = 1 & Y = 3 (= 1 wedstrijd voor einde seizoen)
5: X = 0 & Y = 4 (= einde van het seizoen)
Ik wil dit als volgt bereiken: .
Stap 1:
Ik maak variabelen X en Y aan en zet deze op de standaard waarden $X=2 & $Y=2 (midden van het seizoen)
Stap 2:
Ik voer 2 queries uit: Query A voor de nog te spelen wedstrijden en query B voor de gespeelde wedstrijden (+ uitslag).
Stap 3:
Ik ga controleren of er sprake is van een uitzonderingssituatie (en welke) en pas de waarden van $X en $Y daarop aan, als volgt:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$tespelenwedstrijdenquery = mysqli_query($hello, $queryA);
$countA = mysqli_num_rows($tespelenwedstrijdenquery);
if($countA >= 2){$X = 2;} else if($countA == 1){$X = 1;} else if ($countA == 0){$X = 0;}
$gespeeldewedstrijdenquery = mysqli_query($hello, $queryB);
$countB = mysqli_num_rows($gespeeldewedstrijdenquery);
if($countB >= 2){$Y = 2;} else if($countB == 1){$Y = 1;} else if ($countB == 0){$Y = 0;}
$countA = mysqli_num_rows($tespelenwedstrijdenquery);
if($countA >= 2){$X = 2;} else if($countA == 1){$X = 1;} else if ($countA == 0){$X = 0;}
$gespeeldewedstrijdenquery = mysqli_query($hello, $queryB);
$countB = mysqli_num_rows($gespeeldewedstrijdenquery);
if($countB >= 2){$Y = 2;} else if($countB == 1){$Y = 1;} else if ($countB == 0){$Y = 0;}
Stap 4:
De 2 queries in arrays zetten en variabelen aanmaken die ge-echoed kunnen worden.
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
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
while ($tespelenwedstrijden = mysqli_fetch_array($tespelenwedstrijdenquery, MYSQLI_ASSOC)) {
if($X == 1){
$datum_regel4 = $tespelenwedstrijden['datum']
$competitie_regel4 = $tespelenwedstrijden['comeptitie']
$wedstrijdID_regel4 = $tespelenwedstrijden['wedstrijdID']
$thuisploeg_regel4 = $tespelenwedstrijden['thuisclub']
etc...
;}
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['comeptitie']
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID']
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub']
etc...
$n += 1
;}
;}
else if($X == 3){
...
;}
else if($X == 4){
...
;}
En hetzelfde voor gespeelde wedstrijden (Y).
if($X == 1){
$datum_regel4 = $tespelenwedstrijden['datum']
$competitie_regel4 = $tespelenwedstrijden['comeptitie']
$wedstrijdID_regel4 = $tespelenwedstrijden['wedstrijdID']
$thuisploeg_regel4 = $tespelenwedstrijden['thuisclub']
etc...
;}
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['comeptitie']
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID']
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub']
etc...
$n += 1
;}
;}
else if($X == 3){
...
;}
else if($X == 4){
...
;}
En hetzelfde voor gespeelde wedstrijden (Y).
Mijn probleem is dat ik vast loop bij stap 4 na het gedeelte "else if($X == 2)".
Als ik de in de for-lus aangemaakte variabelen van regel 3 (bijvoorbeeld $wedstrijdID_regel3) en regel 4 (bijvoorbeeld $wedstrijdID_regel4) echo dan zijn ze steeds gelijk aan elkaar.
Kan iemand mij helpen?
(Misschien goed om te zeggen: als ik $wedstrijdID_regel3 en $wedstrijdID_regel4 echo krijg ik geen undefined variable error, dus de forloop wordt wel 2 keer doorlopen alleen lijkt ie dezelfde elementen uit de array te pakken)
Oh, ik besef me nu dat dit misschien niet de correcte plaats voor mijn vraag is...
Gewijzigd op 12/07/2015 12:55:33 door Jo Immanuel
Volgens mij ben je in twee queries klaar?
Thomas van den Heuvel op 12/07/2015 11:16:37:
Uhm, als je weet wanneer de wedstrijden gespeeld zijn of moeten worden (deze staan dus al in de database) kun je toch gewoon de huidige datum als uitgangspunt nemen en dan proberen maximaal 2 gespeelde wedstrijden en 2 te spelen wedstrijden op te halen (LIMIT 2)? De hoeveelheid resultaten die je afdrukt laat je afhangen van het aantal resultaten wat je hebt.
Volgens mij ben je in twee queries klaar?
Volgens mij ben je in twee queries klaar?
He Thomas,
Ja maar ik wil LIMIT nu juist niet gebruiken in mijn SQL-queries A en B. Ik wil alle wedstrijden van een bepaald seizoen ophalen met SQL en die informatie onderverdelen in 2 arrays, 1 voor gespeelde wedstrijden en 1 voor te spelen wedstrijden. Dan kan ik de informatie uit die arrays hergebruiken.
Als je op een of andere manier weet dat een wedstrijd gespeeld is, zodat je het onderscheid kunt maken tussen reeds gespeelde en nog te spelen wedstrijden.
EDIT: misschien praat het wat makkelijker als je wat tabeldefinities en -data laat zien.
Gewijzigd op 12/07/2015 11:34:07 door Thomas van den Heuvel
Ik wil het in 2 queries.
De query van al gespeelde wedstrijden is veel zwaarder (0.0137 sec) dan de query voor de nog te spelen wedstrijden (0.0010 sec) omdat bij de gespeelde wedstrijden er ook de uitslag bij zit (en deze uitslag wordt weer in de query bepaald door het aantal gemaakte doelpunten van uit- en thuislcub in die wedstrijd op te tellen).
Dus ik maak 1 query voor te spelen wedstrijden (queryA), met datum > als yyyy-mm-dd .
Uit queryA komen (afhankelijk van de gekozen yyyy-mm-dd) de volgende gegevens:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$tespelenwedstrijdenquery = mysqli_query($hello, $queryA);
datum competitie wedstrijdID speelr thuisclub uitclub
2012-12-23 eredivisie 00160 18 FC Utrecht afc Ajax
2013-01-20 eredivisie 00170 19 afc Ajax Feyenoord
2013-01-27 eredivisie 00177 20 Vitesse afc Ajax
2013-02-03 eredivisie 00186 21 VVV-Venlo afc Ajax
2013-02-10 eredivisie 00195 22 afc Ajax Roda JC
2013-02-17 eredivisie 00207 23 RKC Waalwijk afc Ajax
2013-02-24 eredivisie 00216 24 afc Ajax ADO Den Haa
2013-03-02 eredivisie 00220 25 FC Twente afc Ajax
2013-03-10 eredivisie 00232 26 afc Ajax PEC Zwolle
2013-03-17 eredivisie 00243 27 AZ afc Ajax
2013-03-31 eredivisie 00251 28 afc Ajax N.E.C.
2013-04-07 eredivisie 00259 29 afc Ajax Heracles
2013-04-14 eredivisie 00268 30 PSV afc Ajax
2013-04-19 eredivisie 00271 31 afc Ajax sc Heerenve
2013-04-27 eredivisie 00282 32 NAC Breda afc Ajax
2013-05-05 eredivisie 00289 33 afc Ajax Willem II
2013-05-12 eredivisie 00303 34 FC Groningen afc Ajax
datum competitie wedstrijdID speelr thuisclub uitclub
2012-12-23 eredivisie 00160 18 FC Utrecht afc Ajax
2013-01-20 eredivisie 00170 19 afc Ajax Feyenoord
2013-01-27 eredivisie 00177 20 Vitesse afc Ajax
2013-02-03 eredivisie 00186 21 VVV-Venlo afc Ajax
2013-02-10 eredivisie 00195 22 afc Ajax Roda JC
2013-02-17 eredivisie 00207 23 RKC Waalwijk afc Ajax
2013-02-24 eredivisie 00216 24 afc Ajax ADO Den Haa
2013-03-02 eredivisie 00220 25 FC Twente afc Ajax
2013-03-10 eredivisie 00232 26 afc Ajax PEC Zwolle
2013-03-17 eredivisie 00243 27 AZ afc Ajax
2013-03-31 eredivisie 00251 28 afc Ajax N.E.C.
2013-04-07 eredivisie 00259 29 afc Ajax Heracles
2013-04-14 eredivisie 00268 30 PSV afc Ajax
2013-04-19 eredivisie 00271 31 afc Ajax sc Heerenve
2013-04-27 eredivisie 00282 32 NAC Breda afc Ajax
2013-05-05 eredivisie 00289 33 afc Ajax Willem II
2013-05-12 eredivisie 00303 34 FC Groningen afc Ajax
En ik maak 1 query voor de gespeelde wedstrijden (queryB), met datum BETWEEN yyyy-mm-dd AND yyyy-mm-dd .
Uit queryB komen (afhankelijk van de gekozen yyyy-mm-dd) de volgende gegevens:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$gespeeldewedstrijdenquery = mysqli_query($hello, $queryB);
datum competitie wedstrijdID speelr thuisclub uitclub thuisscore uitscore
2012-08-12 eredivisie 00009 1 afc Ajax AZ 2 2
2012-08-19 eredivisie 00018 2 N.E.C. afc Ajax 1 6
2012-08-25 eredivisie 00023 3 afc Ajax NAC Breda 5 0
2012-09-02 eredivisie 00036 4 sc Heerenveen afc Ajax 2 2
2012-09-15 eredivisie 00037 5 afc Ajax RKC Waalwijk 2 0
2012-09-23 eredivisie 00050 6 ADO Den Haag afc Ajax 1 1
2012-09-29 eredivisie 00059 7 afc Ajax FC Twente 1 0
2012-10-07 eredivisie 00068 8 afc Ajax FC Utrecht 1 1
2012-10-20 eredivisie 00073 9 Heracles afc Ajax 3 3
2012-10-28 eredivisie 00086 10 Feyenoord afc Ajax 2 2
2012-11-03 eredivisie 00092 11 afc Ajax Vitesse 0 2
2012-11-11 eredivisie 00107 12 PEC Zwolle afc Ajax 2 4
2012-11-17 eredivisie 00112 13 afc Ajax VVV-Venlo 2 0
2012-11-25 eredivisie 00122 14 Roda JC afc Ajax 1 2
2012-12-01 eredivisie 00131 15 afc Ajax PSV 3 1
2012-12-08 eredivisie 00139 16 afc Ajax FC Groningen 2 0
2012-12-16 eredivisie 00153 17 Willem II afc Ajax 2 4
datum competitie wedstrijdID speelr thuisclub uitclub thuisscore uitscore
2012-08-12 eredivisie 00009 1 afc Ajax AZ 2 2
2012-08-19 eredivisie 00018 2 N.E.C. afc Ajax 1 6
2012-08-25 eredivisie 00023 3 afc Ajax NAC Breda 5 0
2012-09-02 eredivisie 00036 4 sc Heerenveen afc Ajax 2 2
2012-09-15 eredivisie 00037 5 afc Ajax RKC Waalwijk 2 0
2012-09-23 eredivisie 00050 6 ADO Den Haag afc Ajax 1 1
2012-09-29 eredivisie 00059 7 afc Ajax FC Twente 1 0
2012-10-07 eredivisie 00068 8 afc Ajax FC Utrecht 1 1
2012-10-20 eredivisie 00073 9 Heracles afc Ajax 3 3
2012-10-28 eredivisie 00086 10 Feyenoord afc Ajax 2 2
2012-11-03 eredivisie 00092 11 afc Ajax Vitesse 0 2
2012-11-11 eredivisie 00107 12 PEC Zwolle afc Ajax 2 4
2012-11-17 eredivisie 00112 13 afc Ajax VVV-Venlo 2 0
2012-11-25 eredivisie 00122 14 Roda JC afc Ajax 1 2
2012-12-01 eredivisie 00131 15 afc Ajax PSV 3 1
2012-12-08 eredivisie 00139 16 afc Ajax FC Groningen 2 0
2012-12-16 eredivisie 00153 17 Willem II afc Ajax 2 4
Ik denk dat mijn aanpak helemaal niet verkeerd is, alleen loop ik vast bij Stap 4.
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
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
while ($tespelenwedstrijden = mysqli_fetch_array($tespelenwedstrijdenquery, MYSQLI_ASSOC)) {
if($X == 1){
$datum_regel4 = $tespelenwedstrijden['datum']
$competitie_regel4 = $tespelenwedstrijden['comeptitie']
$wedstrijdID_regel4 = $tespelenwedstrijden['wedstrijdID']
$thuisploeg_regel4 = $tespelenwedstrijden['thuisclub']
etc...
;}
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['competitie']
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID']
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub']
etc...
$n += 1
;}
;}
else if($X == 3){
...
;}
else if($X == 4){
...
;}
}
if($X == 1){
$datum_regel4 = $tespelenwedstrijden['datum']
$competitie_regel4 = $tespelenwedstrijden['comeptitie']
$wedstrijdID_regel4 = $tespelenwedstrijden['wedstrijdID']
$thuisploeg_regel4 = $tespelenwedstrijden['thuisclub']
etc...
;}
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['competitie']
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID']
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub']
etc...
$n += 1
;}
;}
else if($X == 3){
...
;}
else if($X == 4){
...
;}
}
Volgens mij moet wat ik wil gewoon kunnen alleen doe ik blijkbaar iets verkeerd.
Gewijzigd op 12/07/2015 13:08:45 door Jo Immanuel
Jo Immanuel op 12/07/2015 11:23:06:
Ja maar ik wil LIMIT nu juist niet gebruiken in mijn SQL-queries A en B. Ik wil alle wedstrijden van een bepaald seizoen ophalen met SQL en die informatie onderverdelen in 2 arrays, 1 voor gespeelde wedstrijden en 1 voor te spelen wedstrijden. Dan kan ik de informatie uit die arrays hergebruiken.
Thomas van den Heuvel op 12/07/2015 11:32:30:
Dat kan in 1 query.
Huh?
Honderden records uit de database halen terwijl er maar 4 getoond worden?
Als beide queries met een LIMIT 4 uitgevoerd worden heb je alle situaties afgevangen en het aantal opgevraagde records drastisch beperkt.
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
$nogtespelen = mysqli_fetch_all($tespelenwedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($tespelenwedstrijdenquery);
$gespeeld = mysqli_fetch_all($gespeeldewedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($gespeeldewedstrijdenquery);
$cntA = count($nogtespelen);
$cntB = count($gespeeld);
$offset = ($cntA <= 2) ? 4 - $cntA : 2;
array_splice($gespeeld, $offset);
$gespeeld = array_reverse($gespeeld);
$offset = ($cntB <= 2) ? 4 - $cntB : 2;
array_splice($nogtespelen, $offset);
?>
$nogtespelen = mysqli_fetch_all($tespelenwedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($tespelenwedstrijdenquery);
$gespeeld = mysqli_fetch_all($gespeeldewedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($gespeeldewedstrijdenquery);
$cntA = count($nogtespelen);
$cntB = count($gespeeld);
$offset = ($cntA <= 2) ? 4 - $cntA : 2;
array_splice($gespeeld, $offset);
$gespeeld = array_reverse($gespeeld);
$offset = ($cntB <= 2) ? 4 - $cntB : 2;
array_splice($nogtespelen, $offset);
?>
Het zijn alle wedstrijden van 1 club in 1 bepaald seizoen. Kom je uiteindelijk uit op max. 50. Eens, dat zijn misschien veel records om in een array te zetten, maar ik wil op dezelfde pagina ook alle resultaten (gespeelde en te spelen wedstrijden) laten zien. En dan zou ik de queries 2x moeten uitvoeren.
Daarom wil ik geen LIMIT gebruiken.
En met mijn aanpak zou het ook moeten kunnen toch?
Toevoeging op 12/07/2015 15:53:59:
Mijn specifieke probleem is dus dat dit niet werkt:
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
...
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['competitie'];
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID'];
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub'];
etc...
$n += 1;
}
;}
else if($X == 2){
$n = 3;
for ($m = 0; $m < 2; $m++) {
${"datum_regel".$n} = $tespelenwedstrijden['datum'];
${"competitie_regel".$n} = $tespelenwedstrijden['competitie'];
${"wedstrijdID_regel".$n} = $tespelenwedstrijden['wedstrijdID'];
${"thuisploeg_regel".$n} = $tespelenwedstrijden['thuisclub'];
etc...
$n += 1;
}
;}
Het resultaat dat ik verwacht is dat de volgende variabelen voor de 2 eerstvolgende te spelen wedstrijden zijn aanmaakt:
$datum_regel3 & $datum_regel4
$competitie_regel3 & $competitie_regel4
$wedstrijdID_regel3 & $wedstrijdID_regel4
etc.
Nu worden de variabele wel aangemaakt, alleen is de vulling van de variabelen van regel 4 niet correct. Die hebben dezelfde waarden als die van regel 3 (de eerstkomende wedstrijd). Ze zouden gevuld moeten worden met de elementen van de wedstrijd daarna.
Dus blijkbaar doe ik iets verkeerd. Kan iemand mij vertellen wat?
Gewijzigd op 12/07/2015 17:57:13 door Jo Immanuel
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
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
<?php
/* Zet de resultaten van beide queries om in array's */
$nogtespelen = mysqli_fetch_all($tespelenwedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($tespelenwedstrijdenquery);
$gespeeld = mysqli_fetch_all($gespeeldewedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($gespeeldewedstrijdenquery);
$cntA = count($gespeeld);
$cntB = count($nogtespelen);
/***********************************
* Gedeeltelijk programma/uitslagen *
***********************************/
// gespeelde wedstrijden
if($cntA > 0) {
$offset = $cntA - 3 - (($cntB > 1) ? 0 : 2 - $cntB);
if ($offset < 0) {
$offset = 0;
}
for($i=$offset; $i < $cntA; $i++) {
echo $gespeeld[$i]['datum']; // etc.
}
}
//nog te spelen wedstijden
if($cntB > 0) {
$max = 1 + (($cntA > 1) ? 0 : 2 - $cntA);
if($max > $cntB - 1) {
$max = $cntB - 1;
}
for($j = 0; $j <= $max; $j++) {
echo $nogtespelen[$j]['datum']; // etc.
}
}
?>
/* Zet de resultaten van beide queries om in array's */
$nogtespelen = mysqli_fetch_all($tespelenwedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($tespelenwedstrijdenquery);
$gespeeld = mysqli_fetch_all($gespeeldewedstrijdenquery, MYSQLI_ASSOC);
mysqli_free_result($gespeeldewedstrijdenquery);
$cntA = count($gespeeld);
$cntB = count($nogtespelen);
/***********************************
* Gedeeltelijk programma/uitslagen *
***********************************/
// gespeelde wedstrijden
if($cntA > 0) {
$offset = $cntA - 3 - (($cntB > 1) ? 0 : 2 - $cntB);
if ($offset < 0) {
$offset = 0;
}
for($i=$offset; $i < $cntA; $i++) {
echo $gespeeld[$i]['datum']; // etc.
}
}
//nog te spelen wedstijden
if($cntB > 0) {
$max = 1 + (($cntA > 1) ? 0 : 2 - $cntA);
if($max > $cntB - 1) {
$max = $cntB - 1;
}
for($j = 0; $j <= $max; $j++) {
echo $nogtespelen[$j]['datum']; // etc.
}
}
?>
Bedankt voor je antwoord. Ik ben er inmiddels zelf ook uit. Ik was wat aan het worstelen met de for-loop.
Ik deed if(X == 1){for ..... } else if(X == 2){for ..... } else if(X == 3){for ..... } else if(X == 4){for ..... } en hetzelfde met if(Y == 1){for .....} etc. Dus in elke "if/else if" statement een for-loop (=8x). Veel te veel "for"-loopjes dus.
Ik heb nu 2 for-loops: 1 voor X en 1 voor Y. En daarna pas ik pas de if(X == 1){...} else if(X ==2) etc. en if(Y == 1){...} else if(Y ==2) etc. toe. En nu werkt het allemaal. En het ziet er nog redelijk lean uit allemaal.