[PHP / SQL] Reserveringsscript

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een project van school waar ik een vakantiehuisjes systeem moet schrijven nou heb ik alles al draaien maar ik blijf steeds vast lopen bij het reservatie script.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
session_start();
include("mysqlconnect2.php");

if (!empty($_POST)){

$dtAdag = mysql_real_escape_string($_POST["adag"]);
$dtAmaand = mysql_real_escape_string($_POST["amaand"]);
$dtAjaar = mysql_real_escape_string($_POST["ajaar"]);
$dtVdag = mysql_real_escape_string($_POST["vdag"]);
$dtVmaand = mysql_real_escape_string($_POST["vmaand"]);
$dtVjaar = mysql_real_escape_string($_POST["vjaar"]);
$Shuis = mysql_real_escape_string($_POST["huis"]);

$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND adag >='". $dtAdag ."' AND amaand >='". $dtAmaand ."' AND ajaar >='". $dtAjaar ."' AND vdag <='". $dtVdag ."' AND vmaand <='". $dtVmaand ."' AND vjaar <='". $dtVjaar ."'";

$rCheckResult = mysql_query($sQuery) or die ("FOUT: " . mysql_error().$sQuery);

while ($row = mysql_fetch_array($rCheckResult)){
$aCheckData[] = $row;
}
  
        if( count($aCheckData) == 0 ) {
        $sql_reserveren = "INSERT INTO reserveren(klantnummer, klantnaam, huis, adag, amaand, ajaar, vdag, vmaand, vjaar) VALUES (
        '".$_POST["klantnummer"]."',
        '".$_POST["klantnaam"] ."', 
        '".$_POST["huis"] ."',
        '".$_POST["adag"] ."', 
        '".$_POST["amaand"] ."',
        '".$_POST["ajaar"] ."', 
        '".$_POST["vdag"] ."', 
        '".$_POST["vmaand"] ."',
        '".$_POST["vjaar"] ."') " ;

        $verzenden = mysql_query ($sql_reserveren) or die(mysql_error());
        
        $klantnummer = $_POST["klantnummer"];
        $klantnaam = $_POST["klantnaam"];
        $huis = $_POST["huis"];
        $adag = $_POST["adag"];
        $amaand = $_POST["amaand"];
        $ajaar = $_POST["ajaar"];
        $vdag = $_POST["vdag"];
        $vmaand = $_POST["vmaand"];
        $vjaar = $_POST["vjaar"];
        
        $_SESSION["klantnummer"];
        $_SESSION["klantnaam"];
        $_SESSION["huis"];
        $_SESSION["adag"];
        $_SESSION["amaand"];
        $_SESSION["ajaar"];
        $_SESSION["vdag"];
        $_SESSION["vmaand"];
        $_SESSION["vjaar"];
    header('Location: sreserveren.php');
    } else {
    header('Location: freserveren.php');
    }
}
?>

Dit is het gedeelte die de datums bij mij controleert en weg schrijft en dergelijke,

nu blijf ik steeds een probleem houden zoals je kunt zien controleert hij bij de sQuery als de datum al bezet is of niet of als die binnen de datum valt die al geboekt is.

Dit is met PHP Operators gedaan namelijk met de = en > - < maar deze controleert alleen op gelijk aan en kleiner of groter dan, nou is het namelijk zo dat je wel een datum als de operator als volgt staat => dan mag je niet gelijk aan of groter dan de start datum zitten, maar als ik dan een dag eerder ga zitten schrijft hij hem wel weg.

Bijvoorbeeld
1ste datum
22-04-2010 - 29-05-2010

2de datum
21-04-2010 - 29-05-2010 (Schrijft hij weg terwijl het niet mag, valt namelijk tussen de datum van de 1ste.)

3de datum
23-04-2010 - 29-05-2010 (Schrijf hij niet weg, omdat de eerste datum daar tussen valt.)

Ik zat zelf te denken om mischien nog een while lus ofzo er in te stoppen om en extra controle te doen van de datums'

Hopelijk kunnen jullie mij in de goeie richting sturen,

Groeten
Patrick

Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

Mysql BETWEEN?

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

Verwijderd

