zoals je ziet bij de kolom volgens database staat de SOM van de uren ingegeven tussen de datums die men wenst. en hiernaast staat iedere keer een BOX met als "name" het "ID" van de naam. Het is de bedoeling dat men in deze box het resultaat invult die men op papier heeft. en hieronder moet dan een submit knop komen om dan het verschil te berekenen en die moet in de kolom VERSCHIL komen.
-hernoem je $_POST niet
-je waarde in $_POST moet tussen ''
-je bovenste if wordt niet gesloten
en dan nog dit:
$query = "SELECT SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '$jaar%-$maand%-$dag% 00:00' AND '$jaartwee%-$maandtwee%-$dagtwee% 23:59'";
variabelen in een string moet zo:
$query = "SELECT SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '".$jaar."'%-'".$maand."'%-'".$dag."'% 00:00' AND '".$jaartwee."'%-'".$maandtwee."'%-'".$dagtwee."'% 23:59'";
echo '<div style="text-align: center;"><h2 style="text-decoration: underline;">Overzicht van de cheques tussen '.$dag.' '.$test.' '.$jaar.' en '.$dagtwee.' '.$testtwee.' '.$jaartwee.'.</h2></div>';
$sQuery = "
SELECT *, SUM(aantal_uren) AS optel_uren
FROM structuurhcs
WHERE datum BETWEEN '".$jaar."%-".$maand."%-".$dag."% 00:00' AND '".$jaartwee."%-".$maandtwee."%-".$dagtwee."% 23:59'
GROUP BY naam";
$sResult = mysql_query($sQuery);
echo '<div style="text-align: center;"><b>Totaal aantal uren: ' . $totaal_uren . '</b></div>';
} else {
echo 'Er zijn geen records gevonden.';
}
} else {
echo mysql_error().' in query: '.$sQuery;
}
} else {
echo 'Je bent iets vergeten in te vullen.';
}
}
// formulier.
?>
En nu heb je tenminste een fatsoenlijke code. Kun je goed mee debuggen als er later iets fout gaat.
Over je probleem: ik zou voor AJAX gaan, maar dat ligt aan jou ;-).
De query slaat nergens op, is technisch helemaal fout. Wanneer je hier geen foutmelding op krijgt, heb je blijkbaar de database niet fatsoenlijk geconfigureerd. Dat heb je ook aan de dataramp MySQL te danken, die is namelijk volkomen onbetrouwbaar en dus volkomen ruk. Data en resultaten kun je dus nooit vertrouwen, zeker niet wanneer je niet eerst zelf met het handje de boel hebt geconfigureerd.
Ga eerst SQL leren, dan zul je zelf ook zien dat jouw query niet kan kloppen, je kunt niet een aggregate functie gebruiken zonder een correcte (lees: complete) GROUP BY te gebruiken. (zie de tutorials met uitleg over GROUP BY)
Iedere fatsoenlijke database geeft een foutmelding op een foute GROUP BY, zorg er dan ook voor dat je een fatsoenlijke (en dus betrouwbare) database gaat gebruiken. Denk bv. aan PostgreSQL, Firebird, of ik weet niet wat, maar in elk geval iets wat beter is dan het hoopje ellende dat zich MySQL noemt.
ok ik heb de turtorial gelezen en ik zou beter se sort of order functie gebruiken
Ik had graag nu eerst deze functie toegevoegd. Ik heb geen tijd en de kennis niet om dit even in een andere DB taal te gaan schrijven. Ik denk ook toch niet dat mysql een dataramp is aangezien vele systemen/site's hierop betrouwen. Waarmee ik nu niet zeg dat er geen betere systemen zijn maar ik persoonlijk heb hier geen kennis/ervaring mee.
Dus ik had gewoon graag een duidelijk antwoord waarmee ik op weg kan.
Deze code is toch zoals hij nu bestaat al X aantal maanden in gebruik zonder problemen en ook zonder berekeningsfouten. De queryopbouw is misschien niet juist, ik zal deze later verfijen.
Dan moet je nog maar eens heel goed gaan testen, jouw query kan namelijk ONMOGELIJK correcte resultaten opleveren. Dat jij dat niet ziet of wilt zien, zegt meer over jou en MySQL dan over de query...
Het werkt goed zoals het nu is
Nee, is onmogelijk, kan niet, bestaat niet. Ooit wiskunde op school gehad? Ga je dan eens verdiepen in de verzamelingsleer.
Ik denk ook toch niet dat mysql een dataramp is aangezien vele systemen/site's hierop betrouwen.
Een gebrek aan kennis en kunde zit dan ook maar weinig mensen in de weg... Duik eens in de handleiding van MySQL, ga eens uitzoeken wat nu de basis is van een DBMS en zie dan het verschil tussen een DBMS (iets waar je op moet kunnen vertrouwen) en de bijzondere "functies" van MySQL. MySQL is 100% onbetrouwbaar, vergeet dat nooit.
Wanneer je MySQL op je eigen server volledig kunt configureren of zelf in staat bent om de code van MySQL te herschrijven (wat bv. Google heeft gedaan), dan wordt het een ander verhaal. Maar dan heb je wel een totaal andere database dan de shitzooi die webhosters opleveren. Daar is niets aan geconfigureerd.
Ga nu maar SQL leren, dan gaat bij jou het licht ook nog wel eens schijnen.
De reden dat GROUP BY in MySQL geintroduceerd is, is dat de verzamelingsfuncties zoals bijvoorbeeld SUM() en COUNT() altijd de verzameling van alle waarden uit een kolom retourneerden. Zonder de GROUP BY functie was het dus onmogelijk om bijvoorbeeld de som van een individuele groep waarden in een kolom te vinden.
Verzamelingsfuncties (engels: aggregate functions) zijn functies die een bewerking uitvoeren op een verzameling records en het resultaat retourneren. De belangrijkste functies zijn:
AVG() - Geeft het gemiddelde van een verzameling
COUNT() - Geeft het aantal waarden in een verzameling
MAX() - Geeft de maximale waarde uit een verzameling
MIN() - Geeft de minimale waarde uit een verzameling
SUM() - Geeft de som van de waarden in een verzameling
ik gebruik toch SUM in combinatie met een group by
Ik zeg dat mijn code zoals zij daar nu staat altijd al de juiste resultaten heeft gegeven. Het gaat over een DB met 50k records hij heeft al IEDERE keer de juiste resultaten gegeven ... of je me nu gelooft of niet....
Maar ik had het liever gehad over een oplossing in plaats van over mijn (niet) werkende code te spreken ...
Lees dan ook nog even het hoofdstuk daarna over het groeperen op meerdere kolommen. Dan zul je zien dat je altijd alle kolommen, die in de SELECT genoemd worden en geen onderdeel zijn van een aggregate functie, op moet nemen in de GROUP BY.
Tenzij jij zeker weet dat alle overige kolommen allemaal dezelfde waarden bevatten (wat me erg sterk lijkt met 50k records), zal MySQL met jouw query gewoon onbetrouwbare resultaten terug geven (zie ook die handleiding). Neem het goede advies van Frank nou gewoon ter harte, want neem maar van mij aan dat hij weet waar hij het over heeft...
Ik zeg dat mijn code zoals zij daar nu staat altijd al de juiste resultaten heeft gegeven.
Misschien, misschien ook niet. Daar kun jij onmogelijk garanties op geven...
Iedere keer? Of heb je iedere keer dezelfde fout gemaakt? Hou het maar op dat laatste... Geef mij die 50k records maar even en ik laat je binnen een minuutje zien dat jouw query foute resultaten oplevert. Dan zul je het zelf ook direct zien en jezelf voor je hoofd slaan dat je het niet eerder hebt gezien. Een klassieke fout die dagelijks door vele programmeurs wordt gemaakt.
<?
$query57 = "select * , SUM(aantal_uren) FROM structuurhcs WHERE datum BETWEEN '$jaar%-$maand%-$dag% 00:00' AND '$jaartwee%-$maandtwee%-$dagtwee% 23:59' group by naam";
?>
Jij vraagt alle kolommen op en wilt van 1 kolom de sommatie hebben. Je maakt een groep op basis van de naam. En waar blijft nu de groep van het id en eventuele overige kolommen? Dit is wiskundig onmogelijk!
Kortom, open je ogen en ga nu eens gestructureerd testen.
Zeuren over een oplossing heeft geen enkele zin wanneer de code mogelijk van A tot Z herschreven moet worden. Ik vermoed dat jij bv. al meerdere queries nodig hebt om alle resultaten op te vragen. Je kunt het namelijk niet met 1 query opvragen, dat blijkt al wel.
ps. Ga je database configureren, dan wordt jouw query ook met een fraaie foutmelding afgeschoten: PHPFreakz