[PHP] Probleem met BETWEEN statement.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Fr0zenFlame
  • Registratie: September 2003
  • Laatst online: 19-11-2024

Fr0zenFlame

LAN 'A Holic

Topicstarter
Goede middag,

In de onderstaande code lopen ik en een collega aan tegen het probleem m.b.t. het selecteren van "datum's" van een bepaald USER ID die moeten worden opgehaald mits ze tussen 2 datum's vallen.

Deze datum's worden gepost in een form en gedefinieerd als $datum_1 & $datum_2.
De format die ingevult wordt in deze forms is dd-mm-yyyy.
Het database veld type = "varchar" en geen "date",

Wanneer we de onderstaande code gebruiken krijgen we bij de onderstaande waardes dus een output van alleen de 1e 2 dagen van elke maand.

Input:
Begin datum: 01-01-2010
Eind datum: 01-03-2010

De output:
01-01-2010
02-01-2010
01-02-2010
02-02-2010
01-03-2010
02-03-2010


PHP:
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
62
63
64
<?php
$i = 0;
$datum_1         = $_POST['datum_1'];
$datum_2         = $_POST['datum_2'];

$sql    = "SELECT 
datum_rit,
STR_TO_DATE( datum_rit, '%d-%m-%Y' ) AS date_for_sort,
soort_rit,
begin_km,
eind_km,
(eind_km - begin_km) AS gereden_km,
beginadres,
Bpostcode,
Bplaats,
eindadres,
Epostcode,
Eplaats,
comment 
FROM data 
WHERE user= '$id' 
AND 
datum_rit BETWEEN '".$datum_1."' AND '".$datum_2."' 
ORDER BY date_for_sort DESC";
$res    = mysql_query($sql, $db);
echo "<table width='800'>";
echo "<tr id='content' class='content'>";
echo "<td>Datum Rit</td>";
echo "<td>Soort Rit</td>";
echo "<td>Begin KM</td>";
echo "<td>Eind KM</td>";
echo "<td>Gereden KM</td>";
echo "<td>Begin adres</td>";
echo "<td>Eind adres</td>";
echo "<td>Comment</td>";
echo "</tr>";
    while ($plak = mysql_fetch_object($res)) {
    if (fmod($i, 2) == 0) {
echo "<tr class='even'>";
echo "<td>$plak->datum_rit</td>";
echo "<td>$plak->soort_rit</td>";
echo "<td>$plak->begin_km</td>";
echo "<td>$plak->eind_km</td>";
echo "<td>$plak->gereden_km</td>";
echo "<td>$plak->beginadres $plak->Bpostcode $plak->Bplaats</td>";
echo "<td>$plak->eindadres $plak->Epostcode $plak->Eplaats</td>";
echo "<td>$plak->comment</td>";
echo "</tr>";
    } else {
echo "<tr class='odd'>";
echo "<td>$plak->datum_rit</td>";
echo "<td>$plak->soort_rit</td>";
echo "<td>$plak->begin_km</td>";
echo "<td>$plak->eind_km</td>";
echo "<td>$plak->gereden_km</td>";
echo "<td>$plak->beginadres $plak->Bpostcode $plak->Bplaats</td>";
echo "<td>$plak->eindadres $plak->Epostcode $plak->Eplaats</td>";
echo "<td>$plak->comment</td>";
echo "</tr>";
    }
    $i++;
  }
echo "</table>";
?>


Het lijkt er in mijn optiek op er op een of andere manier de data uit de input velden (forms) niet kan worden vergeleken met de waarde in de database velden.... of althans niet op een juiste manier.

