Probleem met datum

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Paul IJmker

Paul IJmker

21/04/2008 16:01:00
Quote Anchor link
Hallo allemaal.

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.
 
PHP hulp

PHP hulp

22/12/2024 15:08:44
 
GaMer B

GaMer B

21/04/2008 16:03:00
Quote Anchor link
Misschien handig als je de code laat zien wat het 'fout' weergeeft...
 
Terence Hersbach

Terence Hersbach

21/04/2008 16:04:00
Quote Anchor link
heb je een stukje relevant script (waar je de datum erin zet) en je databasestructuur
 
Frank -

Frank -

21/04/2008 16:08:00
Quote Anchor link
Tja, MySQL, je kiest er zelf voor. Nu mag jij gaan raden waar het fout gaat, een goede database had je allang getrakteerd op een bruikbare foutmelding.

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...
 
GaMer B

GaMer B

21/04/2008 16:11:00
Quote Anchor link
@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!
 
Frank -

Frank -

21/04/2008 16:16:00
Quote Anchor link
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!
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!

MySQL is **beep**
 
- SanThe -

- SanThe -

21/04/2008 16:16:00
Quote Anchor link
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!

Geheel mee eens.

Een tijdje/keertje is leuk, maar dit is hoogst irritant aan het worden.
 
GaMer B

GaMer B

21/04/2008 16:18:00
Quote Anchor link
pgFrank schreef op 21.04.2008 16:16:
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!
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!

MySQL is **beep**

+1
 
Paul IJmker

Paul IJmker

21/04/2008 17:11:00
Quote Anchor link
Het volgende:

Dit staat bovenaan in mijn script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$datumbet
= mktime(0,0,0,$fac_maand, $fac_dag, $fac_jaar) + (60*60*24*14);
                $datumfac = mktime(0,0,0,$fac_maand, $fac_dag, $fac_jaar);
?>


Daarna zorg ik ervoor dat het in de database komt met deze code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.");


?>


Factuurdatum wordt aangemaakt in het formulier met deze code (gedeelte eruit):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

?>


De functie datumlijst ziet er als volgt uit, maar daar ligt het volgens mij niet aan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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&nbsp;". $echomaand ."\n&nbsp;". $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
 
Frank -

Frank -

21/04/2008 17:17:00
Quote Anchor link
date("Ymd", $datumfac)
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT CURRENT_DATE;

Huidige datum + 14 dagen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT CURRENT_DATE + INTERVAL 14 DAY;

Uiteraard kun je dit ook in een INSERT of UPDATE-query verwerken, dat werkt hetzelfde.
 
Joren de Wit

Joren de Wit

21/04/2008 17:22:00
Quote Anchor link
Waarom zou je in hemelsnaam eerst met mktime() een timestamp creeren om deze vervolgens met date() om te zetten naar een datum die je in je INSERT query gebruikt?

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if(checkdate($iMaand, $iDag, $iJaar))
{

    $sDatum = $iJaar.'-'.$iMaand.'-'.$iDag;
    
    $sQuery = "
        INSERT INTO tabel
        (
            factuurdatum,
            betaaldatum
        )
        VALUES
        (
            '"
.$sDatum."',
            '"
.$sDatum."' + INTERVAL 14 DAY
        )
    "
;
}

?>

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.
 
Frank -

Frank -

21/04/2008 17:29:00
Quote Anchor link
Sterker nog, er is nog helemaal niets betaald, het opslaan van de betaaldatum is dus zinloos. Een betaaltermijn is een business rule, en die kunnen zomaar veranderen. Wanneer je dit wilt opslaan, zou je in dit geval alleen de waarde 14 of 14 DAY willen opslaan. Even aanpassen naar 21 en je hebt een andere business rule zonder dat je met een datum hoeft te gaan klooien.

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...
 
Paul IJmker

Paul IJmker

21/04/2008 20:11:00
Quote Anchor link
Maar is er dan een uitleg dat hij bij de ene het wel goed doet en bij de andere niet. Allen MySQL.
 
Frank -

Frank -

21/04/2008 20:17:00
Quote Anchor link
Het is afhankelijk van de op dat moment geldende instellingen hoe MySQL omgaat met een datum. En omdat zowel jij als de beheerder van de server deze instellingen runtime kunnen aanpassen, is het één groot feest in MySQL. Data die in de database staat, hoeft dus niet gelijk te zijn aan de data die jij wilde opslaan. Dit probleem speelt bij alle data in MySQL, maar vooral bij datums en tijden duikt dit probleem regelmatig op.

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 -
 
Jesper Diovo

Jesper Diovo

21/04/2008 20:51:00
Quote Anchor link
Offtopic:
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!

SanThe:
Geheel mee eens.

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 ;-).
 
Frank -

Frank -

21/04/2008 20:57:00
Quote Anchor link
Yep, kill the messenger.... but don't shoot your problem!

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.
 
Paul IJmker

Paul IJmker

21/04/2008 21:18:00
Quote Anchor link
Deze post mag gesloten worden, ik ben dit gezeur zat. Bedankt voor jullie geleuter over wat beter is blah blah. Mzzl.
 
Jesper Diovo

Jesper Diovo

21/04/2008 21:28:00
Quote Anchor link
Goed zo, Frank! Kijk maar eens wat je hebt aangericht met je gezanik. Overigens, je noemt ons nu MySQL-fanboys zonder enig argument. Als wij pleiten dat jij moet ophouden met je anti-MySQLpropaganda wil dat niet meteen zeggen dat wij MySQL helemaal toppie vinden. Nutteloze woorden, dus.

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'.
 
Frank -

Frank -

21/04/2008 21:46:00
Quote Anchor link
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
 
Paul IJmker

Paul IJmker

21/04/2008 21:56:00
Quote Anchor link
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


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
 
Frank -

Frank -

21/04/2008 22:01:00
Quote Anchor link
Paul IJmker schreef op 21.04.2008 21:56:
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.
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$datum
= $_POST['jaar'].'-'.$_POST['maand'].'-'.$_POST['dag'];
?>

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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.