1) SQL injectie (query("blabla".$_POST['bla'])) regel 25 t/m 35
2) Je weet niet goed welk criterium je aan je vergelijking wilt meegeven, nu controleer je of range 2 geheel binnen range 1 valt, terwijl je bedoeling is om te zien of er overlap is. Controleer dus of de begin OF einddatum van range 2 binnen range 1 valt i.p.v. te controleren of begin EN eind datum binnen range 1 vallen.
3) Dit gaat helemaal fout als het over een maandgrens valt, gebruik de interne datum typen van je sql engine i.p.v. zelf data te bouwen van drie integers: WHERE (Sdate2 >= Sdate1 AND Sdate2 <= Edate1) OR (Edate2 >= State1 AND Edate2 <= Edate1)
Zoals bovenstaand WHERE (Sdate2 BETWEEN Sdate1 AND Edate2) OR (Edate2 BETWEEN Sdate1 AND Edate1), let wel op de werking van BETWEEN (wordt geen, een of twee van de parameters ervan meegenomen in de range)
4) Ohja, en het is reserveringsscript, een reservatiescript verplaatst leeuwen enzo ;)
E=end, S=start 1=in DB, 2=POST vlaues

[ Voor 22% gewijzigd door Verwijderd op 13-04-2010 11:04 ]


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Kijk eens naar http://dev.mysql.com/doc/...ors.html#operator_between

Noes, telaaf :P

[ Voor 9% gewijzigd door Noxious op 13-04-2010 10:50 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Verwijderd schreef op dinsdag 13 april 2010 @ 10:50:
1) SQL injectie (query("blabla".$_POST['bla'])) regel 25 t/m 35
Om hier even dieper op in te gaan: mensen kunnen zonder problemen je SQL queries zo aanpassen dat bijvoorbeeld je table gedropt wordt. Omdat dit iets is dat in 'productie' gaat is het aan te raden te voorkomen dat mensen via SQL injection rotzooi kunnen schoppen.

Oplossing: overstappen op prepared statements:
http://nl3.php.net/manual/en/ref.pdo-mysql.php

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de snelle reacties, dit is een school projct en dit gaat niet live draaien ofzo dit blijft gewoon lokaal dus beveiliging is van latere zorg ik moet er nu eerst voor zorgen dat hij gewoon draait zoals hij hoort te draaien,

ik heb juist zelf de data gebouwt omdat hij anders de amerikaanse datum formaat neemt en dat wil ik niet omdat je dan bij invoer ook in dat formaat moet doen.

Ik wordt neit echt veel wijzer van jouwn bericht RoadRunner 84 ik ben niet een topper in php dit wat er nu staat heb ik met hulp van mijn php school boek en internet gedaan.

groeten patrick

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Je moet het formatten van data scheiden van de opslag. Gebruik ajb gewoon een date column voor die datum dan kun je enorm simpel ranges gebruiken. Het formatten van een date kun je daarna prima zo doen dat het op de nederlandse manier weergegeven wordt. Gebruik maken van eigen year, month en day kolommen is echt geen goed idee.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • r0b
  • Registratie: December 2002
  • Laatst online: 11-09 16:27

r0b

Verwijderd schreef op dinsdag 13 april 2010 @ 11:14:
Bedankt voor de snelle reacties, dit is een school projct en dit gaat niet live draaien ofzo dit blijft gewoon lokaal dus beveiliging is van latere zorg ik moet er nu eerst voor zorgen dat hij gewoon draait zoals hij hoort te draaien,
Het is dan ook geen beveiliging, het is hoe je PHP hoort te schrijven.
Beveiliging is een firewall, een login systeem, IP-based access, etc. Het voorkomen van lekken in je script is geen beveiliging.
ik heb juist zelf de data gebouwt omdat hij anders de amerikaanse datum formaat neemt en dat wil ik niet omdat je dan bij invoer ook in dat formaat moet doen.
Data laag != presentatie laag. Dat het in Unix-timestamp / YYYY-MM-DD in je DB staat betekent niet dat je dit zo hoeft te presenteren. Daar heb je gewoon mktime() voor.
Nu maak je het jezelf alleen maar moeilijker omdat je DB veld geen datetime veld is, en je er dus niet de speciale technieken op toe kunt passen (zie de post boven mij voor meer info).
Ik wordt neit echt veel wijzer van jouwn bericht RoadRunner 84 ik ben niet een topper in php dit wat er nu staat heb ik met hulp van mijn php school boek en internet gedaan.

