array_sum() van while-loop weergeven in bovenliggende while-loop?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Xaboteur X

Xaboteur X

29/03/2012 00:14:16
Quote Anchor link
Hallo allemaal,

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

}


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...
 
PHP hulp

PHP hulp

29/03/2024 07:02:36
 
Xaboteur X

Xaboteur X

30/03/2012 20:48:36
Quote Anchor link
Iemand enig idee hoe ik waardes van de tweede loop kan weergeven in de eerste?
 
Xaboteur X

Xaboteur X

02/04/2012 19:52:33
Quote Anchor link
Kan mij iemand misschien in de juiste richting sturen, want vind dit tot dusver niet terug via Google.
 
Wouter W

Wouter W

02/04/2012 20:29:15
Quote Anchor link
misschien kom je hier mee verder:

$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.
 
Xaboteur X

Xaboteur X

02/04/2012 22:02:14
Quote Anchor link
Bedankt voor je reactie Wouter W, maar dan krijg ik zoiets als dit 12465465465456461465135454.16546541654654+4564564654654654.345646545654+65456 in de laatste rij.

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?
 
Erwin H

Erwin H

03/04/2012 10:05:23
Quote Anchor link
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....
 
Xaboteur X

Xaboteur X

03/04/2012 12:58:19
Quote Anchor link
Hey Erwin, heb het inmiddels zelf opgelost, zoals je zei in mijn query.
Die ziet er nu als volgt uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Erwin H

Erwin H

03/04/2012 20:53:39
Quote Anchor link
En volgens mij kan je nog een stap verder met het gehele totaal, over alle producten in een query te berekenen, of alle totalen per product in een keer uit te rekenen in een query. Zodat je dus niet voor elk product een query hoeft te draaien (tenzij je dat inmiddels al doet en ik je query dus niet helemaal begrijp).

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
 
Xaboteur X

Xaboteur X

03/04/2012 22:16:44
Quote Anchor link
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...?
 
Kevin van Leeuwen

Kevin van Leeuwen

03/04/2012 22:24:31
Quote Anchor link
je kan met += optellen....

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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
 
Xaboteur X

Xaboteur X

03/04/2012 22:52:55
Quote Anchor link
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?
 
Jordi Kroon

Jordi Kroon

03/04/2012 22:56:58
Quote Anchor link
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.
 
Xaboteur X

Xaboteur X

04/04/2012 00:49:08
Quote Anchor link
Idd, maar het is maar voor een 4-tal vertrouwde gebruikers, waarvan 2 admin zijn.
Maarja, beter voorkomen dan te laat.
 
Erwin H

Erwin H

04/04/2012 10:46:00
Quote Anchor link
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...?

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/04/2012 11:06:35
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

EDIT (laat vanwege kl*teverbinding) in SQL
Gewijzigd op 04/04/2012 11:24:36 door Ger van Steenderen
 
Xaboteur X

Xaboteur X

04/04/2012 11:13:53
Quote Anchor link
Inderdaad Erwin..
Ik denk dat dit niet het juiste resultaat geeft, maar dus zo iets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;";


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
 



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.