PHP中带有日期比较的while循环中的奇怪行为


Strange behaviour in a while loop with a date compare in PHP

Hi我正在尝试创建一个简单的while循环,该循环从PHP数据库中提取关联数组。本质上,我想将从数据库中提取的日期与当前日期进行比较。这是陷阱。不同的部分(用表格表示)有不同的截止日期。因此,我需要通过减去某些天数来修改从数据库中提取的日期。我用不同的变量做了这件事,但我得到了一些奇怪的结果,这些结果不是我指定的。我是不是错过了什么?

$today = date("Y-m-d") 
while ($query_row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
                    {          
    $date =  $query_row['DueDate'];// this is the due date from the  server
    $duedate = $date->format('d-m-Y'); // to output in table
    $compare1 = $date;
    $compare2 = $date;
    $compare3 = $date;
    $compare4 = $date;                             
    $compare1->modify('-4 days');
    $compare2->modify('-3 days');
    $compare3->modify('-2 days');
    $compare4->modify('-1 day');

    echo $today.' today <br/>';
    //just for debugging
    echo $date ->format('Y-m-d').' due date <br/>';
    echo $compare1->format('Y-m-d').' minus 4 date <br/>';
    if (  $today >= $compare1 )
    {   
        $Triginsert = 'style="background-color: #ff0000;"';
    }
    else 
    {
        $Triginsert = '';
    }
    }

正如你所看到的,如果当前日期大于或等于比较日期,该日期应该是从服务器上提取的日期-4天,那么它应该将块变成红色,否则它什么都不做。。

任何帮助都会很棒。

感谢

由于对象是在php5+中通过引用分配的,因此所有$compare变量都是对同一原始$date对象的引用。因此,您正在重复修改同一个,而不是创建4个单独的。看见http://www.php.net/manual/en/language.oop5.references.php。你想要的是:

$compare1 = clone $date;
$compare2 = clone $date;
etc.

顺便问一下,当你var_dump($query_row['DueDate'])时,你会得到什么?我假设它已经是一个日期对象,否则->modify()调用会立即出错,你说你得到的是奇怪的行为,而不是错误消息,但其他一些答案是假设$query_row['DueDate']是一个字符串,所以我想仔细检查。

查询中的数据将只是文本而不是Date对象,您需要使用该数据设置对象以实现您想要的

$date = new DateTime($query_row['DueDate']);

你将要遇到的问题是基于DueDate的形式,所以你可能需要首先处理它。

以下是设置Date对象的说明http://www.php.net/manual/en/datetime.construct.php

您的问题是:

$date =  $query_row['DueDate'];// this is the due date from the  server
^^^^^^----string
$duedate = $date->format('d-m-Y'); // to output in table
           ^^^^^---using string as an object

您需要通过构造函数(例如)将$date字符串传递给DateTime系统

$date = new DateTime($query_row['DueDate']);

然后你就可以开始把它当作一个物体来使用了。