【问题标题】:Daily cron to poll mysql and update status based on timestamp每日 cron 轮询 mysql 并根据时间戳更新状态
【发布时间】:2014-03-22 04:25:56
【问题描述】:

我有一个充满电子邮件用户的数据库,其中列出了他们在名为 signup_date 的列中使用 DATETIME 类型(它使用 now() )注册的日期和时间,我还有一个 expire_date 列,它列出了相同的格式但完全相同一年后使用ADDDATE(NOW(), INTERVAL 365 DAY)

我添加了一个值为 0 或 1 的状态列。我猜这可能是一个 ENUM 类型。注册后,状态设置为 1 表示活动。

我想要的是,如果 expire_date 的时间戳早于当前时间,则 cron 应该在将状态设置为 0 的用户行上执行更新。在后缀中,我更改了查询并附加了状态=1 这样它就会选择只有状态为 1 的用户。如果状态不是 1,那么将找不到该用户,将无法登录。这个 cron 可以每天运行。对于让它每秒运行一次,我并不太喜欢。用户可以在第二天更新他们的电子邮件。所以这是我使电子邮件过期的简单方法,如果它们在一年后不活跃的话。我需要帮助的是构建 cron。这应该只用 php 完成还是需要使用一些 bash?我不清楚如何构建脚本。谢谢。

【问题讨论】:

    标签: php mysql datetime timestamp


    【解决方案1】:

    为什么要维护一个额外的标志列?您可以即时计算状态

    SELECT *
      FROM table_name
    WHERE expire_date > NOW()
    

    这将只返回未过期的行

    如果您需要将状态生成为列,您可以这样做

    SELECT *, (expire_date > NOW()) status
      FROM table_name
    

    【讨论】:

    • 这就是问题所在。用户仍然可以登录,因为在 postfix 中,查询如下:SELECT 1 FROM virtual_users WHERE email='%s' 所以除非有状态列,否则用户仍然可以登录。但我可以将 AND status='1' 附加到 postfix 查询中。这样,如果该用户已过期(我需要将其设置为 0),那么该用户将实际上无法登录
    • 那么你应该可以添加AND expire_date > NOW()而不是AND status='1'
    • 多么出色而简单的答案。我什至从来没有想过这一点。感谢像你这样的人,这就是我学习和变得更好的方式。非常感谢!
    • 好吧,我确实在 mysql 中尝试过这个查询>,它确实返回了一个我想要的空集,但是当我将 AND expire_date > NOW() 添加到我的后缀查询并重新启动后缀时,它似乎没有我预期的结果。给定的用户仍然可以登录。我缺少什么吗?
    • 我不是 postfix 专家,但如果查询在 mysql 客户端中为您提供正确的结果,那么查询本身就是正确的。因此,问题很可能在于您在 postfix 中配置它的方式。
    猜你喜欢
    • 2016-02-13
    • 2013-01-10
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2012-02-12
    • 2015-11-19
    相关资源
    最近更新 更多