嗨,我想检查数据库中是否已经存在日期,但是我的代码未将值更改为false,这是我的代码
$query_db = $conn->prepare('SELECT DATE(dvanaf) AS DatumVanaf, DATE(dtot) AS DatumTot, actief
FROM beschikbaarheid WHERE DID = :DID AND actief = 1');
$query_db->bindParam(':DID', $did, PDO::PARAM_STR);
$query_db->execute();
$begin = new DateTime( $dvanaf );
$end = new DateTime( $dtot );
$end = $end->modify( '+1 day' );
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);
//Check if date already exists in db
foreach($daterange as $date){
while ($datum = $query_db->fetch(PDO::FETCH_ASSOC))
{
if($datum['DatumVanaf'] == $date->format("d-m-Y"))
{//Change datescheck to false if date exists
$datesCheck = false;
break;
}
}
}
echo $datesCheck;
die();
当我运行代码并回显$ datesCheck时,它停留在1。
答案 0 :(得分:0)
在以下条件下更改日期格式
(if($datum['DatumVanaf'] == $date->format("d-m-Y")) )
至
if($datum['DatumVanaf'] == $date->format("**Y-m-d**"))
答案 1 :(得分:0)
您只检查范围内的第一个日期。 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;