Hallo mede phphulper,

Nu ben ik al een tijdje het volgende aan het proberen met een script:



$kasquery = "and `date` like <= '".$_POST['jaar']."".$maand3."%'";
$query = "SELECT type, SUM(bedrag) FROM factuur_betalingen WHERE `afbij` = 'BIJ' AND (`type` = 'OVERSCHRIJVING' OR `type` = 'IDEAL' OR `type` = 'PIN') ".$kasquery." GROUP BY type"; 
$result = mysqli_query($link,$query) or die(mysqli_error());



Nu wil ik dus dat hij zoekt onder bijvoorbeeld 202203% of gelijk aan 202203%
Zoals ik hem nu ingevoerd heb werkt het niet, als ik het zo doe:

$kasquery = "and `date` <= '".$_POST['jaar']."".$maand3."%'";
$query = "SELECT type, SUM(bedrag) FROM factuur_betalingen WHERE `afbij` = 'BIJ' AND (`type` = 'OVERSCHRIJVING' OR `type` = 'IDEAL' OR `type` = 'PIN') ".$kasquery." GROUP BY type"; 
$result = mysqli_query($link,$query) or die(mysqli_error());


Neemt hij het niet tot de laatste mogelijkheid mee.

Heeft iemand een idee hoe ik dit werkend zal krijgen?

Alvast bedankt!
Echo je hele query eens.

Enne... Je bent vatbaar voor (onbedoelde) SQL-injection wat ook voor hacking kan worden misbruikt.
- Ariën - op 04/03/2022 21:07:52

Echo je hele query eens.

Enne... Je bent vatbaar voor (onbedoelde) SQL-injection wat ook voor hacking kan worden misbruikt.


De query zit in een afgesloten gedeelte waar alleen ik bij kan, daarnaast is er vanuit de hostingprovider nog een en ander gedaan om injecties te voorkomen.

het lijkt hij laat bepaalde waarden weg waardoor de totaalstand niet klopt.
Je kan de sting van vandaag bijvoorbeeld zo zien: 20220304150311 daarvan hij alles pakken tot en met 202203 zolang het maar lager is dan 202204.
Maar als ik dus <= 202203% doe neemt hij niet alles uit de 202203% reeks mee.

Het enige wat mijn query doet is de waarden optellen:

while($row = mysqli_fetch_array($result)){
$inkomend = $inkomend + $row['SUM(bedrag)'];
}


Aangezien de query niet "dood" gaat weet ik ook niet precies wat ik in de query fout heb staan.
Een injection kan ook onwetend gebeuren, dus ALTIJD escapen.

Laat je hele query eens zien zoals die uitgevoerd wordt?
- Ariën - op 04/03/2022 21:49:03

Een injection kan ook onwetend gebeuren, dus ALTIJD escapen.

Laat je hele query eens zien zoals die uitgevoerd wordt?



dit is zoals hij staat hij telt waardes bij $inkomend en $uitgaand op.
Aan het einde van de rit hou ik dus $inkomend - $uitgaand over.


$kasquery = "and `date` <= '".$_POST['jaar']."".$maand3."%'";
$query = "SELECT type, SUM(bedrag) FROM factuur_betalingen WHERE `afbij` = 'BIJ' AND (`type` = 'OVERSCHRIJVING' OR `type` = 'IDEAL' OR `type` = 'PIN') ".$kasquery." GROUP BY type"; 
$result = mysqli_query($link,$query) or die(mysqli_error());

	while($row = mysqli_fetch_array($result)){

		$inkomend = $inkomend + $row['SUM(bedrag)'];
	
	}

$query = "SELECT type, SUM(bedrag) FROM factuur_betalingen WHERE `afbij` = 'AF' AND (`type` = 'OVERSCHRIJVING') ".$kasquery.""; 
$result = mysqli_query($link,$query) or die(mysqli_error());

	while($row = mysqli_fetch_array($result)){

		$uitgaand = $uitgaand + $row['SUM(bedrag)'];

	}

