ik heb ooit een keer een heel mooi boekhoudscript gemaakt en deze moet nu een beetje aangepast worden
eigelijk heel veel

het is van jaren allemaal hardcoded in elkaar gezet en eigenlijk bijna geen gebruik van functies

ik heb dus op heel veel paginas 1 en dezelfde code staan die eigenlijk gewoon in een functie zouden moeten

maar op 1 of andere manier weet ik niet meer hoe ik meerdere outputs krijg

input is datum, accountid, userid

output is een hele waslijst
die ik dus individueel moet kunnen opvragen indien dit zou kunnen met een functie
ik zal hier ff een voorbeeld geven van 1 van de codes die er nu in staan





$sqldranken = "SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id_user='$userid' AND soort='dranken' AND invoer_over='$datum' ORDER BY id ASC";
$resultaatdranken = $db->sql_query($sqldranken) or die(mysqli_error());
							

$eindtotaaldrankenbtwlaagafgerond = '0';
$eindtotaaldrankenbtwhoogafgerond = '0';

while($omzetdranken = mysqli_fetch_assoc($resultaatdranken)){
$btwsoort = ''.$omzetdranken['btwhoogte'].'';	
															
if($btwsoort == btwlaag) {
$omzetdrankenbtwlaag = mysqli_fetch_array($db->sql_query("SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id='$omzetdranken[id]' AND id_dame='$userid' AND soort='dranken' AND btwhoogte='btwlaag' AND invoer_over='$datum';"));

$totaaldrankenbtwlaagafgerond = $omzetdrankenbtwlaag[aantal] * $omzetdrankenbtwlaag[bedrag];												$totaaldrankenbtwhoogafgerond = '0';
												
}
elseif($btwsoort == btwhoog) {
$omzetdrankenbtwhoog = mysqli_fetch_array($db->sql_query("SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id='$omzetdranken[id]' AND id_dame='$userid' AND soort='dranken' AND btwhoogte='btwhoog' AND invoer_over='$datum';"));

$totaaldrankenbtwhoogafgerond = $omzetdrankenbtwhoog[aantal] * $omzetdrankenbtwhoog[bedrag];
$totaaldrankenbtwlaagafgerond = '0';
}
else {
$totaaldrankenbtwlaagafgerond = '0';
$totaaldrankenbtwhoogafgerond = '0';
		
}

$eindtotaaldrankenbtwlaagafgerond = $eindtotaaldrankenbtwlaagafgerond + $totaaldrankenbtwlaagafgerond;
$eindtotaaldrankenbtwhoogafgerond = $eindtotaaldrankenbtwhoogafgerond + $totaaldrankenbtwhoogafgerond;							
}




dit is maar een klein stukje maar ik moet gewoon weer ff snappen hoe ik 2 outputs uit een functie krijg
of meerdere

:)

mag ook iets anders zijn als ik het maar op verschillende plekken kan gebruiken
Meerdere mogelijkheden:
<?php

function een_return_en_de_rest_in_vars($in1,$in2,$in3,&$uit1,&$uit2,&$uit3){
  //voorbeeldje:
  $uit1 = $in1 + $in2;
  $uit2 = $in1 * $in2;
  $uit3 = $in2 / $in3;
  return $in2 / $in1; //uit0
}

$x0 = een_return_en_de_rest_in_vars(1,2,3,$x1,$x2,$x3);
//outputs zitten nu in $x0 t/m $x3

function alle_output_in_een_array($in1,$in2,$in3){
  $uit0 = $in2 / $in1;
  $uit1 = $in1 + $in2;
  $uit2 = $in1 * $in2;
  $uit3 = $in2 / $in3;
  return [$uit0,$uit1,$uit2,$uit3];
}

list($x0,$x1,$x2,$x3) = alle_output_in_een_array(1,2,3);
//zelfde verdeling als hierboven

function alle_output_in_een_assoc_array($in1,$in2,$in3){
  $uit0 = $in2 / $in1;
  $uit1 = $in1 + $in2;
  $uit2 = $in1 * $in2;
  $uit3 = $in2 / $in3;
  return ['uit0' => $uit0,'uit1' => $uit1,'ui2' => $uit2,'uit3' => $uit3];
  //of als vars en key name toch altijd gelijk zijn: 
  return compact('uit0','uit1','uit2','uit3');
}

$result = alle_output_in_een_assoc_array(1,2,3);
$x0 = $result['uit0'];
//enz

//of als je de vars ook als uit0, uit1, enz wilt gebruiken
extract($result);
//$uit0 t/m 3 zijn nu bruikbaar in deze scope, bijvoorbeeld:
print($uit2);

?>
De vraag is of je dit echt in een functie wilt vangen, en ook of je in de desbetreffende functies zelf allerlei SELECT * FROM whatever queries zou moeten uitvoeren.

Als het complete rapportages omvat zijn deze een aparte pagina (/rapportages/omzet-drank) of op zijn minst een soort van aparte actie (/rapportages.php?show=omzet_drank) waardig.

