我正在开发一个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>";
}
?>
答案 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)
使用以下代码。
尝试使用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>";
}
//
}
?>