如何从 PHP 数据库中的行,其中日期字段是未来 7 天


how to select rows from a database in php where the date field is 7 days in the future

我有一个自动检查器,可以检查将在未来 7 天内过期的域,并通过电子邮件发送给客户。

我使用此 SQL 查询:

 $sql="SELECT * from domain_names where (status = '' or status = 'valid') and date(expiry_date) = date(now() + interval 7 day) ";

工作正常,但如果它停止运行并且一天过去了,它将不会执行它错过的域。 让它做它错过的域的最佳方法是什么?

例如,如果一个域在 7 日到期,它在 1 日运行,它将看到该域

并向客户发送电子邮件,然后在行上放置一个标志,表示电子邮件已经发送,但如果检查器它在 1 日未运行,并且在 2 日再次开始运行,它不会看到该域(行(

只需对您的代码进行一点修改(输入"<"(:

$sql="SELECT * from domain_names where (status = '' or status = 'valid') and date(expiry_date) <= date(now() + interval 7 day) ";

您只检查正好提前 7 天的日子。您最多需要提前 7 天检查。将代码更改为:

$sql="SELECT * from domain_names where (status = '' or status = 'valid') and date(expiry_date) <= date(now() + interval 7 day) ";

由于您有一个标志,在此期间已经通过电子邮件发送的任何内容都不会再次收到电子邮件。

您要检查 DATE 小于或等于(今天 + 7 天(的位置。

您还应该在表中具有某种"标志",例如reminderSent - 这样您就不会在每次运行查询/脚本时发送多个提醒。

$sql = "SELECT * from domain_names WHERE
  (status = '' or status = 'valid') AND 
  date(expiry_date) <= date(now() + interval 7 day) AND
  AND !reminderSent";

因为您有一个标志来指示是否已发送电子邮件。 只需检查将在未来 7 天内过期的所有域的标志状态。

您的查询仅返回从现在开始一周后过期的域。修改它以返回在未来 7 天内过期的域。

本质上,如果邮件在 7 天内或具有不完整的标志,则需要发送邮件。

但是,我会将列从字符串更改为整数,因为它实际上只有两个值sentnot sent,即 1 或 0。

SELECT 
  * 
FROM 
  domain_names 
WHERE 
  status = 0 
OR 
  expiry_date BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 7 DAY)

在这种情况下,如果您将状态字段更新为 1,您将始终能够在下次脚本失败时发送。

也许你需要一些日期间隔,例如:

$sql="SELECT * from domain_names where (status = '' or status = 'valid') and date(expiry_date) between date(now()) and date(now() + interval 7 day)";

向记录添加已处理日期。 这是双重的,它为您提供了已处理的标志,但它也为您提供了发送通知的时间的历史参考。

在查询中,添加一个条件,说明 processed_date 为 null,并且expiry_date小于或等于今天加上 7 天。

(pseudo) where ...  and processed_date is null and expiry_date <= today + 7

当您在错过记录后寻找记录时

This should give the result as you need:
DATE_SUB(CURDATE(),INTERVAL 7 DAY) = expiry_date;
You can refer to the link below for more details:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

在服务器端设置 CRON 事件(如果您的虚拟主机提供(。然后,您可以根据需要随时运行它,而不必担心停电或互联网中断。

尝试使用此查询。它将为您使用全部..

$sql="从domain_names中选择 *,其中(状态 = '' 或状态 = "有效"(和DATE_ADD(expiry_date,间隔 7 天(";

或者您可以使用变量代替当前日期加上 7 天在 php 中设置它,例如;

$nextWeek=date("Ymd")+7;
$sql="SELECT * from domain_names where (status = '' or status = 'valid') 
and date(expiry_date) <= $nextWeek) ";

无论您使用什么日期格式,如果不同,您都需要交换"Ymd",这是我写的20140621这将转换为20140628

小写m和小写d允许两位数的日和月"06""01"。我相信大写会将其更改为个位数....2014621您可以更改顺序并按以下方式放置"/""-"

日期("M-D-Y"( +7 = 6-28-2014

date("d/m/y"(+7 = 28/6/2014

您可以使用

此代码。

$sql = SELECT * from domain_names where (status = '' or status = 'valid') and date(expiry_date) = DATE_ADD(date(now()), INTERVAL 7 DAY);

它可能会帮助你...

您是否考虑过添加您上次检查到期记录的日志,然后将该日期用作变量,以便每次代码运行时都可以从最后一个日期开始检查?