Beste forumleden,

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:


$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;} 


Stap 4:
De 2 queries in arrays zetten en variabelen aanmaken die ge-echoed kunnen worden.


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


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


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.

Dat kan in 1 query.

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.
He Thomas,

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:


$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



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:


$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


Ik denk dat mijn aanpak helemaal niet verkeerd is, alleen loop ik vast bij Stap 4.


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){
        ...
    ;}
}


Volgens mij moet wat ik wil gewoon kunnen alleen doe ik blijkbaar iets verkeerd.

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.

<?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);
?>

He Ger,

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?

[size=xsmall]Toevoeging op 12/07/2015 15:53:59:[/size]

Mijn specifieke probleem is dus dat dit niet werkt:

...

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?
Ik denk dat je het jezelf te moeilijk maakt.

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

He Ger,

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.

Reageren