Tellen vanuit Database
ik wil graag een programma maken waarmee hij vanuit de database alle waarden op wilt tellen (een soort van cijfersysteem, waar ik online al m'n cijfers invoeren, hoevaak ze tellen etc.) dus bijvoorbeeld ik heb voor frans (het proto-voorbeeld vak :P) een 5, 8, 9 ,7 gehaald. De 5 & 9 tellen 2 keer mee, de 8 & 9 4x. dan krijg je dus:
$som = 5 + 5 + 8 + 8 + 8 + 8 + 9 + 9 + 7 + 7 + 7 + 7;
maar, hoe kan ik dit doen als ik m'n waarden in de database staan. Ik ga d'r eigenlijk een beetje van uit dat PHP dit wel kan, maar ik kan nergens op internet een goed scriptje voor krijgen. :)
Alvast Bedankt
Bas
een leuk idee! Bij het opzetten van een database moet je altijd kijken hoe zit met je datamodel.
In dit geval:
- je hebt een aantal vakken
- per vak kun je meer dan 1 cijfer krijgen
- elk cijfer heeft een bepaald 'gewicht', 1, 2, 3 of 4
Je hebt dus twee tabellen nodig:
- vakken
id
naam
- cijfers
id
cijfer
gewicht
vak_id
Als je het zo opzet, kun je heel gemakkelijk allerlei overzichten uit je db laten rollen.
Ok, super bedankt, maar hoe kun ik ze dan automatisch laten optellen? Dus zoals ik voordeed in m'n voorbeeld :)
Dat doe je dan met de MySQL functie SUM(). Maar voordat ik ga kijken of ik je daar een voorbeeld van kan geven wil ik graag weten of je het ook echt zo aan gaat pakken.
Wat bedoel je met: "Wil ik graag weten of je het ook echt zo aan gaat pakken"?
Bas
voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$frans[1]['cijfer']=8;
$frans[1]['weging']=2;
$frans[2]['cijfer']=4;
$frans[2]['weging']=3;
// cijfers tellen
$tellen=count($frans);
$eindcijfer=0;
$weging=0;
for ($i=1;$i<=$tellen;$i++){
// totaal punten (cijfer*weging)
$totaalcijfer .= $frans[$i]['cijfer']*$frans[$i]['weging'];
// totale weging
$weging.=$frans[$i]['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
$frans[1]['cijfer']=8;
$frans[1]['weging']=2;
$frans[2]['cijfer']=4;
$frans[2]['weging']=3;
// cijfers tellen
$tellen=count($frans);
$eindcijfer=0;
$weging=0;
for ($i=1;$i<=$tellen;$i++){
// totaal punten (cijfer*weging)
$totaalcijfer .= $frans[$i]['cijfer']*$frans[$i]['weging'];
// totale weging
$weging.=$frans[$i]['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
Bas:
gefeli, 3200 posts ;)
Wat bedoel je met: "Wil ik graag weten of je het ook echt zo aan gaat pakken"?
Bas
Wat bedoel je met: "Wil ik graag weten of je het ook echt zo aan gaat pakken"?
Bas
Daarmee bedoelde ik: als je mijn idee niets vindt, ga ik er geen tijd in steken om een mooie query voor je te verzinnen :-)
@ Robert: die code zal denk ik wel werken, maar zoals je weet streef ik ernaar om de db het werk te laten doen en alles in een mooie elegante query te doen. Maar voor Bas is jouw tip denk ik makkelijker te begrijpen.
Jan:
Daarmee bedoelde ik: als je mijn idee niets vindt, ga ik er geen tijd in steken om een mooie query voor je te verzinnen :-)
Bas:
gefeli, 3200 posts ;)
Wat bedoel je met: "Wil ik graag weten of je het ook echt zo aan gaat pakken"?
Bas
Wat bedoel je met: "Wil ik graag weten of je het ook echt zo aan gaat pakken"?
Bas
Daarmee bedoelde ik: als je mijn idee niets vindt, ga ik er geen tijd in steken om een mooie query voor je te verzinnen :-)
Je idee lijkt me wel wat! Tenminste, als je denkt dat het handig is :) en natuurlijk me wilt helpen ;)
Ik weet het, dat zou het mooiste zijn. (in ieder geval het snelst) maar omdat ik zo niet weet hoe die query eruit moet zien, bedacht ik dat het zo ook wel kon.
ff door op mijn voorbeeld, als je ze ophaalt uit je tabel, en dit zijn je kolomnamen:
cijfer
weging
dan krijg je het zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
// totaal punten (cijfer*weging)
$totaalcijfer .= $cijfers['cijfer']*$cijfer['weging'];
// totale weging
$weging.=$cijfer['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
// totaal punten (cijfer*weging)
$totaalcijfer .= $cijfers['cijfer']*$cijfer['weging'];
// totale weging
$weging.=$cijfer['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
Gewijzigd op 02/01/2006 23:07:00 door Robert Deiman
Lijkt mij prima te werken.
dan rolt dit er uit: 541.861758077
terwijl m'n cijfers zijn:
Cijfer | Weging
7,5 | 1
7,5 | 3
7,5 | 3
8,0 | 3
Wat doe ik fout.. :O
// totaal punten (cijfer*weging)
$totaalcijfer .= ($cijfers['cijfer']*$cijfer['weging']);
cijfers[] en daarna cijfer[]
evenals die:
$weging.=$cijfer['weging']; = nu
$weging.=$cijfers['weging'];
En nu klopt het wel? of nog steeds niet?
Still not..
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
// totaal punten = +(cijfer*weging)
$totaalcijfer .= ($cijfers['cijfer']*$cijfers['weging']);
// totale weging
$weging.=$cijfers['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
// totaal punten = +(cijfer*weging)
$totaalcijfer .= ($cijfers['cijfer']*$cijfers['weging']);
// totale weging
$weging.=$cijfers['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
Als ik hier zo ff met logica doorheenloop doet die dit:
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
$totaalcijfer .= 7,5*1; //7,5
$totaalcijfer .= 7,5*3; //22,5 --> 30
$totaalcijfer .= 7,5*3; //22,5 --> 52,5
$totaalcijfer .= 8*3; //24 --> 76,5
$weging .=1; //1
$weging .=3; //4
$weging .=3; //7
$weging .=3; //10
$eindcijfer = 76,5/10; // 7,65 (nog niet afgerond :P)
?>
$totaalcijfer .= 7,5*1; //7,5
$totaalcijfer .= 7,5*3; //22,5 --> 30
$totaalcijfer .= 7,5*3; //22,5 --> 52,5
$totaalcijfer .= 8*3; //24 --> 76,5
$weging .=1; //1
$weging .=3; //4
$weging .=3; //7
$weging .=3; //10
$eindcijfer = 76,5/10; // 7,65 (nog niet afgerond :P)
?>
Maar misschien als je de cijfers met een . in plaats van een , doet dat het wel werkt :)
$weging += $cijfers['weging']
Want nu zet je het alleen achter elkaar...
Edit: Inderdaad, moet wel met punt zijn.
Maar dat kan je nog met een regeltje vervangen, hoef je ook niet op te letten hoe je ze in de DB stopt.
str_replace(",",".",$cijfers['cijfer']);
Gewijzigd op 03/01/2006 11:03:00 door Willem Jan Z
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
$cijfers=str_replace(",",".",$cijfers['cijfer']);
// totaal punten = +(cijfer*weging)
$totaalcijfer += ($cijfers*$cijfers['weging']);
// totale weging
$weging+=$cijfers['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
$eindcijfer=0;
$weging=0;
while ($cijfers=mysql_fetch_array($sql)){
$cijfers=str_replace(",",".",$cijfers['cijfer']);
// totaal punten = +(cijfer*weging)
$totaalcijfer += ($cijfers*$cijfers['weging']);
// totale weging
$weging+=$cijfers['weging'];
}
$eindcijfer=$totaalcijfer/$weging;
echo $eindcijfer;
?>
EDIT:
Willem-Jan had inderdaad gelijk, moet wel met +=, anders gooit die alle cijfers gewoon achter elkaar. :)
Gewijzigd op 03/01/2006 11:31:00 door Robert Deiman