在PHP应用程序上设置到期日期

时间:2016-05-20 08:53:45

标签: php

我正在开发一个php应用程序。我已经为应用程序生成了许可证的访问代码,通常是从安装之日起一年。当达到或即将达到DB中设置的到期日期时,它应该给出消息。最后一天到期后,应该重定向到许可页面。现在的问题是:当它到期时,它仍然会显示到期的某些天。也许我的代码错了或我选择这一天的方式是错误的。任何人都可以帮忙。

    <?php
    $se = "SELECT * FROM license WHERE status=1 ORDER BY endDate DESC";
    $conf = mysqli_query($connection,$se);
    $row = mysqli_fetch_array($conf);
    $tday = new DateTime(date("Y-m-d"));
    $eday = new DateTime($row['endDate']);
    $interval =$eday->diff($tday);
    $diff =$interval->format("%a");
    $mth=$interval->m; 
    $days =$interval->d;
    if($diff<=90){
    print '<script type="text/javascript">';
    print 'alert("License has expired.Contact me for renewal: developer@yahoo.com or Technical Support: mobileNo")';
    print '</script>';

   }else if($diff<=45){
   print '<script type="text/javascript">';

   print 'alert("License has expired.Contact me for renewal: developer@yahoo.com or Technical Support: mobileNo")';
   print '</script>';

  }else if($diff<=0){
   print '<script type="text/javascript">';
    print 'alert("License has expired.Contact me for renewal: developer@yahoo.com or Technical Support: mobileNo")';
   print '</script>';
   echo "<script> document.location='License.php';</script>";
  }

?>

查看数据库记录: DB Record

4 个答案:

答案 0 :(得分:2)

首先,您应在格式化间隔时添加%R:它会将格式设置为+-,这样可以与零进行比较(对于负值) ):

$dif = $interval->format('%R%a');

其次,您始终显示相同的消息。而且你没有按正确的顺序进行比较。你应该这样比较:

switch (true) {
    case ($diff <= 0):
        // Expired, need renewal
        break;
    case ($diff <= 45):
        // Expires within the next 45 days
        break;
    case ($diff <= 90):
        // Expires within the next 90 days
        break;
}

如果您愿意,可以使用if / elseif / else语句。但顺序很重要。这条信息也很重要:)

<强>更新

您需要计算正确的差异:

$interval = $tday->diff($eday);

将其视为:

$interval = $date_from->diff($date_to);

因此,如果$date_to大于$date_from,则时间间隔为正($date_to+$interval天内)。

$date_to 之前 $date_from时间隔为负($date_to天为-$interval天,这意味着{{1} } {是$date_to天前)。

因此,在您的情况下,如果$interval为正,则许可将在$interval天后到期。否则,许可证将在$interval天后过期。

答案 1 :(得分:0)

使用以下代码。

  • abs - 绝对值
  • floor - Round fraction down

尝试使用strtotime()

$date1 = "2016-05-07";  
$date2 = "2016-05-06";  
$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));
echo $days . "days";

<强>输出

1 days

答案 2 :(得分:0)

谢谢大家。你的建议对我有所帮助。我应该做的就是说:

<?php

    if($today>$db_expiry_date){
    redirect_to(license.php)
    }else{
    contine.....
    }
?>

此外,您可以使用以下方式玩弄剩余天数:

<?php
     if($diff<=45 && $today<$db_expiry_date){
        echo 'License will expire with next 45days';
        }elseif($diff<=90 && $today<$db_expiry_date){
        echo 'License will expire with next 90days';
        }else if($today>$db_expiry_date){
        echo 'License Expired';
        redirect_to('License.php');
        }
        }
    ?>

答案 3 :(得分:0)

基于 dbdate,我添加了在 1 天和 2 天前发出警报的提醒。它适用于 if else 条件。

<?php
$expire = date('Y-m-d', strtotime('0 days'));
$alrt = date('Y-m-d', strtotime('+2 days')); //renewal alert 1 day
$alrt2 = date('Y-m-d', strtotime('+3 days')); //renewal alert 2 days

$dbDate = '2021-04-15';//expired
//$dbDate = '2021-04-16'; //1 day
//$dbDate = '2021-04-17'; //2 day

if (strtotime($dbDate) <= strtotime($expire))
{
    echo "<h2>subscription expired.</h2>";
    //
    
}
else if (strtotime($dbDate) > strtotime($expire))
{
    echo "<h2>Enjoy service.</h2>";
    if (strtotime($dbDate) < strtotime($alrt))
    {
        echo "<h2>expiring tommorow.please pay</h2>";
    }
    else if (strtotime($dbDate) < strtotime($alrt2))
    {
        echo "<h2>expiring in 2 days.please pay</h2>";
    }
    //
    
}

?>