groeten patrick
Ik ook niet, maar RoadRunner84's bericht is toch echt vrij makkelijk te volgen. Ga er maar even voor zitten, pak je boek erbij en probeer stap voor stap te volgen wat hij zegt. :)

[ Voor 8% gewijzigd door r0b op 13-04-2010 11:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Jouw query controleert of de reservering valt binnen een bestaand bereik in je database. Dat is niet wat je van plan was, je moet controleren of een van de data binnen het bereik ligt, anders krijg je een resutaat zoals je beschrijft (als probleem).
Misschien is een voorbeeld handiger:
1ste datum
22-04-2010 - 29-05-2010

2de datum
21-04-2010 - 29-05-2010 (Schrijft hij weg terwijl het niet mag, valt namelijk tussen de datum van de 1ste.)

3de datum
23-04-2010 - 29-05-2010 (Schrijf hij niet weg, omdat de eerste datum daar tussen valt.)

Dit is precies wat het moet doen (volgens de code, niet volgens jou). Immers, 21-4 valt niet tussen 22-4 en 29-5, dus is er geen conflict :)
Dat was dus niet je bedoeling.
Om wel het gewenste resultaat te krijgen moet je controleren of een van de nieuwe data (de begin of de eind datum) binnen het bestaande bereik valt. In dat geval wordt namelijk door SQL bepaalt dat 29-5 binnen het bereik 22-4 t/m 29-5 valt. Dus is er overlap.
Je query is momenteel:
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND adag >='". $dtAdag ."' AND amaand >='". $dtAmaand ."' AND ajaar >='". $dtAjaar ."' AND vdag <='". $dtVdag ."' AND vmaand <='". $dtVmaand ."' AND vjaar <='". $dtVjaar ."'";
Dat moet dus:[quote]
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND ((adag >='". $dtAdag ."' AND amaand >='". $dtAmaand ."' AND ajaar >='". $dtAjaar ."') OR (vdag <='". $dtVdag ."' AND vmaand <='". $dtVmaand ."' AND vjaar <='". $dtVjaar ."'))";[/quote]
zijn.
Of nog beter, zoals eerder genoemd, gebruik datum typen van je DB engine i.p.v. getallen die toevallig dagen in de maand, maanden in het jaar en het jaar weergeven.[quote]
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND (adatum >='". $dtAdatum ."' OR vdatum <='". $dtVdatum ."')";[/quote]
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND ". $dtAdatum ." NOT BETWEEN adatum AND vdatum AND ". $dtVdatum ." NOT BETWEEN adatum AND vdatum";
Oke, ik had je query verkeerd gelezen, er klopt geen hout van. Volgens jouw query zal 33-5 t/m 39-3 niet worden toegevoegd omdat 33-5 >= 22-4 en 39-3 <= 29-5 :X