Heeft iemand toevalig een oplossing of een duw in de goede richting? We hebben echt al een hoop websites doorgenomen en diverse dingen geprobeerd, echter lijkt het niet te willen lukken... :(
* Extra probleem is dat het in dit geval niet mogelijk is het database veld alsnog te converten naar het type "Date" omdat we dan de al ingevoerde gegevens kwijt raken.

i7-6700K | Z170A XPOWER GAMING TITANIUM EDITION | InWin904 | 32GB Corsair Dominator Platinum | nVidia GeForce RTX2080 TI | Iiyama G-Master UWQH 34" | 2x 1TB Samsung SSD 980PRO | 1x 4TB Samsung 860EVO | Arctis 7 | SteelSeries Apex Pro | Logitech G502 Hero


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Maak een extra kolom datum2, (die leeg is, breekt niets), doe een query die de varchar omzet naar date en wegschrijft naar datum2, verwijder de eerste datum kolom en rename datum2 naar datum_rit?

(Er zijn nog andere manieren om je data even op te slaan en dan je type te switchen, maar dit is wel het gemakkelijkst denk ik).

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:20

MueR

Admin Tweakers Discord

is niet lief

Er is een reden dat MySQL (en elk ander DBMS) datums opslaat in formaat YYYY-MM-DD. Waarom hebben jullie jezelf in deze hoek geduwd door een VARCHAR te misbruiken en Nederlandse notatie op te slaan, met als gevolg dat je ook nog een extra kolom gaat gebruiken met de compleet ranzige naam date_for_sort (waar ze waarschijnlijk wel gewoon als yyyy-mm-dd in staan) moet gebruiken. Het probleem zit hem niet in de query, maar in jullie datamodel, dat klopt van geen kant.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • nnomiS
  • Registratie: Oktober 2000
  • Laatst online: 22:37
Laat maar jullie gebruiken al str_to_date... agree met het boven staande..

Verder hoop ik dat dit een soort test code is en anders zou ik in ieder geval even kijken naar:
- mysql injecten op de date invoervelden (zie mysql_real_escape_string)
- De fmod alleen de class laten zetten ipv je hele code copy pasten

[ Voor 31% gewijzigd door nnomiS op 02-04-2010 12:06 ]


Acties:
  • 0 Henk 'm!

  • Fr0zenFlame
  • Registratie: September 2003
  • Laatst online: 19-11-2024

Fr0zenFlame

LAN 'A Holic

Topicstarter
MueR schreef op vrijdag 02 april 2010 @ 12:02:
Er is een reden dat MySQL (en elk ander DBMS) datums opslaat in formaat YYYY-MM-DD. Waarom hebben jullie jezelf in deze hoek geduwd door een VARCHAR te misbruiken en Nederlandse notatie op te slaan, met als gevolg dat je ook nog een extra kolom gaat gebruiken met de compleet ranzige naam date_for_sort (waar ze waarschijnlijk wel gewoon als yyyy-mm-dd in staan) moet gebruiken. Het probleem zit hem niet in de query, maar in jullie datamodel, dat klopt van geen kant.
Iig bedankt voor je objectieve reactie.
Ben het ook geheel eens met het feit dat het model niet klopt.
In eerste instantie hadden we beter moeten kijken naar hoe we de database zouden inrichten en welke type velden we zouden moeten gebruiken, maargoed het projectje is begonnen als een soort van try out.. en van het een komt het ander, nu zitten we met deze "beginners fouten".

De afweging die wij nu willen maken is echter, gaan we het opnieuw ontwerpen / inrichten of kunnen we dit nog recht trekken met een bepaalde conversie.

De eerder aangedragen oplossing m.b.t. het aanmaken van een lege kolom en de geconveteerde data daar op te slaan is ook wel degelijk een optie, ook eentje die we zelf in gedachte hadden.

We willen dus eigenlijk even bepalen wat het handigste is om nu te doen ombouwen (opnieuw inrichten), of "behelpen/repareren" (m.b.v. conversie functies). De visie van 3e is hierbij altijd handig, en er zijn altijd dingen die je over het hoofd (kan)zien.

In ieder geval bedankt voor de reacties!

[ Voor 9% gewijzigd door Fr0zenFlame op 02-04-2010 12:22 ]

i7-6700K | Z170A XPOWER GAMING TITANIUM EDITION | InWin904 | 32GB Corsair Dominator Platinum | nVidia GeForce RTX2080 TI | Iiyama G-Master UWQH 34" | 2x 1TB Samsung SSD 980PRO | 1x 4TB Samsung 860EVO | Arctis 7 | SteelSeries Apex Pro | Logitech G502 Hero


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Ik zou je ding opnieuw ontwerpen en inrichten, en je datum opslaan in een date field.

Je geeft het zelf al aan: Het is begonnen als een klein projectje en is nu al iets groter. Als het nu NOG groter wordt, dan blijf je nog altijd met die stomme structuurfouten in het begin zitten, waar je altijd een workaround voor gaat moeten schrijven.

Fix it while you can.

Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Laatst online: 01:19
Ben het eens met iemand hierboven: datums in een nieuwe (date)kolom zetten) Kleine conversie, weinig impact in tijd. En je verhelpt een toekomstig groot probleem.

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Acties:
  • 0 Henk 'm!

  • scorpion-biker
  • Registratie: Augustus 2009
  • Laatst online: 16-09 14:27
