Ik wil mijn variabelen bij elkaar optellen in het script om daarna het totaal weg te schrijven in de database. De gegevens komen dus vanaf een formulier en die data wil ik dan in het script al graag optellen en dan pas in de MySql database weg te schrijven.
Ik weet dat php met een punt scheiding werkt bij decimalen wat ik later weer omzet naar een komma in de layout.
Nu is het optellen van hele getallen niet zo heel moeilijk, maar ik begrijp even niet waarom dat met een decimaal erbij ineens wel moeilijk gaat, want tot mijn verbazing schrijft de php server het getal weg met een komma in mijn tabel. Wat doe ik dus fout en zie ik over het hoofd?
Moet ik nou float of varchar gebruiken als type in de database?
Om fouten te voorkomen met wegschrijven vanaf het formulier heb ik ervoor gekozen om de euro en centen apart te vermelden en die voeg ik in het script dan bij elkaar met de punt als scheidingsteken.
Nu bedacht ik dat het dus heel simpel op te tellen is met deze code:
$Prijs_netto = $Prijs_bruto + $Prijs_toeslag;
Maar als ik dit weg schrijf wordt er een komma geplaatst in de tabel. Why?
Ik weet niet of ik hier de SUM ook kan gebruiken omdat die in alles wat ik lees, enkel in de SELECT wordt toegepast en dat is nou juist het aparte, ik heb het nog niet in de database staan.
Thanks, aan deze hulp heb ik wat. Dit kende ik niet als mogelijkheid en ga die zeker in acht nemen in het proces.
Geldt dit dan hetzelfde als voor INSERT?
Adoptive Solution op 17/03/2022 19:54:04
Je kan ook de losse getallen naar de database sturen en het daar laten formatteren.
Hier bijvoorbeeld met een UPDATE.
FORMAT is een functie die bedoeld is in combinatie met een SELECT-query.
Met deze functie kun je een veld formateren in bijvoorbeeld "eur 1.999,45"
Dat is vooral leuk als je de query niet in combi met PHP gebruikt. Bijvoorbeeld om een en ander direct naar een mail te copy-pasten.
Dat je nu format slechts gebruikt om hem op 2 decimalen af te ronden:
a) doe dat dan met ROUND() of FLOOR() cq. CEIL()
b) als je de kolom in je tabel definieert als een DECIMAL 10,2 bereik je hetzelfde.
En als je dan 10 + 2 met FORMAT tot 12.00 maakt en opslaat: met je SELECT query krijg je daarna gewoon 12 terug.
Ik vraag me sterk af of je wel een financieel programma moet willen maken zonder basiskennis van hoe computers met getallen omgaan? Als je dat programma serieus wilt inzetten kan je daar dure fouten mee maken. Zelfs Wikipedia heeft een artikel over zwevendekommagetallen als foutbron.
Computers verwerken zwevendekommagetallen volgens de IEEE 754 specificatie. PHP heeft de taal C als basis, en er bestaat niet zoiets als dat PHP iets kan met komma's in getallen. Die vermeende komma is ALTIJD een punt. Zo werken floats in PHP nu eenmaal.
Floats bestaan dus niet alleen in PHP, maar ook in de database, en ze zijn totaal ongeschikt voor het opslaan van, of rekenen met geld.
Je moet werken met exacte gegevenstypen zoals DECIMAL, en als je database ingesteld staat om getallen weer te geven met een komma in plaats van een punt, dan staat je database onhandig ingesteld en moet je dat eerst veranderen.
En wanneer je naar een gebruiker toe iets wilt met getallen, dan is het overwegen van het HTML-element 'input' het overwegen waard. Je kunt een <input> -tag maken met de attributen type="number", eventueel met step="0.01" voor de centen, min="" en max="" om te zorgen dat er geen negatieve bedragen worden ingevuld, en dat het niet hoger kan zijn dan je DECIMAL(10,2) in je database.
Ik heb geen invloed op de instellingen van de php server omdat ik deze niet zelf host.
De reden dat ik het nu juist allemaal aanpas is juist om fouten te voorkomen. Voorheen had ik enkel 1 veld waar het bedrag incl decimalen werd ingevuld en daar ging het nog wel eens fout. i.p.v. de punt werd de komma geplaatst.
En dan ben ik stom verbaasd dat een server de getallen 10.00 + 2.50 omzet naar 12,5. En als je hier een antwoord op kan geven, ben je mijn held.
Ik heb zeker mijn velden nu beveiligd met welke waardes er mogen worden ingevoerd, daar ligt het ook niet aan, wel aan de berekening door de server.
De getallen worden nu ook opgeslagen als DECIMAL in de database maar ben gewoon verbaasd dat dit pas werkt als ik het getal eerst weer een FORMAT moet geven voordat ik hem op de juiste wijze kan wegschrijven in de database.
Ik ben geen programmeur, ik ben een vormgever met beperkte kennis van PHP en deze website draait al vanaf 2008 en heeft nu drastisch verbeteringen nodig. Scripting was enorm verouderd en was nog gebaseerd op versie 4.
Het gaat hier om een systeem om kaarten voor een theater te reserveren, dus geen complex financieel gedoe. Er wordt ergens een waarde neergezet vanuit de database, er wordt een optelling gedaan en uiteindelijk een berekening van het aantal kaarten en het bedrag. Niet meer en niet minder.
Ad Fundum op 18/03/2022 03:16:20
Prachtig voorbeeld van SQL-injectie.
Ik vraag me sterk af of je wel een financieel programma moet willen maken zonder basiskennis van hoe computers met getallen omgaan? Als je dat programma serieus wilt inzetten kan je daar dure fouten mee maken. Zelfs Wikipedia heeft een artikel over zwevendekommagetallen als foutbron.
Computers verwerken zwevendekommagetallen volgens de IEEE 754 specificatie. PHP heeft de taal C als basis, en er bestaat niet zoiets als dat PHP iets kan met komma's in getallen. Die vermeende komma is ALTIJD een punt. Zo werken floats in PHP nu eenmaal.
Floats bestaan dus niet alleen in PHP, maar ook in de database, en ze zijn totaal ongeschikt voor het opslaan van, of rekenen met geld.
Je moet werken met exacte gegevenstypen zoals DECIMAL, en als je database ingesteld staat om getallen weer te geven met een komma in plaats van een punt, dan staat je database onhandig ingesteld en moet je dat eerst veranderen.
En wanneer je naar een gebruiker toe iets wilt met getallen, dan is het overwegen van het HTML-element 'input' het overwegen waard. Je kunt een <input> -tag maken met de attributen type="number", eventueel met step="0.01" voor de centen, min="" en max="" om te zorgen dat er geen negatieve bedragen worden ingevuld, en dat het niet hoger kan zijn dan je DECIMAL(10,2) in je database.
Ik heb geen invloed op de instellingen van de php server omdat ik deze niet zelf host.
Opsich is er een hoop invloed uit te oefenen op standaard instellingen via flags in htaccess of php.ini settings. Op welke instellingen doel je op?
?Onbekende gebruiker
18-03-2022 21:53
Nanno Koerts op 16/03/2022 15:46:15
De gegevens komen dus vanaf een formulier en die data wil ik dan in het script al graag optellen en dan pas in de MySql database weg te schrijven.
Daar heb je het, je gebruikers voeren de cijfers in zoals zij het gewend zijn. Kan je opvangen door een str_replace(',', '.', $cijfer); en met de FORMAT()-functie in MySQL om de komma weer terug te krijgen. Let wel dat je niet in de script gaat rekenen met floats, maar met strings met bijvoorbeeld bcadd(). Of je laat het optellen aan de database, daar heb je hem voor.
Je zou de komma kunnen opvangen bij de input Regex, en dna met punt opslaan in de database. Bij het weergeven kun je het omgekeerde doen. Dus komma tonen als je een decimale punt hebt. Hierdoor sla je allen op een manier op in de database. En pas je presentatie alleen aan.