php - foreach 循环中 if 语句后值不改变

标签 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();

当我运行代码并 echo $datesCheck 时,它保持在 1。

最佳答案

您仅检查该范围内的第一个日期。 for 循环第一次迭代中的 while() 循环将从查询中获取所有行。其他迭代不会在查询结果中留下任何内容,因此 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;

关于php - foreach 循环中 if 语句后值不改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53883578/

相关文章:

php - OR 的 MYSQL 语法?

PHPUnit 在 Netbeans 中的 ArrayCollection(Doctrine 2)初始化后不再运行

mysql - SQL 外连接 2 个表

php - 类别不起作用

MySQL 的 Join 函数?这可以改进吗?

sql - 如何在 SQL 中删除所有没有 child 的 parent ?

mysql - 如何在 mysql 中插入带有斜杠而不是破折号的日期类型值?

Php 得到这样一个数组的结果

mysql - 通过更新已存在字段的值来获取受影响的行值

javascript - 如何仅通过 Javascript 访问我的 GrapheneDB neo4j 数据库