Zonder je database te veranderen zou je het volgens mij ook op de volgende manier aan kunnen pakken...

PHP:
1
2
3
4
5
6
7
$datum_1 = date("d-m-Y", strtotime($_POST['datum_1']));
$datum_2 = date("d-m-Y", strtotime($_POST['datum_2']));

$sql= "...
WHERE user= '$id'  
AND  
date_for_sort BETWEEN '".$datum_1."' AND '".$datum_2."'


Dus gebruik je date_for_sort i.p.v. datum_rit voor je BETWEEN statement.

[ Voor 4% gewijzigd door scorpion-biker op 02-04-2010 13:59 . Reden: htmlspecialchars verwijderd ]

World of Trucks ~ Steam ~ CR: clan Kronenjagers (#8QGLP089)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
scorpion-biker schreef op vrijdag 02 april 2010 @ 13:33:
Zonder je database te veranderen zou je het volgens mij ook op de volgende manier aan kunnen pakken...

PHP:
1
2
$datum_1 = date("d-m-Y", strtotime(htmlspecialchars($_POST['datum_1'])));
$datum_2 = date("d-m-Y", strtotime(htmlspecialchars($_POST['datum_2'])));
WTF is het nut van htmlspecialchars daar :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • scorpion-biker
  • Registratie: Augustus 2009
  • Laatst online: 16-09 14:27
:$ oeps foutje.

Vrijdag middag modus :Z

World of Trucks ~ Steam ~ CR: clan Kronenjagers (#8QGLP089)


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 01:04
Wat is überhaupt het nut daarvan? Uit TS:
Deze datum's worden gepost in een form en gedefinieerd als $datum_1 & $datum_2.
De format die ingevultd wordt in deze forms is dd-mm-yyyy.
Dus je converteert naar timestamp en weer terug naar dezelfde stringrepresentatie. Bovendien is date_for_sort een DATE (MySQL-type). Je zou dan ook STR_TO_DATE moeten loslaten op de datums die je er met PHP in plakt of misschien dat date('Y-m-d', strtotime(...)) gebruiken ook nog succes heeft.

Acties:
  • 0 Henk 'm!

  • Fr0zenFlame
  • Registratie: September 2003
  • Laatst online: 19-11-2024

Fr0zenFlame

LAN 'A Holic

Topicstarter
Bedankt voor de reacties,

We hebben inmiddels een database export uitgevoerd naar *.csv, opnieuw de db gecreerd en vervolgens verschillende replace acties/scripts losgelaten op het bestand en deze vervolgens weer geimporteerd in een datbase met de juiste datatype!

Bedankt iig! ^_-

i7-6700K | Z170A XPOWER GAMING TITANIUM EDITION | InWin904 | 32GB Corsair Dominator Platinum | nVidia GeForce RTX2080 TI | Iiyama G-Master UWQH 34" | 2x 1TB Samsung SSD 980PRO | 1x 4TB Samsung 860EVO | Arctis 7 | SteelSeries Apex Pro | Logitech G502 Hero

Pagina: 1