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.
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
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...
@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!
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**
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.
pgFrank schreef op 21.04.2008 16:16
[quote='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**[/quote]
+1
Het volgende:

Dit staat bovenaan in mijn script:

<?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:

<?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):

<?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:

<?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
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:

SELECT CURRENT_DATE;

Huidige datum + 14 dagen:

SELECT CURRENT_DATE + INTERVAL 14 DAY;

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

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:

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

Reageren