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

PHP中带有日期比较的while循环中的奇怪行为,php,datetime,while-loop,Php,Datetime,While Loop,嗨,我正在尝试创建一个简单的while循环,它从PHP中的数据库中提取一个关联数组。本质上,我想对从数据库中提取的日期与当前日期进行比较。这是陷阱。不同的部分(在表格中表示)有不同的截止日期。所以我需要通过减去一定的天数来修改从数据库中提取的日期。我用不同的变量做了这些,但是我得到了一些奇怪的结果,这些结果不是我指定的。我错过什么了吗 $today = date("Y-m-d") while ($query_row = sqlsrv_fetch_array($stmt, SQLSRV_FET

嗨,我正在尝试创建一个简单的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 = '';
    }
    }
$today=日期(“Y-m-d”)
而($query\u row=sqlsrv\u fetch\u array($stmt,sqlsrv\u fetch\u ASSOC))
{          
$date=$query_行['DueDate'];//这是服务器的到期日期
$duedate=$date->format('d-m-Y');//在表中输出
$compare1=$date;
$compare2=$date;
$compare3=$date;
$compare4=$date;
$compare1->modify('-4天');
$compare2->modify('-3天');
$compare3->modify('-2天');
$compare4->modify('-1天');
echo$today.“today
”; //只是为了调试 echo$date->format('Y-m-d').“到期日
”; echo$compare1->format('Y-m-d').“减去4个日期
”; 如果($today>=$compare1) { $Triginsert='style=“背景色:#ff0000;”; } 其他的 { $Triginsert=''; } }
正如您所看到的,如果当前日期大于或等于比较的日期(应该是从服务器拉取的日期)-4天,则应将块变为红色,否则不应执行任何操作

任何帮助都会很好


感谢

由于在php 5+中对象是通过引用分配的,所以所有$compare变量都是对相同原始$date对象的引用。因此,您将重复修改同一个,而不是创建4个单独的。看见 你想要的是:

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

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

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

$date = new DateTime($query_row['DueDate']);
您将遇到的问题基于DueDate的形式,因此您可能需要首先处理它

下面是设置日期对象的说明

您的问题是:

$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']);

然后,您可以开始将其用作对象。

尝试使用
strotime()
,并确保两个日期的格式都是相同的,这当然有助于消除奇怪的读数!来自C#m背景的php对我来说都是非常新的,类似的语法,但这些小东西让我明白了。你是对的$查询_行['DueDate']应该已经是一个日期,因为它作为日期类型来自SQL。但是,我不确定PHP是否能够自动解释这一点并将$date指定为日期对象,或者它是否类似于c#,并且您必须告诉它(这对我来说毫无意义,他们都是同一家公司!(我的意思是c#和MS sql))结果我的另一个错误出现在while循环中(我当时删除了整个变量集!)但这解决了问题。非常感谢你帮助大家!DateTime::_construct()期望参数1为字符串,这是我尝试传递此参数时出现的错误。值得注意的是,['DueDate']在Sql server中是Date类型的,因此我不确定PHP是将变量指定为对象DateTime,还是将所有内容都作为字符串变量??