Ik heb een script waar er een artikel kan gekozen worden met bijhorende opties.
De prijs wordt berekend per vierkante meter of per formaat,afhankelijk van de instelling.
Ik heb een tabel structuur voor de artikelen:
ARTIKELID PRIJS MIN MAX SETTING
1 10 10 15 1
2 15 1 2 2
Tabel structuur voor optie montage
MONTAGEID PRIJS MIN MAX SETTING
1 10 10 15 1
2 15 1 2 2
Setting 1 -> per formaat
Setting 2 -> per vierkante meter
Wanneer er 100 cm / 100cm ingegeven wordt en de setting staat op 2 -> 1 vierkante meter neem de prijs van het artikel + de prijs van de bijhorende opties.
$query_pervierkantemeter="SELECT pz.artikel_id,pz.page_id,pz.setting AS setting_artikel,pz.min_vierkant_m AS artikel_min,pz.max_vierkant_m AS artikel_max, pl.page_id,pl.laminatie_id,pl.setting AS setting_laminatie,pl.min_vierkant_m AS montage_min,pl.max_vierkant_m AS montage_max,pm.page_id,pm.montage_id,pm.setting AS setting_montage,pm.min_vierkant_m AS laminatie_min,pm.max_vierkant_m AS laminatie_max
FROM printtoplate_prijzen pz
INNER JOIN printtoplate_prijzen_laminatie pl
ON (pl.laminatie_id='$type_laminatie' AND pl.page_id='$page_id')
INNER JOIN printtoplate_prijzen_montage pm
ON(pm.montage_id='$type_montage' AND pm.page_id='$page_id')
WHERE pz.artikel_id='$artikelid' AND pz.page_id='$page_id'";
Over het vraagstuk:
Het kan aan mij liggen, maar ik snap het verband tussen de artikelen tabel en de montage tabel niet helemaal. Zou je de betekenis van de (relevante) kolommen (voor je vraagstuk (verder)) kunnen toelichten? In je query gebruik je $page_id, wat betekent dit en waar komt deze waarde vandaan? Ook snap ik de berekeningen niet helemaal? Bevat de montagetabel ingeval setting 2 de prijs per vierkante meter van een specifiek artikel? Hoe luidt de berekening ingeval setting 1 (per formaat), en wat betekent "per formaat"? In het algemeen: hoe zien de verschillende berekeningen er uit? Misschien werkt het (zeer) verhelderend als je een praktijkvoorbeeld beschrijft.
Over de code:
- $page_id?
- gebruik mysql_real_escape_string() in je query, vooral als waarden waarmee je vergelijkt handmatig worden ingevoerd, wellicht wil je ook wat meer type-controles inbouwen (is je invoer numeriek?); en als een variabele slechts bepaalde waarden kan hebben: gebruik selectboxes (misschien doe je dat al maar het formulier zit er niet bij)
- weet je zeker dat het queryresultaat altijd uit precies één record bestaat? misschien verstandig om te controleren, zeker gezien je (handmatige?) invoer accepteert
- de rekensom hoeft niet per se in MySQL opgelost te worden, als het makkelijker is om dit in PHP te doen kun je deze altijd naar PHP verplaatsen
In het formulier kan men meerdere formaten ingeven, 10 cm / 15 cm... 100 cm / 100 cm...
Er zijn twee soorten berekeningen per vierkante meter of per formaat, in de tabel artikelen heb je setting 2 die staat voor per formaat dus wanneer in tabel setting 2 met formaat 10/15 gevonden is neem deze prijs is setting 1 met 10/15 bereken totaal vierkante meter van alle formaten en zoek tussen 10-15 vierkante meter. Bij de opties moet het zelfde worden gedaan zoals bij de artikelen alleen hoeft de prijs opgeteld worden met het artikel.
Een voorbeeld hoe de vierkante meter wordt berekend maar dit is nog zonder deze setting erin:
/// VIERKANTE METER UITREKENEN + AANTAL STUKS OPTELLEN
// ALS DE SETTING 1 is in de tabel artikelen, montage
$lengte=$txt_lengte/100;
$breedte=$txt_breedte/100;
$vierkantemeter=$lengte*$breedte*$txtaantalstuks;
$totaal_vierkantemeter+=$vierkantemeter;
$aantalstuks+=$txtaantalstuks;
$profiel_prijs+=$prijs_profiel;
$totaalmeter_profiel+=$totaal_meter;
}
//// IF DE SETTING 2 BEREKEN PER FORMAAT///
/// PRIJS PER FORMAAT //
$query_prijs="SELECT * FROM printtoplate_prijzen WHERE min_vierkant_m >= '$txt_lengte' AND max_vierkant_m >= '$txt_breedte' AND artikel_id ='$artikelid'";
$query_prijs="SELECT * FROM printtoplate_prijzen WHERE min_vierkant_m >= '$txt_lengte' AND max_vierkant_m >= '$txt_breedte' AND laminatie_id ='$laminatie_id'";
echo'<script type="text/javascript">alert("Fout, de maximale hoogte/breedte: '.$maxbreedte.' cm / '.$maxlengte.' cm en minimum '.$minn.' cm");</script>';
$query_staffel="SELECT * FROM printtoplate_prijzen WHERE $totaal_vierkantemeter BETWEEN min_vierkant_m AND max_vierkant_m AND artikel_id ='$artikelid'";