print "Resultaat: ".number_format($inkomend - $uitgaand,2);


dit staat boven de query:

if($_POST['kwartaal'] == '1e kwartaal'){
$maand1 = "01";
$maand2 = "02";
$maand3 = "03";
}
elseif($_POST['kwartaal'] == '2e kwartaal'){
$maand1 = "04";
$maand2 = "05";
$maand3 = "06";
}
elseif($_POST['kwartaal'] == '3e kwartaal'){
$maand1 = "07";
$maand2 = "08";
$maand3 = "09";
}
elseif($_POST['kwartaal'] == '4e kwartaal'){
$maand1 = "10";
$maand2 = "11";
$maand3 = "12";
}


Op die basis wordt dus de maand bepaald, meer dan dat doet het script ook niet.
Het is dus vreemd dat hij in feite alleen dit ziet: "202003"

Ik zou op 2,055.28 moeten komen en ik kom op: 2,190.77

Het lijkt er op dat hij alles na 202203 niks meer mee neemt.

[size=xsmall]Toevoeging op 04/03/2022 22:18:24:[/size]

Trouwens, wat is de beste manier tegen injecties beschermen is dat toevallig: mysql_real_escape_string()?

[size=xsmall]Toevoeging op 04/03/2022 22:35:07:[/size]

Het zal hem trouwens uitgaand moeten zitten, als ik nareken is het uitgaande van de reeks 202203% niet mee genomen

[size=xsmall]Toevoeging op 04/03/2022 22:38:20:[/size]

Voor inkomend is er trouwens nog geen record van 202203% dus het zit toch in beide het probleem.
Je script deugt van geen kant als ik het mag zeggen.

- direct $_POST variabelen in je SQL is echt vragen om problemen.
- de maanden kun je met een eenvoudig sommetje berekenen als je het kwartaal weet.
<?php
function maandenVanKwartaal($kwartaal)
{
$eersteMaandVanHetKwartaal = $kwartaal * 3 - 2;
return [$eersteMaandVanHetKwartaal++, $eersteMaandVanHetKwartaal++, $eersteMaandVanHetKwartaal];
}
?>
- .$maand3."%'" Dit is om overeenkomsten in tekst te zoeken in combinatie met de LIKE operator.

Bij datums werk je gewoon met < (kleiner dan) of > (groter dan).

WHERE `date` >= '2022-04-01' AND `date` < '2022-07-01'

Of je gebruikt BETWEEN maar dat is als het ware "tot en met" dus dan moet je iets hebben als

WHERE `date` BETWEEN '2022-04-01' AND '2022-06-30'

wat dan weer omslachtig is omdat je moet gaan achterhalen wat de laatste dag van de maand is (30 of 31 ?)

Om die datum teksten te maken zou je bijvoorbeeld een datetime object kunnen gebruiken:
<?php
// maak een nieuw DateTime object met de datum op 1 april 2022
$start = new DateTime('2022-04-01');

// maak nog een DateTime object welke afgeleid is van $start met daar opgeteld een Periode van 3 Maanden (P3M)
$end = $start->add(new DateInterval('P3M'));

$where = " WHERE `date` >= '" . $start->format('Y-m-d') . "' AND `date` < '" . $end->format('Y-m-d') . "'";
?>
- date is een gereserveerd woord in MySql. Er wordt aangeraden een andere benaming te kiezen. Dan hoef je ook geen backticks te gebruiken.

Ik ga er van uit dat je `date` kolom van het type DATE is?
Frank Nietbelangrijk op 04/03/2022 23:10:31

Je script deugt van geen kant als ik het mag zeggen.

- direct $_POST variabelen in je SQL is echt vragen om problemen.
- de maanden kun je met een eenvoudig sommetje berekenen als je het kwartaal weet.
<?php
function maandenVanKwartaal($kwartaal)
{
$eersteMaandVanHetKwartaal = $kwartaal * 3 - 2;
return [$eersteMaandVanHetKwartaal++, $eersteMaandVanHetKwartaal++, $eersteMaandVanHetKwartaal];
}
?>
- .$maand3."%'" Dit is om overeenkomsten in tekst te zoeken in combinatie met de LIKE operator.

