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?
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:
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?
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 ?
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.
?Onbekende gebruiker
05-03-2022 10:24
gewijzigd op 05-03-2022 10:25
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