Goedemorgen,

Ik wil graag de datums binnen een tijdvak gebruiken om data in te voegen in een tabel. Daarvoor wil ik de datum binnen een lus iedere keer een dag ophogen tot de einddatum is bereikt. Dit lukt echter niet. Als het al werkt worden de criteria van de lus iet gehanteerd waardoor hij door blijft draaien of het werkt helemaal niet. De bedoeling is dat het script alle dagen laat zien binnen het aangegeven tijdvak. Het onderstaande heb ik gemaakt. Iemand enig idee waar het mis gaat.

Bedankt
Andy


Zou je jouw code even tussen code-tags willen plaatsen?
Jazeker, maar hoe kan ik dit plaatsen

[size=xsmall]Toevoeging op 05/07/2020 13:03:37:[/size]

Andy Kort op 05/07/2020 13:00:02

Jazeker, maar hoe kan ik dit plaatsen



<?php
if(isset($_POST['verzend'])) {

echo $_POST['date']."<br>";
echo $_POST['enddate']."<br><br>";

echo "De oude datum is ".$_POST['date']."<br>";
echo "De einddatum is ".$_POST['enddate']."<br>";

$date=date_create($_POST['date']);
echo date_format($date,"Y/m/d");
$date=date_format($date,"Y/m/d");

echo "datum: ".$date."<br>";
$enddate=$_POST['enddate'];
echo "Einddatum: ".$enddate;


while ($date<=$endddate) {

$date=date_modify($date, '+1 day');
date_format($date, 'Y-m-d');
$date=date_format($date, 'Y-m-d');
echo "<br><br>De nieuwe datum is ".$date;
}
}
?>

<form id="form2" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">

<input type="date" name="date" value="">
<br><br>

<input type="date" name="enddate" value="">
<br><br>

<input type="submit" class="btn btn-primary" style="background-color:#993366;" value="verzend" name="verzend"> <input type="reset" class="btn btn-primary" style="background-color:#993366;" value="reset">
</form>
</html>
Alle dagen binnen het tijdvak :

 <?php
if( isset( $_POST['verzend'] ) )
{
	echo '<pre>' . print_r( $_POST, TRUE ) . '</pre>';

	$begin_date = new DateTime( $_POST['date']    );
	$end_date   = new DateTime( $_POST['enddate'] );
	
	echo '<p>Begindatum : ' . $begin_date->format('Y-m-d') . '<br />';
	echo 'Einddatum : ' . $end_date->format('Y-m-d') . '</p>';
	$begin_date->modify('+1 day');
	while ( $begin_date < $end_date )
	{
		echo "De nieuwe datum is : " . $begin_date->format('Y-m-d') . '<br />';
		$begin_date->modify('+1 day');
	}
}
?>

<form id="form2" method="post">
	<input type="date" name="date" value=""><br />
	<input type="date" name="enddate" value=""><br />
	<input type="submit" value="verzend" name="verzend">
</form>
Tussen [code] en [/code] tags kan je jouw code plaatsen. Zie ook de Veelgestelde Vragen.
Dank je wel. Dit doet het wel. Mvg
Bij vraagstukken zoals deze is het ook handig om te analyseren waarom het in eerste instantie misging, in plaats van het (enkel) aandragen van een oplossing. Op deze manier leer je niet zoveel eigenlijk niets.

De vermoedelijke reden dat je while-loop op hol slaat is dat je $date niet op dezelfde wijze formatteert als $enddate (Y/m/d versus... een onbekende formattering), maar mogelijk ook omdat je in de loop $date ineens een andere formattering krijgt (initieel Y/m/d versus Y-m-d in de loop). Dit (ontwerp) klinkt al niet zo nauwgezet.

Je had in zekere zin al kunnen zien dat dit mis zou gaan, je geeft zowel de begin- als einddatum weer nog voordat je de loop start. Hierbij moet je snappen dat de vergelijking die in de while-conditie wordt gedaan een tekstuele vergelijking is. Er gelden dan andere regels dan bij een numerieke vergelijking. Vooral als je hierbij dan (nota bene verschillende!) karakters invoegt, dan is het niet zo verwonderlijk dat de code niet doet wat jij wilt.

Afhankelijk van het invulformulier zul je misschien ook nog wat randgevallen af moeten vangen. Wat als de einddatum voor de begindatum valt? Dan heb je een leeg interval. Wat gebeurt er dan? Of is dit niet mogelijk?
while ($date<=$endddate) {

$date is een DateTime object
$enddate is een string in een niet nader aangegeven formaat.

Om die 2 te kunnen vergelijken zal PHP dus moeten beslissen om $date van object om te zetten naar een string.

DateTime::toString() zou dan aangeroepen moeten worden, maar ik betwijfel of die bestaat.
En wat zou er dan uit moeten komen als string? 2020-07-06 of 7/6/2020 ?

Nog los van de vraag hoe $enddate er uit ziet.


Reageren