Bij datums werk je gewoon met < (kleiner dan) of > (groter dan).

WHERE `date` >= '2022-04-01' AND `date` < '2022-07-01'


Om die datum teksten te maken zou je bijvoorbeeld een datetime object kunnen gebruiken:
<?php
// maak een nieuw DateTime object met de datum op 1 april 2022
$start = new DateTime('2022-04-01');

// maak nog een DateTime object welke afgeleid is van $start met daar opgeteld een Periode van 3 Maanden (P3M)
$end = $start->add(new DateInterval('P3M'));

$where = " WHERE `date` >= '" . $start->format('Y-m-d') . "' AND `date` < '" . $end->format('Y-m-d') . "'";
?>
- date is een gereserveerd woord in MySql. Er wordt aangeraden een andere benaming te kiezen. Dan hoef je ook geen backticks te gebruiken.


Ongetwijfeld is mijn code niet de mooiste, dat "date" heb ik al jaren geleden toegepast en is met de hoeveelheid records eigenlijk ook niet meer aan te passen anders had ik dat allang gedaan.

Daarnaast die "wildcard" (%) zo noem ik 'm maar even is omdat die "date" string langer is dan alleen Ymd, die bestaat dus uit YmdHis zoals het nu is is het: 20220304231911.
Ik deed dat er dus inzetten om te zorgen dat hij het laatste stukje hoe dan ook mee pakt, of is daar een manier voor om die alsnog op een andere wijze te omzeilen?

Ik wilde namelijk de database zo klein mogelijk maken jaren geleden waardoor ik dus de datum en tijd in één veld samenvoegde en later weer splitste.
Waarom gebruik je dan niet gewoon het type DATETIME ?
Frank Nietbelangrijk op 04/03/2022 23:24:26

Waarom gebruik je dan niet gewoon het type DATETIME ?


Toen ik dat jaren geleden toepaste had ik geen flauw benul wat ik deed "want het werkte".
toen mijn hostingprovider besloot mysql_query uit te sluiten en mysqli_query te verplichten kwam ik er ook achter dat veel dingen anders hadden gemoeten.

Ik heb alles (de query's) mezelf moeten aanleren, is niet altijd vlekkeloos gegaan.
Ben gewoon bang als ik nu kolom `date` omzet van VARCHAR(99) naar DATETIME dat het niet goed gaat komen en ik informatie zal verliezen.

maar als ik het dus goed begrijp snapt mysql "door mijn gebrabbel" in de code niet wat ik bedoel en stopt hij met tellen aan het begin van de "laatste kwartaalmaand" hij krijgt tenslotte als ik het goed begrijp de opdracht alles beneden "202203" mee te pakken in plaats van wat ik bedoelde.
Moet ik de query dan niet vertellen dat alles beneden de eerste maand van het volgende kwartaal mee moet pakken of denk ik dan te simpel?
Je kunt het prima wijzigen alleen ga je natuurlijk eerst een kopie maken van je database op een test-server en daar maak je een migratie script welke je vervolgens uitvoerig gaat testen zodat wanneer je het op de productieserver draait het gewoon werkt zonder enig probleem. en natuurlijk zorg je ook dan altijd voor een backup.
In plaats van een volledige backup maken bij het wijzigen van een enkele kolom, kan je ook eerst een extra kolom maken in de tabel, die vullen met de omgezette waarden, en dan de oude kolom verwijderen.

Pseudocode:

ALTER TABLE x ADD COLUMN nieuw DATETIME NULL DEFAULT NULL;
UPDATE x SET nieuw = STR_TO_DATE(oud, 'YmdHis');
-- ALTER TABLE x DROP COLUMN oud; -- pas uitvoeren als de nieuwe kolom klopt

Zie ook:
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_str-to-date

Reageren