[ Voor 18% gewijzigd door Verwijderd op 13-04-2010 11:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke roadrunner laten we zeggen ik ga gebruik maken van deze query

code:
1
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND (". $dtAdatum ." BETWEEN adatum AND vdatum OR ". $dtVdatum ." BETWEEN adatum AND vdatum)";


dan verander ik wat er moet verandert worden, maar dan blijf ik altijd weer het probleem houden bij de invoer van mijn script dan moet je de datum in 2009-09-01 weg schrijven want als ik het zo doe 01-03-2009 dan schrijft hij in de database weg van 0000-00-00 omdat hij het formaat niet kent.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 13 april 2010 @ 11:41:
Oke roadrunner laten we zeggen ik ga gebruik maken van deze query

code:
1
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND (". $dtAdatum ." BETWEEN adatum AND vdatum OR ". $dtVdatum ." BETWEEN adatum AND vdatum)";


dan verander ik wat er moet verandert worden, maar dan blijf ik altijd weer het probleem houden bij de invoer van mijn script dan moet je de datum in 2009-09-01 weg schrijven want als ik het zo doe 01-03-2009 dan schrijft hij in de database weg van 0000-00-00 omdat hij het formaat niet kent.
Nee, want je haalt de begrippen string en datum door elkaar. Je schrijft namelijk met 01-02-2010 hetzelfde weg als met 2010-02-01, namelijk de datum 1 februari 2010. Als je dat door de war haalt met de string "2010-02-01" (twee, nul, een, nul, streepje, nul, twee, streepje, nul, een) dan gaat het de mist in. Er zijn zowel in SQL als in PHP legio functies om je datum te controleren en te formatteren, gebruik deze. Jouw "oplossing" is namelijk een work-around. Je denkt het jezelf makkelijker te maken door de datum niet te formatteren, maar in plaats daarvan alle specifiece datum tools overboord te gooien en ze zelf na te maken.
Aangezien je toch al drie losse getallen had (adag amaand ajaar) maakt de manier van opslaan geen moer uit, gebruik gewoon datum functies zoals mktime(), date() DATE_FORMAT() enzovoorts.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

epoch is tha man!

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

Wat hij zei (epoch is het tijdstip nul)
In computers is epoch meestal 0:00 1-1-1970 GMT/UTC, er worden ofwel seconden geteld vanaf dit tijdstip ofwel dagen en tijden op die dag (het verschil zit hem in de zogenaamde schrikkelsenconden, afhankelijk van welke timestamp je gebruikt worden dagen altijd even lang beschouwd (60*60*24 seconden) of worden de schrikkelseconden meegeteld als seconden vanaf epoch)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 13 april 2010 @ 11:41:
Oke roadrunner laten we zeggen ik ga gebruik maken van deze query

code:
1
$sQuery = "SELECT * FROM reserveren WHERE huis = '". $Shuis ."' AND (". $dtAdatum ." BETWEEN adatum AND vdatum OR ". $dtVdatum ." BETWEEN adatum AND vdatum)";


dan verander ik wat er moet verandert worden, maar dan blijf ik altijd weer het probleem houden bij de invoer van mijn script dan moet je de datum in 2009-09-01 weg schrijven want als ik het zo doe 01-03-2009 dan schrijft hij in de database weg van 0000-00-00 omdat hij het formaat niet kent.
Quotes...

2009-09-01 is een rekensommetje met als resultaat 1999, en dat kun je niet in een datumveld opslaan, nogal wiedes. '2009-09-01' is een string die MySQL prima als datum kan interpreteren en werkt wel.

Over SQL-injectie: daar moet je je juist nu mee bezig houden. Als je dit soort dingen achteraf doet ga je ze altijd vergeten, en je toekomstige klanten gaan niet blij zijn als iemand bij de eerste poging om te hacken meteen al hun database leeg kan gooien. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • r0b
  • Registratie: December 2002
  • Laatst online: 11-09 16:27

r0b

Verwijderd schreef op dinsdag 13 april 2010 @ 11:41:
maar dan blijf ik altijd weer het probleem houden bij de invoer van mijn script dan moet je de datum in 2009-09-01 weg schrijven want als ik het zo doe 01-03-2009 dan schrijft hij in de database weg van 0000-00-00 omdat hij het formaat niet kent.
En? Het probleem is?

Presentatie != wat je wegschrijft in de database.

Het is geen enkel probleem voor PHP om in een datetime veld weg te schrijven. Dat is je data. Dat jij vervolgens op de achtergrond dit verandert en 01-09-2009 of zelfs 01/09/2009 aan de gebruiker laat zien, dát is je presentatie.
Wat jij in de database zet hoeft natuurlijk niet 1-op-1 aan de gebruiker getoond te worden.

Bonus link: http://www.w3schools.com/php/php_ref_date.asp

[ Voor 6% gewijzigd door r0b op 13-04-2010 12:20 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Macintosh dat snap ik wel, ik snap ook best dat je met date_format de datum om kan zetten maar dat is alleen voor het uitlezen van de datum.

niet voor de invoer en daar gaat het juist om, om de invoer als ik op mijn formulier invul van 00-00-0000 dan herkent de database hem niet dus moet er een php code bij ingezet worden die deze datum converteert naar een datum die de database wel kent, en dat is dus het stukje wat ik niet weet en snap,

want ik heb al internet gezocht naar dat probleem maar wat daar staat wordt ik ook niet wijzer van

Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
@PatrickStel,

Niemand heeft ooit gezegd dat je niet de invoer mag aanpassen. Kortom, je kan de nederlandse datum laten invullen en die zelf omzetten naar de amerikaanse. De trucjes daarvoor zijn al gegeven.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je zal sowieso aan je gebruikers moeten vertellen welk formaat je verwacht.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
oke maar hoe moet ik dat dan aanpakken?
op deze manier?

$aankomst_datum = mktime(0,0,0,date("d"),date("m"),date("Y"));

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 13 april 2010 @ 12:47:
Macintosh dat snap ik wel, ik snap ook best dat je met date_format de datum om kan zetten maar dat is alleen voor het uitlezen van de datum.

niet voor de invoer en daar gaat het juist om, om de invoer als ik op mijn formulier invul van 00-00-0000 dan herkent de database hem niet dus moet er een php code bij ingezet worden die deze datum converteert naar een datum die de database wel kent, en dat is dus het stukje wat ik niet weet en snap,

want ik heb al internet gezocht naar dat probleem maar wat daar staat wordt ik ook niet wijzer van
Ach kom, je vraagt bijna een open deur in te trappen. Je hebt het al voor elkaar om de velden in losse variabelen te stoppen (adag, amaand, ajaar), je hoeft ze alleen nog op de goede manier aan elkaar te plakken, daarvoor, en voor datum functies verwijs ik naar www.php.net, waar je op die site moet zijn moet je zelf uitvogelen.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Nah...... als je je ergens aan ergert dan plaats je een TR, wil je iets toevoegen dan is dat ook goed, maar niet op deze manier.....

[ Voor 72% gewijzigd door Creepy op 16-04-2010 15:13 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op dinsdag 13 april 2010 @ 12:57:
oke maar hoe moet ik dat dan aanpakken?
op deze manier?

$aankomst_datum = mktime(0,0,0,date("d"),date("m"),date("Y"));
Heb je het al geprobeerd? We gaan je niet aan je handje vasthouden tijdens het leren programmeren natuurlijk. Volgens mij zijn er echt al veel voorbeelden en tips gegeven over hoe je kunt bereiken wat je wilt.

Vergeet ook echt niet al je input te checken, je zal niet de eerste zijn van wie de database ineens leeg is. Dat het een lokaal script is, is geen reden het niet te doen want je zult gewoon direct al verkeerd beginnen met het leren van programmeren en het is moeilijk om daar dan nog vanaf te komen.

@Guillome: zo'n post is natuurlijk nergens voor nodig :{

[ Voor 3% gewijzigd door Cartman! op 13-04-2010 13:17 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Cartman! schreef op dinsdag 13 april 2010 @ 13:17:
@Guillome: zo'n post is natuurlijk nergens voor nodig :{
Nodig niet, maar vat ook mijn gevoel samen. Je kunt als developer niet verachten dat anderen je met dit soort basic dingen de handen vast blijven houden.

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja voor jullie is dit allemaal basic maar voor mij niet dus ga mij niet afrekenen op dit soort (voor jullie domme) dingen

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Tuurlijk wel. Als jij meteen in het diepe wilt springen en niets snapt, en met zulke simpele fouten of 'logica' komt, dan kan je verwachten dat mensen na een replie of 20 er een keer genoeg van hebben.
Leer eerst de basis als je dit allemaal niet snapt zeg, hier schiet niemand wat mee op zo.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Verwijderd

We rekenen je ook niet af op wat je niet weet, maar het is policy op GoT om eerst zelf dingen uit te zoeken voor je een vraag stelt. Wat eerder gezelgd is, je hebt al heel wat handreikingen gekregen. Het is nu aan jou om jezelf een beetje in te lezen (mysql.com, php.net, PHP voor dummies) voordat je vragen gaat stellen die op een haar na een copy-paste zijn uit een handleiding. Ben ook niet bang om het een en ander te experimenteren en daar conclusies of vragen uit te halen.
Je hoeft niet alles te weten, maar je wordt wel geacht zelf te onderzoeken. We zijn geen helpdesk.

Acties:
  • 0 Henk 'm!

  • nota
  • Registratie: Augustus 2001
  • Laatst online: 12-08 08:52
Ik wil graag even inhaken op het werkelijke probleem dat de poster heeft (los van het feit dat hij de date als losse integers opslaat):

Bij controle op overlappende periodes pas ik zelf altijd de volgende regels toe:
(waarbij "start_x" en "end_x" start en einde van periode x voorstellen, uitgaande van het gegeven dat einde_1 en start_2 op dezelfde dag mogen vallen zonder dat er sprake is van overlap en dat de BETWEEN functie van de betreffende database dus ook beide variabelen "exclude")

periodes overlappen als:

(start_2 BETWEEN start_1 AND end_1)
OR (end_2 BETWEEN start_1 AND end_1)
OR (start_2 = start_1 AND end_2 <> start_2)
OR (end_2 = end_1 AND start_2 <> end_2)
OR (start_2 = start_1 AND end_2 = end_1)

Dit werkt wel maar is nogal complex, iemand enig idee of dit gemakkelijker kan met een SQL query? Dus is er een functie om overlapping te signaleren?

If you think sex is a pain in the ass, try different position


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

nota schreef op donderdag 15 april 2010 @ 00:02:
Ik wil graag even inhaken op het werkelijke probleem dat de poster heeft (los van het feit dat hij de date als losse integers opslaat):

Bij controle op overlappende periodes pas ik zelf altijd de volgende regels toe:
(waarbij "start_x" en "end_x" start en einde van periode x voorstellen, uitgaande van het gegeven dat einde_1 en start_2 op dezelfde dag mogen vallen zonder dat er sprake is van overlap en dat de BETWEEN functie van de betreffende database dus ook beide variabelen "exclude")

periodes overlappen als:

(start_2 BETWEEN start_1 AND end_1)
OR (end_2 BETWEEN start_1 AND end_1)
OR (start_2 = start_1 AND end_2 <> start_2)
OR (end_2 = end_1 AND start_2 <> end_2)
OR (start_2 = start_1 AND end_2 = end_1)

Dit werkt wel maar is nogal complex, iemand enig idee of dit gemakkelijker kan met een SQL query? Dus is er een functie om overlapping te signaleren?
Periodes overlappen als:

(start_2 >= start_1) && (start_2 <= eind_1)

Oftewel, als de start van periode 2 in periode 1 valt is er sowieso overlap. Of wil je ook dat periode 2 niet helemaal in periode 1 kan vallen?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Er is een gehele of gedeeltelijke overlap als eind_2 na start_1 EN begin_2 voor eind_1.

{signature}


Acties:
  • 0 Henk 'm!

  • nota
  • Registratie: Augustus 2001
  • Laatst online: 12-08 08:52
HMS schreef op donderdag 15 april 2010 @ 10:08:
[...]


Periodes overlappen als:

(start_2 >= start_1) && (start_2 <= eind_1)

Oftewel, als de start van periode 2 in periode 1 valt is er sowieso overlap. Of wil je ook dat periode 2 niet helemaal in periode 1 kan vallen?
Je mist dan de situaties waarbij er maar een gedeelte overlap is. Dus dit voldoet niet.

If you think sex is a pain in the ass, try different position


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

nota schreef op donderdag 15 april 2010 @ 23:32:
[...]


Je mist dan de situaties waarbij er maar een gedeelte overlap is. Dus dit voldoet niet.
Hmm, ja klopt :P. Was wat te snel waarschijnlijk.

code:
1
2
3
(start_2 >= start_1) && (start_2 <= eind_1)
|| (eind_2 >= start_1) && (eind_2 <= eind_1)
|| (start_2 <= start_1) && (eind_2 >= eind_1)


Dit zou dan moeten werken voor situaties waarin:
  • Periode 2 start binnen periode 1
  • Het einde van periode 2 binnen periode 1 valt
  • Periode 1 geheel in periode 2 valt.
Veel makkelijker wordt het er niet echt op :+

Acties:
  • 0 Henk 'm!

  • joppybt
  • Registratie: December 2002
  • Laatst online: 09:33
HMS schreef op vrijdag 16 april 2010 @ 10:36:
[...]
Veel makkelijker wordt het er niet echt op :+
Jawel hoor, wat Voutloos al zegt:
code:
1
eind_2 >= start_1 && start_2 <= eind_1

Bewijs: eerst gaan we bepalen wanneer twee periodes S1-E1 en S2-E2 niet overlappen.
Geen overlap als S1-E1 geheel voor of geheel na S2-E2 valt.
Geen overlap als E2<S1 (dan geheel na) of als S2>E1 (dan geheel voor)
Dus geen overlap als (E2<S1 || S2>E1)
Dus wel overlap als !(E2<S1 || S2>E1)
Waarbij dat laatste geschreven kan worden als !(E2<S1) && !(S2>E1)
Ofwel overlap als: E2>=S1 && S2<=E1

[ Voor 46% gewijzigd door joppybt op 16-04-2010 12:11 ]

Pagina: 1