Berekening via variabelen
Ik heb een heel simpel bestelscriptje waar je een aantal kaarten kunt bestellen.
Het werkt via een Form, welke de variabelen meestuurd naar een "sendHTMLEmail" pagina.
Op deze pagina moeten de variabelen uitgelezen worden, en een totaalbedrag moet gegenereerd worden, welke vervolgens automatisch in het mailbericht verschijnt.
De variabelen neemt de pagina prima mee, en de variabelen zijn leesbaar in het email bericht.
De rekensom om tot het totaalbedrag te komen werkt echter niet, het totaalbedrag blijft 0.
Dit zijn de variabelen:
aantal, prijs en kosten
Ik lees ze uit met een GET:
Code (php)
1
2
3
4
2
3
4
$totaal1 = $_GET['aantal'];
$totaal2 = $_GET['prijs'];
$totaal3 = $_GET['kosten'];
$antwoord = ($totaal1 * $totaal2) + $totaal3;
$totaal2 = $_GET['prijs'];
$totaal3 = $_GET['kosten'];
$antwoord = ($totaal1 * $totaal2) + $totaal3;
En de Email, pagina:
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
function sendHTMLEmailAuto($name, $adres, $postcode, $woonplaats, $email, $subject, $prijs, $aantal, $kosten, $antwoord){
include("web2mail_config.php");
$recipient = "$name <$email>";
$rand = md5(time());
$mime_boundary = "SNNC_". $rand;
$sub = "$auto_subject aan $name";
//$text_version = "$name, bedankt voor uw reservering via $your_website.\n\nMet vriendelijke groet\n$yourname\n\n\nOpmerking: Dit is een automatisch gegenereerd bericht, u kunt niet antwoorden op deze mail";
$html_version = "<html>\n<head>\n<style>\nA:link {text-decoration: none; color: $alink_color;}\nA:visited {text-decoration: none; color: $vlink_color;}\nA:hover {font-style: normal; color: $hlink_color; text-decoration: underline;}\nBODY{font-family: $html_font; font-size: $html_font_size;}TD {font-family: $html_font; color: #000000; font-size: $html_font_size;}\n</style>\n</head>\n<body>\n\n<table border=\"0\" cellpadding=\"6\" cellspacing=\"0\" width=\"100%\">\n<tr>\n<td colspan=\"2\">Geachte $name,<br><br>Dank voor uw bestelling. Wij hebben deze in goede orde ontvangen.<br><br>Uw bestelling:<br><br></td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Product</td>\n<td width=\"99%\">$subject</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Aantal</td>\n<td width=\"99%\">$aantal</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Prijs</td>\n<td width=\"99%\">€ $prijs</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Verzendkosten</td>\n<td width=\"99%\">€ $kosten</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Totaal</td>\n<td width=\"99%\">$antwoord</td>\n</tr>\n
En nog een zooi bla bla bla....
include("web2mail_config.php");
$recipient = "$name <$email>";
$rand = md5(time());
$mime_boundary = "SNNC_". $rand;
$sub = "$auto_subject aan $name";
//$text_version = "$name, bedankt voor uw reservering via $your_website.\n\nMet vriendelijke groet\n$yourname\n\n\nOpmerking: Dit is een automatisch gegenereerd bericht, u kunt niet antwoorden op deze mail";
$html_version = "<html>\n<head>\n<style>\nA:link {text-decoration: none; color: $alink_color;}\nA:visited {text-decoration: none; color: $vlink_color;}\nA:hover {font-style: normal; color: $hlink_color; text-decoration: underline;}\nBODY{font-family: $html_font; font-size: $html_font_size;}TD {font-family: $html_font; color: #000000; font-size: $html_font_size;}\n</style>\n</head>\n<body>\n\n<table border=\"0\" cellpadding=\"6\" cellspacing=\"0\" width=\"100%\">\n<tr>\n<td colspan=\"2\">Geachte $name,<br><br>Dank voor uw bestelling. Wij hebben deze in goede orde ontvangen.<br><br>Uw bestelling:<br><br></td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Product</td>\n<td width=\"99%\">$subject</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Aantal</td>\n<td width=\"99%\">$aantal</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Prijs</td>\n<td width=\"99%\">€ $prijs</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Verzendkosten</td>\n<td width=\"99%\">€ $kosten</td>\n</tr>\n
<tr>\n<td nowrap width=\"1%\">Totaal</td>\n<td width=\"99%\">$antwoord</td>\n</tr>\n
En nog een zooi bla bla bla....
$antwoord moet dus het totaal bedrag geven, maar doet dit niet.
Iemand enig idee hoe ik deze "rekensom" correct op kan zetten?
(was altijd al een druiloor met wiskunde ;-) )
Groeten,
Luit
Gewijzigd op 15/04/2014 12:07:48 door Luit Slopsema
Gewijzigd op 15/04/2014 12:05:50 door Michael -
Quote:
$antwoord moet dus het totaal bedrag geven, maar doet dit niet.
Wat doet het wel? wordt afgerond, telt zelf btw op, geeft foutmelding.....
Alles werkt voor de rest. Het is het simpelste van het simpelste, er hoeft bijv. niet eens btw over berekend worden.
De 3 variabelen worden wel correct uitgelzen, deze zijn zichtbaar in het mailbericht.
Alleen het totaal bedrag ($antwoord) blijft 0. De variabelen worden dus niet bij elkaar opgeteld.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$totaal1 = (int)$_GET['aantal'];
$totaal2 = (int)$_GET['prijs'];
$totaal3 = (int)$_GET['kosten'];
$antwoord = ($totaal1 * $totaal2) + $totaal3;
?>
$totaal1 = (int)$_GET['aantal'];
$totaal2 = (int)$_GET['prijs'];
$totaal3 = (int)$_GET['kosten'];
$antwoord = ($totaal1 * $totaal2) + $totaal3;
?>
>>> Ik lees ze uit met een GET:
Moet het geen POST zijn? Lijkt me wat vreemd om deze waardes via de url over te brengen terwijl je ze ook met het formulier kunt posten.
Let er trouwens op dat de <style> die je in je HTML mail gebruikt niet wordt ondersteund door bijv Gmail. Die accepteert alleen (beperkte) inline css.
understanding-gmail-and-css
Gewijzigd op 15/04/2014 13:18:04 door Michael -
Helaas, totaal nog steeds 0
Update:
Het werkt!
POST was idd de oplossing.
Heel erg bedankt voor alle hulp!
Greetz,
Luit
Gewijzigd op 15/04/2014 13:22:09 door Luit Slopsema
Doe eens een var_dump() op die GET waarden.
Quote:
Alles werkt voor de rest. Het is het simpelste van het simpelste, er hoeft bijv. niet eens btw over berekend worden.
De 3 variabelen worden wel correct uitgelzen, deze zijn zichtbaar in het mailbericht.
Alleen het totaal bedrag ($antwoord) blijft 0. De variabelen worden dus niet bij elkaar opgeteld.
De 3 variabelen worden wel correct uitgelzen, deze zijn zichtbaar in het mailbericht.
Alleen het totaal bedrag ($antwoord) blijft 0. De variabelen worden dus niet bij elkaar opgeteld.
Dat van die 0 bedoelde ik dus: het was niet duidelijk wat er mis ging. Had ook kunnen zijn dat jij prijzen met "4,95" doorgeeft en dan de .95 kwijt raakt bijvoorbeeld.
Wat ook erg handig zou zijn: error reporting aan zetten, want dan had je gewoon een melding gehad over niet bestaande GET variabelen...
Je mept wel een kronkel los in m'n hoofd, had nog geen rekening gehouden met cijfers achter de komma (of punt).
Dit zou voor kunnen komen in het bestelformulier. Is dit makkelijk aan te vullen op het script? Want als ik idd een getal met cijfers achter de komma gebruik, dan worden die niet meegenomen.
Werkt error reporting ook binnen een mail dan?
Zo ja, dan zal ik dat ook ff aanzetten.
werkt ook als de prijs 4.95 is.
Zou de prijs ook 4,95 mogen zijn:
MAAAAR
Ik hoop dat jij niet de prijs laat posten/ bepalen door de klant?
Op die manier zijn al de nodige TV's voor 1 euro verkocht en heeft in de buurt van Utrecht een pizza-tent jaren voor bijna niets bezorgd bij hongerige studenten.
Gewijzigd op 15/04/2014 13:40:18 door Ivo P
Luit Slopsema op 15/04/2014 13:07:22:
De 3 variabelen worden wel correct uitgelzen, deze zijn zichtbaar in het mailbericht.
Luit Slopsema op 15/04/2014 13:19:37:
POST was idd de oplossing.
Hoe kan het dan dat de 3 variabelen wel getoond werden in het mailbericht?
Dat is 1 van de redenen om geen variabelen te gaan aanmaken/kopiëren, als je ook gewoon met de $_GET / $_POST / $_SESSION waarde kunt werken.
Krijg het nog niet voor elkaar om cijfers achter de komma uit te lezen.
Heb nu het volgende:
Code (php)
1
2
3
2
3
$prijs = $_POST['aantal'] * $_POST['prijs'];
$totaal3 = (int)$_POST['kosten'];
$antwoord = $prijs + str_replace(',','.',$totaal3);
$totaal3 = (int)$_POST['kosten'];
$antwoord = $prijs + str_replace(',','.',$totaal3);
$antwoord blijft een geheel getal geven dus 50 in plaats van 50,45
ps Ivo, nee de prijzen etc. word niet door de klant ingevuld.
Enigste wat de klant kan doen is het aantal opgeven.
Gewijzigd op 15/04/2014 15:01:34 door Luit Slopsema
Quote:
Enigste wat de klant kan doen is het aantal opgeven.
Als dat het enige is wat de klant kan doen, hoe komt die prijs dan in je $_POST terecht??
Bij welke 3 invoeren (aantal, prijs, kosten) kom je op 50 ipv 50.45 uit?
Bij prijs en kosten kan het gebeuren dat er een getal achter de komma verschijnt.
Voorbeeld:
Ik bestel 2 kaarten a 10,00 Euro per stuk en er komt 2,50 verzendkosten overheen.
Dan komt het totaal op 22,50 Euro
Ik krijg 22 Euro in het overzicht, de ,50 wordt dus niet meegenomen.
Dan mis je hier enige kennis van beveiliging.
Alle POST en GET variabelen zijn aan te passen door gebruiker!
Ik kan gewoon een POST['prijs'] = 0 mee sturen en krijg dus alles gratis.
Vertrouw nooit input uit een POST of GET. Als jij een getal verwacht, controleer dit dan ook, het kan evengoed een kwaadaardig script zijn.
Het is meer een geinige aanvulling dan dat het echt igezet word voor een (commerciele) website.
Toch zou de cijfers achter de komma een leu,ke toevoeging zijn, maar de berekening neemt het niet mee.
Ook al wordt het intern gebruikt, het is dan nog steeds logischer om gewoon een variabele $prijs te hebben ipv $_POST['prijs'].
Edit: Blijkbaar kan int wel cijfers achter de komma bevatten.
De reden zal zijn dat je komma's gebruikt in plaats van een punt.
Met een komma kun je niet rekenen en is het een string ipv een getal.
Zorg dus dat alle prijzen een punt bevatten, en eventueel voor het weergeven kun je deze met number_format of de str_replace die je nu gebruikt aanpassen.
Zo zou het kunnen, maar niet aan te raden
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$kosten = '2,34';
$prijs = 30 * str_replace(',','.','4,96');
$totaal3 = str_replace(',','.',(int)$kosten);
$antwoord = $prijs + str_replace(',','.',$totaal3);
echo number_format($antwoord, 2, ',', ' ');
?>
$kosten = '2,34';
$prijs = 30 * str_replace(',','.','4,96');
$totaal3 = str_replace(',','.',(int)$kosten);
$antwoord = $prijs + str_replace(',','.',$totaal3);
echo number_format($antwoord, 2, ',', ' ');
?>
Gewijzigd op 15/04/2014 16:15:58 door Michael -
Michael - op 15/04/2014 16:08:38:
Edit: Blijkbaar kan int wel cijfers achter de komma bevatten.
int = integer = geheel getal. (positief of negatief)
Om een getal uit een POST te halen gebruik ik altijd strval().
$getal = strval(str_replace(',', '.', $_POST['getal']));
echo $getal;
Dus 22.5 i.p.v. 22.50 Is dit nog makkelijk aan te passen?
Niet om het als getal te bewaren, want dan valt of de 0 er weer af, of je hebt een probleem omdat je een komma als decimaalteken gebruikt