在foreach循环中的if语句后值未更改

时间:2018-12-21 10:57:23

标签: php mysql sql date

嗨,我想检查数据库中是否已经存在日期,但是我的代码未将值更改为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。

2 个答案:

答案 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;