Probleem met datum
Ik heb een heel raar probleem. Ik heb 2 servers bij 2 verschillende webhosters staan. wanneer ik mijn administratiesysteem gebruik bij server 1 doet hij het wel, de datums worden goed weergegeven naar de database, niets aan de hand dus. Wanneer ik alles precies hetzelfde doe bij server 2 dan worden de datum's niet goed weergegeven. Alles wordt opgeslagen als 0000-00-00, 1970-01-01 of als 1999-11-30. Oke, dus ik probeer het zelf thuis via localhost. Installeer XAMPP en ik doe weer het zelfde als hiervoor. Nu krijg ik dus wederom die datum fout. Ik snap er niets van. Op 1 server werkt het wel en de andere 2 niet. Wat is hier tegen te doen, waar kan het aan liggen? Iemand een idee.
Alvast bedankt.
Misschien handig als je de code laat zien wat het 'fout' weergeeft...
heb je een stukje relevant script (waar je de datum erin zet) en je databasestructuur
0000-00-00 => Een string die geen datum is of een leeg veld
1970-01-01 => Klinkt als een unix-timestamp, die begon op 1-1-1970, kun je verder niks mee.
1999-11-30 => Lijkt me een goede datum, maar ik ken de input niet.
1) Hoe maak jij de datums aan?
2) Gebruik je overal de php-functie checkdate() om te controleren of de datum wel een datum is?
3) Zet jij overal de gecontroleerde datum wel in de juiste volgorde?
4) Gebruik je wel overal een DATE of DATETIME om een datum (met tijd) op te slaan?
Offtopic: Debuggen gaat je waarschijnlijk meer tijd kosten dat het zoeken van een provider met een echte database en het ombouwen van je script... MySQL is slecht en blijft slecht, het is van a tot z onbetrouwbaar, zie de handleiding, daar staat het haarfijn in uitgelegd. Onbegrijpelijk dat mensen kiezen voor deze ellende...
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
GaMer13 schreef op 21.04.2008 16:11:
hahahaha! Wordt maar eens doodziek van MySQL en stop met het accepteren van dit soort onzinnige bugs. Dit soort topics laten precies zien waarom MySQL een kloteproduct is. En nu vind jij mij lastig omdat ik de vinger op de zere plek leg? Momentje, zal ik even wat zout in de gapende MySQL-wonden strooien... hahahaha!@pgFrank, ik wordt (kots) misselijk van je gevit op MySQL. Iedereen weet inmiddels dat SQLLite, PostgresQL etc. beter is, dit hoef je niet bij elk (lees: ELKE) erin te vermelden.
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
MySQL is **beep**
GaMer13 schreef op 21.04.2008 16:11:
@pgFrank, ik wordt (kots) misselijk van je gevit op MySQL. Iedereen weet inmiddels dat SQLLite, PostgresQL etc. beter is, dit hoef je niet bij elk (lees: ELKE) erin te vermelden.
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
Geheel mee eens.
Een tijdje/keertje is leuk, maar dit is hoogst irritant aan het worden.
pgFrank schreef op 21.04.2008 16:16:
MySQL is **beep**
GaMer13 schreef op 21.04.2008 16:11:
hahahaha! Wordt maar eens doodziek van MySQL en stop met het accepteren van dit soort onzinnige bugs. Dit soort topics laten precies zien waarom MySQL een kloteproduct is. En nu vind jij mij lastig omdat ik de vinger op de zere plek leg? Momentje, zal ik even wat zout in de gapende MySQL-wonden strooien... hahahaha!@pgFrank, ik wordt (kots) misselijk van je gevit op MySQL. Iedereen weet inmiddels dat SQLLite, PostgresQL etc. beter is, dit hoef je niet bij elk (lees: ELKE) erin te vermelden.
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
MySQL is **beep**
+1
Dit staat bovenaan in mijn script:
Code (php)
Daarna zorg ik ervoor dat het in de database komt met deze code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if($_POST['factuurnummer'] == '' || $_POST['klantnummer'] == ''){ echo"Een factuurnummer en klantnummer zijn verplicht!"; $form = true; }
else{
$sql = mysql_query("INSERT INTO facturen VALUES ('','". $_POST['factuurnummer'] ."',
'". $_POST['klantnummer'] ."',
'". $factuur ."',
'". date("Ymd", $datumfac) ."',
'". $bedrag ."',
'". date("Ymd", $datumbet) ."',
'". $_POST['bijzonderheden'] ."','open')") or die(mysql_error());
if($sql){
echo mededeling("De factuur is succesvol aangemaakt.");
?>
if($_POST['factuurnummer'] == '' || $_POST['klantnummer'] == ''){ echo"Een factuurnummer en klantnummer zijn verplicht!"; $form = true; }
else{
$sql = mysql_query("INSERT INTO facturen VALUES ('','". $_POST['factuurnummer'] ."',
'". $_POST['klantnummer'] ."',
'". $factuur ."',
'". date("Ymd", $datumfac) ."',
'". $bedrag ."',
'". date("Ymd", $datumbet) ."',
'". $_POST['bijzonderheden'] ."','open')") or die(mysql_error());
if($sql){
echo mededeling("De factuur is succesvol aangemaakt.");
?>
Factuurdatum wordt aangemaakt in het formulier met deze code (gedeelte eruit):
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
<tr>
<td>Factuurdatum:</td>
<td>". datumLijst("fac_dag", "fac_maand", "fac_jaar", $_POST['fac_dag'], $_POST['fac_maand'], $_POST['fac_jaar']) ."</td>
</tr>
?>
<tr>
<td>Factuurdatum:</td>
<td>". datumLijst("fac_dag", "fac_maand", "fac_jaar", $_POST['fac_dag'], $_POST['fac_maand'], $_POST['fac_jaar']) ."</td>
</tr>
?>
De functie datumlijst ziet er als volgt uit, maar daar ligt het volgens mij niet aan:
Code (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
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
<?php
function datumLijst($dag_naam, $maand_naam, $jaar_naam, $dag_waarde, $maand_waarde, $jaar_waarde){
$maanden = array("","Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December");
$echodag = "<select name='". $dag_naam ."'>";
for($i=1;$i < 32; $i++){
$i = (strlen($i) == 1) ? "0". $i : $i;
if(strlen($i) == 1){
$i = "0". $i;
}
if($i == $dag_waarde){
$echodag .= "<option value='". $i ."' SELECTED>". $i ."</option>";
}
else{
$echodag .= "<option value='". $i ."'>". $i ."</option>";
}
}
$echodag .= "</select>";
$echomaand = "<select name='". $maand_naam ."'>";
for($i=1;$i < 13; $i++){
$i2 = (strlen($i) == 1) ? "0". $i : $i;
if($i == $maand_waarde){
$echomaand .= "<option value='". $i2 ."' SELECTED>". $maanden[$i] ."</option>";
}
else{
$echomaand .= "<option value='". $i2 ."'>". $maanden[$i] ."</option>";
}
}
$echomaand .= "</select>";
$echojaar = "<select name='". $jaar_naam ."'>";
for($i=2000;$i < date("Y") + 10; $i++){
if($i == $jaar_waarde){
$echojaar .= "<option value='". $i ."' SELECTED>". $i ."</option>";
}
else{
$echojaar .= "<option value='". $i ."'>". $i ."</option>";
}
}
$echojaar .= "</select>";
$geboortedatum = $echodag ."\n ". $echomaand ."\n ". $echojaar;
return($geboortedatum);
}
?>
function datumLijst($dag_naam, $maand_naam, $jaar_naam, $dag_waarde, $maand_waarde, $jaar_waarde){
$maanden = array("","Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December");
$echodag = "<select name='". $dag_naam ."'>";
for($i=1;$i < 32; $i++){
$i = (strlen($i) == 1) ? "0". $i : $i;
if(strlen($i) == 1){
$i = "0". $i;
}
if($i == $dag_waarde){
$echodag .= "<option value='". $i ."' SELECTED>". $i ."</option>";
}
else{
$echodag .= "<option value='". $i ."'>". $i ."</option>";
}
}
$echodag .= "</select>";
$echomaand = "<select name='". $maand_naam ."'>";
for($i=1;$i < 13; $i++){
$i2 = (strlen($i) == 1) ? "0". $i : $i;
if($i == $maand_waarde){
$echomaand .= "<option value='". $i2 ."' SELECTED>". $maanden[$i] ."</option>";
}
else{
$echomaand .= "<option value='". $i2 ."'>". $maanden[$i] ."</option>";
}
}
$echomaand .= "</select>";
$echojaar = "<select name='". $jaar_naam ."'>";
for($i=2000;$i < date("Y") + 10; $i++){
if($i == $jaar_waarde){
$echojaar .= "<option value='". $i ."' SELECTED>". $i ."</option>";
}
else{
$echojaar .= "<option value='". $i ."'>". $i ."</option>";
}
}
$echojaar .= "</select>";
$geboortedatum = $echodag ."\n ". $echomaand ."\n ". $echojaar;
return($geboortedatum);
}
?>
Dit zijn allemaal gedeeltes uit mijn script. De rest hebben jullie niets aan. Dit gaat over de datum. De functie DatumLijst staat appart in de functions.php.
@pgFrank: Zoals we de vorige post over gehad hebben, wordt nu alles opgeslagen als DATE, dit heb ik geheel omgezet. Alleen checkdate() gebruik ik niet, maar ik weet niet goed hoe ik hier gebruik van moet maken, ik heb me er nog niet in verdiept
Gewijzigd op 01/01/1970 01:00:00 door Paul IJmker
En de datum wil je als yyyy-mm-dd opslaan... Ik mis een paar streepjes - in jouw datum.
Daarnaast is het onzinnig om met datums te gaan rommelen in PHP wanneer SQL dat veel handiger kan:
Huidige datum:
Huidige datum + 14 dagen:
Uiteraard kun je dit ook in een INSERT of UPDATE-query verwerken, dat werkt hetzelfde.
Het lijkt erop dat je uit je formulier een dag, maand en jaar terug krijgt? Controleer dan eerst met checkdate() of het een geldige datum is, en zet hem daarna in het juiste formaat om in je INSERT query te gebruiken. Optellen van een bepaald aantal dagen bij een datum laat je aan de database over:
Code (php)
Overigens is het vrij nutteloos om de betaaldatum op te slaan, aangezien dit een directe afgeleide is van de factuur datum. Die kun je dus ook gewoon weg laten.
Maar hoevaak komt het voor dat je voor klant A andere betalingsregels hanteert dan voor klant B ? Dat maakt de boekhouding onnodig complex en levert veel extra financieele risico's op voor het bedrijf. Stel eventueel een handjevol regels op en verwijs per klant naar de bijbehorende regels. Om per klant andere regels op te stellen, dé manier om een faillisement "veilig" te stellen...
Maar is er dan een uitleg dat hij bij de ene het wel goed doet en bij de andere niet. Allen MySQL.
Ik heb hier eens iets over geschreven, zie dit artikel. Heb echter niet de illusie dat MySQL daarmee een veilige database wordt, dat is technisch niet mogelijk. Daar valt niks aan te doen.
Tip: Gebruik een DBMS die fouten afkeurt en niet zelf de nodige onzin gaat verzinnen.
Edit: De problemen verschillen ook nog weer per versie, iets wat werkt in versie 4, kan wel eens niet werken in versie 5 en andersom.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
GaMer13:
@pgFrank, ik wordt (kots) misselijk van je gevit op MySQL. Iedereen weet inmiddels dat SQLLite, PostgresQL etc. beter is, dit hoef je niet bij elk (lees: ELKE) erin te vermelden.
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
Als ik voor elke vermelding over 'hoe-slecht-MySQL-wel-niet-is' 1 cent zou krijgen, dan zou ik miljonair zijn!
SanThe:
Geheel mee eens.
Een tijdje/keertje is leuk, maar dit is hoogst irritant aan het worden.
Een tijdje/keertje is leuk, maar dit is hoogst irritant aan het worden.
Ein-de-lijk ben ik niet de enige die Frank onderhand zat is met z'n anti-MySQLpropaganda! Nu hoor je het ook eens van een ander, Frank. Overigens:
Quote:
(...) is het één groot feest in MySQL (...) Tip: Gebruik een DBMS die fouten afkeurt en niet zelf de nodige onzin gaat verzinnen.
+1
Ontopic:
Mag ik aannemen dat $sDatum de datum van vandaag bevat? Pak dan CURRENT_DATE en ga daarmee rekenen. Sla misschien in een apart veld nog eens '14' op, ten teken van het aantal dagen (termijn). Als je dan van 'business rule' wilt veranderen, kijk je gewoon welke records '14' hebben, reken het verschil uit tussen je nieuwe 'business rule' en de oude, en tel het verschil (aantal dagen) op bij de datum die opgeslagen staat ;-).
Jongens, jullie kunnen wel gaan zeuren over mij, maar voorlopig laten jullie Paul al uren/dagen (zie voorgaande problemen) zwemmen met z'n huidige bugs. En wie veroorzaakt deze bugs? Precies, MySQL. Met een andere database was Paul al lang klaar geweest met z'n systeem, had dit hele probleem niet bestaan. Maar nee, ga maar zeuren over iemand die iets zinnigs heeft te melden, dat levert écht een oplossing op... -1 voor de MySQL-fanboys-zonder-oplossing.
Deze post mag gesloten worden, ik ben dit gezeur zat. Bedankt voor jullie geleuter over wat beter is blah blah. Mzzl.
Daarnaast probeerde ik nog het een en ander op te lossen (zie mijn ontopic-gedeelte van mijn vorige post). De directe oplossing zou ik ook niet direct hebben, nee. Maar die heb jij ook niet, anders was Paul toch al klaar geweest? Goed zo... -2 voor postgreFrank.
Paul beschikt nu eenmaal niet over een andere database. Zoals zo velen. Maar postgreFrank wil dat niet zien geloof ik. Niet iedereen beschikt 1,2,3 over een 'database naar postgreFranks zin'.
Wat ik aanricht??? Hoe verzin je het! Ik wijs op de bugs van MySQL en nu zou ik Paul hebben doen schrikken? Gossie, ik wist niet dat ik over die powers beschikte.
En de oplossing van Djemo, dat is niet meer dan een copy-paste van de reacties van Blanche en mijzelf, dus om jezelf daarvoor nu een veer in je kont te steken... ;)
MySQL-gebruikers accepteren een onbetrouwbare database, prima, maar ga dan niet zeuren dat de database onbetrouwbaar is. Dat is een keuze die je zelf maakt. Er zijn genoeg alternatieven voor MySQL en dat is echt niet alleen PostgreSQL. Accepteer de onzin van MySQL of hou op met zeuren over de problemen die je er mee hebt. Het is dan ook een beetje zinloos om daar wéér een topic over aan te maken.
My2Cents
pgFrank schreef op 21.04.2008 21:46:
We dwalen af en het niveau daalt...
Wat ik aanricht??? Hoe verzin je het! Ik wijs op de bugs van MySQL en nu zou ik Paul hebben doen schrikken? Gossie, ik wist niet dat ik over die powers beschikte.
En de oplossing van Djemo, dat is niet meer dan een copy-paste van de reacties van Blanche en mijzelf, dus om jezelf daarvoor nu een veer in je kont te steken... ;)
MySQL-gebruikers accepteren een onbetrouwbare database, prima, maar ga dan niet zeuren dat de database onbetrouwbaar is. Dat is een keuze die je zelf maakt. Er zijn genoeg alternatieven voor MySQL en dat is echt niet alleen PostgreSQL. Accepteer de onzin van MySQL of hou op met zeuren over de problemen die je er mee hebt. Het is dan ook een beetje zinloos om daar wéér een topic over aan te maken.
My2Cents
Wat ik aanricht??? Hoe verzin je het! Ik wijs op de bugs van MySQL en nu zou ik Paul hebben doen schrikken? Gossie, ik wist niet dat ik over die powers beschikte.
En de oplossing van Djemo, dat is niet meer dan een copy-paste van de reacties van Blanche en mijzelf, dus om jezelf daarvoor nu een veer in je kont te steken... ;)
MySQL-gebruikers accepteren een onbetrouwbare database, prima, maar ga dan niet zeuren dat de database onbetrouwbaar is. Dat is een keuze die je zelf maakt. Er zijn genoeg alternatieven voor MySQL en dat is echt niet alleen PostgreSQL. Accepteer de onzin van MySQL of hou op met zeuren over de problemen die je er mee hebt. Het is dan ook een beetje zinloos om daar wéér een topic over aan te maken.
My2Cents
Doen schrikken, kom op, get a life.
Moet ik misschien de code zo aanpassen dat ik de datum met een $POST schrijf naar de database?
Ik heb alles al geprobeerd maar het lukt niet.
edit: ik heb zojuist dit geprobeerd: '". date("Y-m-d", $datumfac) ."', maar dan zonder $datumfac en dan pakt hij wel de dag van vandaag. Dus het zit hem volgens mij in de invoer. Want als ik toch de bevenstaande waarde gebruik dan krijg ik deze datum: 30-11-1999
Gewijzigd op 01/01/1970 01:00:00 door Paul IJmker
Paul IJmker schreef op 21.04.2008 21:56:
Wanneer de datum uit een formulier komt, bv. een text-veld of select-box, dan gaat dat inderdaad met een $_POST. Bv. $_POST['jaar'], $_POST['maand'] en $_POST['dag']. Controleer eerst met checkdate() of het wel een geldige datum is, 2008-02-31 is geen geldige datum, en zet hem dan in de juiste volgorde:Moet ik misschien de code zo aanpassen dat ik de datum met een $POST schrijf naar de database?
Ik heb alles al geprobeerd maar het lukt niet.
Ik heb alles al geprobeerd maar het lukt niet.
En wanneer het geen geldige datum is, geef je gewoon een foutmelding.
$datum kun je dan in je query gaan zetten, die is gecontroleerd en goedgekeurd.