Вы проверяете только первую дату в диапазоне.Цикл while()
в первой итерации цикла for
извлечет все строки из запроса.На других итерациях ничего не останется в результатах запроса, поэтому цикл while
будет немедленно завершен.
Вы должны поместить результаты запроса в массив и выполнить цикл вместо этого.
Другая проблема заключается в том, что даты, возвращаемые БД, имеют формат Y-m-d
, а не d-m-Y
.
$query_results = $query_db->fetchAll(PDO::FETCH_ASSOC);
foreach ($daterange as $date) {
foreach ($query_results as $datum) {
if($datum['DatumVanaf'] == $date->format("Y-m-d"))
{//Change datescheck to false if date exists
$datesCheck = false;
break 2;
}
}
}
Но циклически проходить по датам - глупый способ сделать это.Вы можете просто проверить, находится ли дата между $begin
и $end
:
$begin_str = $begin->format("Y-m-d");
$end_str = $end->format("Y-m-d");
while ($datum = $query_db->fetch(PDO::FETCH_ASSOC)) {
if ($datum['DatumVanaf'] >= $begin_str && $datum['DatumVanaf'] <= $end_str) {
$datesCheck = false;
break;
}
}
Еще лучше было бы поставить проверку в самом запросе.
$query_db = $conn->prepare('SELECT COUNT(*) AS count
FROM beschikbaarheid
WHERE DID = :DID AND actief = 1
AND DatumVanaf BETWEEN :begin AND :end');
$query_db->bindParam(':DID', $did, PDO::PARAM_STR);
$query_db->bindValue(':begin', $begin->format("Y-m-d 0:0:0"));
$query_db->bindValue(':end', $end->format("Y-m-d 23:59:59"));
$query_db->execute();
$datum = $query_db->fetch(PDO::FETCH_ASSOC);
$datesCheck = $datum['count'] > 0;