Zo niet, dan zou je nog steeds kunnen nadenken om de waarden die je nu uit de database trekt eenmalig in te laden, en vervolgens als parameter aan de functie te voeren zodat de functie gewoon zijn werk kan doen zonder tussenkomst van een database.

Ook gaat het in bovenstaande functie specifiek over drank, maar wat je in wezen doet zijn prijzen inclusief hoge/lage BTW berekenen. Je zou dus ook echt een generieke functie kunnen maken door de functie een lijst van waarden te voeren, waarbij je aangeeft of op deze items een hoog of laag tarief van toepassing is, en wat deze tarieven dan precies zijn. Op die manier heb je een echt herbruikbare functie die niet intern een beslissing neemt waarop de berekening van toepassing is (in dit geval enkel drank).

Dit lijkt mij dus een uitgelezen moment om (goed) na te denken over de algehele structuur van je applicatie, en niet zozeer hoe je (enkel) je functies zou kunnen refactoren.
Ik zie toch wat eigenaardigheden in het stukje code dat je laat zien.

Die absurd lange variabelenamen zijn al een indicatie dat je alles in de global scope plaatst en niet in functies of classen. Het is de enigste overgebleven remedie om
te voorkomen dat je per ongeluk variabelen dubbel gebruikt en daardoor per ongeluk waardes overschrijft.

Waarom staan de arraykeys 'aantal' en 'bedrag' niet tussen quotes? zijn dat constanten? Ik wil niet zeggen dat het gebruik van constanten als array keys perse fout is maar het is wel met een omweg. Je kunt in PHP namelijk prima met associatieve arrays werken door gewoon quotes te gebruiken in combinatie met mysqli_fetch_assoc().

Waarom een nul tussen quotes als je deze niet als tekst wil laten interpreteren maar er nog mee wilt rekenen?

En hier snap ik het nut niet van:
<?php
$btwsoort = '' . $omzetdranken['btwhoogte'] . '';
?>

Waarom niet gewoon <?php $btwsoort = $omzetdranken['btwhoogte'];?> of nog beter helemaal geen variabelen kopiëren (tenzij je een kopie wilt gaan bewerken en het origineel wil behouden)?

Twee queries in een while loop. dat MOET de boel zeker vertragen. Verdiep je eens in een JOIN.

Ik vraag me ook sterk af of de opzet van je database wel deugt.

Zoals Thomas al laat doorschemeren: BTW LAAG heeft NIETS te maken met drank. Splits dat van elkaar en maak gewoon één of twee functies die de btw voor je uitrekenen / optellen waarbij er geen onderscheid wordt gemaakt of dit nou voor drank, eten, orwhatever gebruikt wordt.

Als laatste om je vraag toch te beantwoorden: gebruik een array OF een object!


uhm zoizo bedankt voor die functie code ik zal ff kijken hoe dat allemaal werkt zodat ik het eventueel kan gebruiken

en ik zal ff een betere uitleg geven
ik heb dus zeg maar 1 pagina waar een soort loonstrook op gemaakt wordt per gebruiker per dag

deze pagina maakt een soort cache aan
wat echt extreem veel code is

(ik heb hier vaarschijnlijk ook veel fouten in zoals die onnodige quotes )

ik heb heel veel verschillende boekhoudpaginas en omdat functies dus niet goed werkte heb ik deze enorme code soort van geknipt en geplakt

want 1 pagina opent bv van 1 gebruiker alle gegevens
en een andere pagina opent van een hele maand
of zelf alles van een heel jaar

om deze reden de '0' codes

want doe ik dit niet dan krijg ik problemen met berekenen
dus elke berekening is dus eerst 0 en daarna + andere bedragen

ik ben een noob in nieuwe manier van php scripting enz

cola valt onder btw laag en dus moet dat er in

alles maar dan ook alles moet in dit script los gespecificeerd worden en die gegevens moeten worden meegenomen naar een eventuele andere pagina

het hele script heb ik werkent maar is 90% teveel code

ik wil doormiddel van functies alle gevevens kunnen verzamelen, en verzenden op 1 plek

zodat ik straks dus alleen maar
functies moet opvragen of 1 include waarmee ik de info kan krijgen die ik nodig heb

idee in mijn hooft is een beetje zoiets als

geef een functie 3 gegevens mee

soort, id, datum

en dat ik dan bv dit kan opvragen
$dranklaagtotaal
$dranklaagexbtw
$dranklaagbtw
$dranklaagprovisiebeheerder
$drankhoogtotaal
$drankhoogexbtw
$drankhoogbtw
$drankhoogprovisiebeheerder

enz

ik ben nu gewoon aan het brainstormen want ik wil de gegevens makkelijker kunnen opvragen en aanmaken





En waarom zou je dan geen array's gebruiken?
Drank is al een entiteit op zich, en of het laag/hoog of inclusief BTW/exclusief BTW is zijn eigenschappen.
Hm, misschien moet je even een stapje achteruit doen en eerst eens kijken naar wat je hebt en wat je op dit moment misschien mist en mogelijk als extra functionaliteit wilt hebben.

