while loop in while loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jordy R

Jordy R

02/03/2015 07:27:49
Quote Anchor link
ik wil een while loop in een while loop zetten.
maar dit werkt niet ?
weet iemand waarom niet en hoe het dan wel moet.
alvast bedankt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
$query = "SELECT DISTINCT `Naamkoopman` FROM `Data-reclameopdemarkt`ORDER BY Naamkoopman ASC ";
$results = mysql_query($query);
while($row = mysql_fetch_assoc($results) ){

$persoon = $row['Naamkoopman'];



$qry = 'SELECT `Aantal`
FROM `Betaling`
WHERE `Week` <14
AND `Naamkoopman` = "'.$persoon.'"
';
$result = mysql_query($qry);
while($row = mysql_fetch_assoc($result)){
$zeilen = $zeilen+$row['Aantal'];
}
 


$betaling = $zeilen*"6.092307692307692";
$betaling = $betaling*"1.21";





If($betaling>0){
echo "<div style='float:left;width:50%;'>
<h5>Betaling ".$persoon."</h5><br>


<strong>Ontvangsten over 1 Kwartaal zijn &euro; ".round($betaling, 2)." ex BTW</strong><br><hr></div>";
$i=$i+$betaling;


}
else{};
}
 
PHP hulp

PHP hulp

16/11/2024 18:47:29
 
Thom nvt

Thom nvt

02/03/2015 08:23:19
Quote Anchor link
Wat er mis gaat heeft te maken met een principe genaamd "Variable scope".
Meer hier over op php.netphp.net

Dat hele verhaal (en ik raad aan het even door te lezen!) komt neer op 1 simpel punt:
In de definitie van de 1e while-loop gebruik je 2 variabelen: $results en $row.
Daarna vul je in die loop zelf de variabelen opnieuw, waardoor de waarde ervan veranderd. Hierdoor weet de while-loop niet meer waar deze overheen moet lopen (hoe dit exact werkt heeft te maken met werkgeheugen, array-pointers en ander C meuk wat iets te ver gaat om uit te leggen).

tl;dr:

Je moet de variabele $row en $result niet opnieuw toewijzen in de loop. Gebruik hier een andere naam ($row2 $result2 ofzo) en het zal werken.

Succes!
Gewijzigd op 02/03/2015 08:24:23 door Thom nvt
 
- Ariën  -
Beheerder

- Ariën -

02/03/2015 08:49:57
Quote Anchor link
persoonlijk ben ik geen voorstander van nummertjes in variabelen. Dit gaat ten koste van de leesbaarheid.
 
Thom nvt

Thom nvt

02/03/2015 09:07:15
Quote Anchor link
Daar ben ik het mee eens, raad dan ook aan bijvoorbeeld $persoonResults, $persoonRow en $zeilenResults en $zeilenRow te gebruiken.
Het ging hier echter hoofdzakelijk om het principe maar zal in het vervolg betere voorbeelden geven
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

02/03/2015 11:23:43
Quote Anchor link
Het herhaaldelijk uitvoeren van queries met het resultaat van een andere query binnen een loop is maar zelden nodig. Daar zijn joins voor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
SELECT
    d.Naamkoopman,
    ROUND(IFNULL(SUM(b.Aantal), 0) * 6.092307692307692 * 1.21, 2) betaling
FROM
    `Data-reclameopdemarkt` d
LEFT JOIN
    Betaling b
    ON d.Naamkoopman = b.Naamkoopman
    AND b.week < 14
GROUP BY
    d.Naamkoopman


Sterk aanbevolen is om geen min-tekens in tabelnamen te gebruiken
 
Jordy R

Jordy R

03/03/2015 10:55:47
Quote Anchor link
dit is hem had alleen de COUNT i.p.v de SUM functie nodig bedankt Ger.

Toevoeging op 03/03/2015 10:57:20:

sorry voor mij late reactie had wat problemen met in inloggen.
maar dat was al bekend volgens mij ?
 
Jordy R

Jordy R

04/03/2015 12:37:05
Quote Anchor link
Was hem toch niet hij doet hele gekken dingen als ik de query van Ger gebruik geeft hij als resultaat

Sum b.aantal * aantal markten die de persoon heeft.

dus bert heeft 4 markten en heeft 2 x 2 zeilen opgehangen
de uitkomst moet dus 4 zijn maar is nu 16.

ben al uren met DISTINCT bezig maar geen idee waar ik die moet plaatsen.

kunnen jullie er nog even naar kijken

alvast bedankt



Toevoeging op 04/03/2015 14:32:42:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT d.Naamkoopman, ROUND( IFNULL( SUM( b.Aantal ) , 0 ) * 6.092307692307692 * 1.21, 2 ) betaling
FROM `Data-reclameopdemarkt` d
LEFT JOIN Betaling b ON d.ID = b.Marktid
AND b.week <14
GROUP BY d.Naamkoopman


dit was hem !
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/03/2015 18:43:58
Quote Anchor link
Waarom werkte het eerst dan niet? Je hebt nu dezelfde query die ik gaf.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.