array_sum() van while-loop weergeven in bovenliggende while-loop?
Ik geef met een while-loop verschillende records weer.
In deze while-loop wil ik nog een while-loop zetten die andere records retourneert met overeenstemmende id van bovenliggende while-loop.
De waardes van de tweede while-loop wil ik bij elkaar optellen en weergeven in de eerste while-loop.
Klein voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while($producten = mysql_fetch_array($get_producten)) {
$product_id = $producten['id'];
$select_product_totaal = "SELECT totaal FROM product_aantal WHERE id = '$product_id';";
$get_product_totaal = mysql_query($select_product_totaal) or die ("Query mislukt: " . mysql_error());
while($product_totaal = mysql_fetch_array($get_product_totaal)) {
$totalen[] = $product_totaal['totaal'];
}
$totaal = array_sum($totalen);
echo $totaal;
}
$product_id = $producten['id'];
$select_product_totaal = "SELECT totaal FROM product_aantal WHERE id = '$product_id';";
$get_product_totaal = mysql_query($select_product_totaal) or die ("Query mislukt: " . mysql_error());
while($product_totaal = mysql_fetch_array($get_product_totaal)) {
$totalen[] = $product_totaal['totaal'];
}
$totaal = array_sum($totalen);
echo $totaal;
}
Het is dus noodzaak dat ik de som van de verschillende totalen in de eerste while-loop weergeef. Maar dit lukt blijkbaar alleen als ik de array_sum() buiten de while-loops bereken. En dan kan ik het dus niet meer terug weergeven met de eerste while-loop...
Iemand enig idee hoe ik waardes van de tweede loop kan weergeven in de eerste?
Kan mij iemand misschien in de juiste richting sturen, want vind dit tot dusver niet terug via Google.
$totalen = "";
while($producten = mysql_fetch_array($get_producten)) {
$product_id = $producten['id'];
$select_product_totaal = "SELECT totaal FROM product_aantal WHERE id = '$product_id';";
$get_product_totaal = mysql_query($select_product_totaal) or die ("Query mislukt: " . mysql_error());
while($product_totaal = mysql_fetch_array($get_product_totaal)) {
$totalen .= $totalen + $product_totaal['totaal'];
}
echo $totaal;
}
Weet niet of dit nu precies is wat je bedoeld.
Hoe ik het het eerst had, in mijn eerste post, werden niet alleen per product_id de totalen opgeteld, maar ook nog eens de voorgaande totalen van de rijen. Dit laatste is er dus teveel aan.
Maar als ik logisch redeneer:
1e while: "voor elke product_id"
2e while: "voor elk totaal met product_id"
-> array totalen optellen
-> som weergeven in 1e while
Dan moet logischerwijs toch enkel het totaal worden opgeteld en weergegeven van het betreffende product_id?!
Wat zie ik over het hoofd?
Een veel slimmere manier is natuurlijk om dit helemaal in een SQL query op te lossen. Alleen laat je het eerste SQL statement niet zien, dus kan ik je voorlopig niet verder helpen....
Die ziet er nu als volgt uit:
Code (php)
1
$select_product_totaal = "SELECT SUM(totaal+(totaal*btw/100)) FROM product_aantal WHERE id = '$product_id';";
Maar dit is dus niet mogelijk met wat ik in mijn eerste post wou bereiken?
Gewijzigd op 03/04/2012 12:58:52 door Xaboteur X
Op die andere manier kan het vast ook, maar als ik jou was zou ik daar niet eens meer naar kijken, want niet de efficientste methode.
Gewijzigd op 03/04/2012 20:54:26 door Erwin H
Uit die loop haal ik dan het product_id, zodat ik voor dat id de totalen kan vinden uit de tabel product_totaal.
Voor die totalen heb ik dus het product_id nodig, die ik uit de eerste loop haal.
Ben niet zeker of dit in één query kan...?
Code (php)
1
$select_product_totaal = "SELECT SUM(totaal+(totaal*btw/100)) FROM product_aantal WHERE id = '$product_id';";
Maar dit is dus niet mogelijk met wat ik in mijn eerste post wou bereiken?
[/quote]
Dat gaat denk ik niet werken. Zo denk ik wel:
Code (php)
1
$select_product_totaal = "SELECT SUM(totaal+(totaal*btw/100)) FROM product_aantal WHERE id = '".mysql_real_escape_string($product_id)."'";
Meteen even zorgen dar geen sql injections komen ;)
Gewijzigd op 03/04/2012 22:34:36 door Kevin van Leeuwen
Kevin, bedankt voor de tip, maar is het voorkomen van sql injections ook nodig wanneer het systeem achter een beveiligde login draait voor enkel een paar gebruikers?
Stel nou dat die paar gebruikers nou kwaadaardig zijn. Dan kunnen ze wel heel je database inlezen of zelfs als admin inloggen. Dat wil je niet als site beheerder.
Maarja, beter voorkomen dan te laat.
Xaboteur X op 03/04/2012 22:16:44:
De query voor mijn eerste loop haalt gewoon alle productgegevens op, van tabel products.
Uit die loop haal ik dan het product_id, zodat ik voor dat id de totalen kan vinden uit de tabel product_totaal.
Voor die totalen heb ik dus het product_id nodig, die ik uit de eerste loop haal.
Ben niet zeker of dit in één query kan...?
Uit die loop haal ik dan het product_id, zodat ik voor dat id de totalen kan vinden uit de tabel product_totaal.
Voor die totalen heb ik dus het product_id nodig, die ik uit de eerste loop haal.
Ben niet zeker of dit in één query kan...?
Natuurlijk kan dat in één query. Dat is nu juist de kracht van een database. Als je nu 100 producten ophaalt doe je 101 queries, dat zijn er dus 100 teveel.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT p.productnaam,
p.product_id AS pid
pa.product_id AS ptid,
SUM(pa.totaal) AS totaal
FROM
producten AS p
LEFT JOIN
product_aantal AS pa USING (product_id)
GROUP BY p.product_id, pa.product_id, p.productnaam
p.product_id AS pid
pa.product_id AS ptid,
SUM(pa.totaal) AS totaal
FROM
producten AS p
LEFT JOIN
product_aantal AS pa USING (product_id)
GROUP BY p.product_id, pa.product_id, p.productnaam
EDIT (laat vanwege kl*teverbinding) in SQL
Gewijzigd op 04/04/2012 11:24:36 door Ger van Steenderen
Ik denk dat dit niet het juiste resultaat geeft, maar dus zo iets:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$select_products = "
SELECT producten.id,
producten.naam,
producten.type,
producten.prijs,
SUM(product_aantal.totaal+(product_aantal.totaal*product_aantal.btw/100))
FROM producten
JOIN product_aantal
ON producten.id = product_aantal.id;";
SELECT producten.id,
producten.naam,
producten.type,
producten.prijs,
SUM(product_aantal.totaal+(product_aantal.totaal*product_aantal.btw/100))
FROM producten
JOIN product_aantal
ON producten.id = product_aantal.id;";
Ger was mij voor.. Bedankt, ik ga het straks proberen!
EDIT: Ger, hartelijk dank! Werkt super! :)
Gewijzigd op 04/04/2012 16:04:59 door Xaboteur X