Teken dit gewoon eens op papier: maak een grove indeling van de pagina's en functionaliteit die je graag wilt hebben. Schrijf hier korte verhaaltjes bij van wat de pagina doet en waar je dit voor nodig hebt. Als je een van beide niet weet: vraag je af wat het nut is / waarom je het nodig hebt. En als je zo'n pagina eigenlijk zelden tot nooit gebruikt zou je die in eerste instantie gewoon kunnen schrappen. Beperk je tot een minimale basis die een werkbare situatie oplevert.

Dit kun je allemaal doen nog zonder een letter code te typen of technische oplossingen voor dit alles te verzinnen - dit is puur visueel / functioneel.

Wat je nu hebt is een functionele specificatie: een boodschappenlijstje van dingen die je (minimaal) nodig hebt. Dit is een voorschrift/blauwdruk van wat je allemaal dient te bouwen en is tevens een leidraad tijdens de bouw zodat je niet (te ver :p) van dit plan afwijkt.

Ga dan eens wat experimentjes doen met code en bouw kleine testjes om te zien of dit fijn en makkelijk werkt. Trek zaken uit elkaar, geef functies (of methoden) duidelijke, eenduidige doelen. Laat ze maximaal één ding doen, niet twee of meer. In een functie/methode waar je iets berekent ben je niet met databases bezig, of met enkel dranken, of met de formattering en/of afronding van bedragen, dit zou allemaal op aparte plekken ingeregeld moeten worden of zijn.

Op deze manier creëer je door het hele traject -en ook in je code- overzicht, iets wat je op dit moment waarschijnlijk goed kunt gebruiken.

Verdeel en heers.
hoe bedoel je dat precies ?
zoals ik al zei ik ben een noob
bet dat soort dingen, ik heb veel dingen gemaakt maar echt allemaal met basic kinder stuff
dus geen functies geen foreach
geen array behalve dan die van sql

als ik al functies gebruik dan zijn het meestal al bestaande functies of aangepaste

ik ben nu langzaam pagina voor pagina aan het aanpassen
en ik kwam erachter dat ik bv 1 code wel 20 keer heb gebruikt maar allemaal met andere input variablen
om deze reden dacht ik aan en functie

alles dus verplaatsen naar 1 plaats

[size=xsmall]Toevoeging op 14/03/2020 23:52:12:[/size]

als ik
geef functies (of methoden) duidelijke, eenduidige doelen. Laat ze maximaal één ding doen, niet twee of meer.
dat zo gaan doen dan heb ik 1000+ van die codes nodig

ik kan vanwege wet en belasting enzo niet zomaar dingen achterwegen laten, alles moet berekenbaar zijn en ophaalbaar

ik gaf een klein stukje van code
de hele werkende code is 100X groter en heeft heel veel boekhoud berekeningen
het antwoord van deze berekening word bewaard in een cache

alles werkt goed echter is het allemaal heel onoverzichtelijk en om deze reden ben ik aan het zoeken en testen naar verschillende mogelijkheden

want op elke pagina waar ik de gegevens nodig heb moet eerst worden gechecked of de cache er is van elke dag en gebruiker van de periode die ik moet hebben, en indien niet aanwezig dat eerst gemaakt gemaakt worden

als de cache bv wordt geleegd kan het dus zijn dat er in 1 keer van een heel jaar per gebruiker, per dag gegevens moeten worden opgeslagen in cache

alle gegevens staan in database de volle verkoop prijzen, en per gebruiker, per dag staan daar ook alle btw gegevens en heffingen enz enz
Ik vraag me af of je Thomas reactie gelezen hebt? Want je vraagt 'hoe bedoel je dat precies ?' terwijl hij een hele duidelijke post hier plaatst met uitleg. En daarbij benadruk ik even dat dit niks met 'noob zijn' te maken lijkt te hebben. Want hij heeft het niet eens over het programmeren zelf, en enkel de structuur ervan.

Maar goed, ik denk dat een hele applicatie voor jouw blijkbaar nog te zwaar is. Dus verdeel je werk in kleine stapjes, en je komt er wel. En lees je eens in wat functies in PHP doen, en hoe je die kan benutten. Ze zijn namelijk erg krachtig, en voorkomen dat je nat gaat via de DRY-methode (Don't Repeat Yourself).
ik heb gelezen en normaal zou ik dit ook doen,
stapje voor stapje
echter is het script dat ik nu heb all werkend en een noodzakelijk iets
er zijn al tig bedrijven die hiermee werken als soort online software en het werkt ook goed
echter....
zit er op dit moment dus heeeeeel veeeel DRY-methodes in
en ik moet op korte termijn extra paginas maken

om deze reden zoek ik dus een betere manier en ik dacht misschien aan functies

(als ik het geld zou hebben zou ik iemand inhuren om deze mess op te knappen
maar het gene dat ik wil is moeilijk goed uit te leggen en blijkbaar moeilijk te maken)

op dit moment op ik per gebruiker per dag ongeveer 100 variablen per cache file
dus kan je bedenken hoeveel code hier achter hangt

en zoals je zei ik kom er wel.
ik hoop met de info die ik hier verzamel iets sneller

in loop der jaren heb ik via deze site heel veel geleerd en gemaakt
dus het komt vast goed :)


Reageren