管理注册网站的Cron工作的最佳方式

时间:2010-10-19 18:21:08

标签: php mysql datetime cron

我管理的注册网站需要为我们的代理商提供一些新功能。我们要完成的工作如下:

  • 每3名会员和代理人 入学时,他收到一张礼品卡 (电子邮件发送给管理员邮寄 出)
  • 一个月内10个月的入学人数 代理人接受他/她的营销 材料免费一年 (我们的数据库中的标志更改)
  • 任何时候总共25个注册人数, 代理人接受他/她的营销 材料免费使用一年

我在创建符合条件后发生的操作时没有问题(只需运行cron job的php脚本)。

然而,我面临的问题是与我的团队其他成员的意见分歧。在每次注册结束时,会使用许多变量创建成员注册记录,包括memberID和agentID。

基本上,他们希望根据给定agentID在一段时间内的记录总数来查询成员注册表中的cron作业。然而,我看到的问题是,cron作业不知道要查找什么或如何在循环中处理操作。

例如,让我们假设我们的表看起来像这样(简化,第一行中的标题):

memberid     agentid     date_enrolled
12345       7           2010-10-17 12:00:00
39283       3           2010-10-17 12:00:00
33839       4           2010-10-17 12:00:00
44848       7           2010-10-18 12:00:00
38383       5           2010-10-17 12:00:00
38383       7           2010-10-19 12:00:00

基于上述情况,如果运行每周一次的cron作业,它会发现AgentID 7应该是礼品卡,因为他在本周注册了3名成员。如果我从单个查询角度来看这个问题,那么构建没有问题,但是因为我们有超过300个代理并且信息可能差别很大,我不知道“所需方法”是否有效。

如果是我的方式,我每次发生注册时我都会用计数器构建一个新表,然后只需创建一个chron作业,一旦时间障碍通过就清除整个列(每个一周,清除第2列并重新启动计数器,每个月,清除第3列并重新启动计数器)。

有没有办法以我们团队想要的方式构建脚本和cron作业?

编辑1:

根据团队的要求,我相信我提出的SQL查询会有很长的路要走:

SELECT COUNT(AGENT) FROM tablename GROUP BY AGENT WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAY)

编辑2:

在这里没有得到很多的爱;)我决定让我的查询更加严格,但我很难解析出我最初认为很容易的结果。我需要将一个查询返回的结果用于另一个查询。

目标: 从注册数据大于7天前的tablename中选择all,按剂量编号大于3的组进行分组。返回结果后,更新上一个查询的结果集中返回的EACH代理记录的唯一标志字段。

我的初始代码是:

$sql = $db->query("SELECT * FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAYS) GROUP BY agentid HAVING COUNT(*) >= 3");
            $result = $sql->fetchALL(PDO::FETCH_ASSOC);
            foreach($result as $key=>$val) {
                echo $key.' - '.$val.'<br />';
            }

编辑3 - “最终”脚本?

<?php

    try {   
            $db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $db->beginTransaction();

            $sql = $db->query("SELECT AGENT FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 1 WEEK) GROUP BY AGENT HAVING COUNT(*) >= 10 ORDER BY enroll_date ASC");

            $result = $sql->fetchALL(PDO::FETCH_ASSOC);
            foreach($result as $key=>$val) {
                foreach($val as $ball=>$face) {
                    echo $ball." - ".$face.'<br />';

                    $sql2 = "UPDATE tablename2 SET bonus_set=?, method=? WHERE agentID = '$face'";

                    $stmt = $db->prepare($sql2);
                    $stmt->execute(array("Y", "free"));


                    //NEED TO FIGURE OUT HOW TO EMAIL THE ENTIRE LIST TO MYSELF next...

                }

            }       

            $db->commit();
            $db->null;
            exit;
        }

    catch (PDOException $e)
        {
            $db->rollback();
            echo $e->getMessage();

            exit;
        }
?>

1 个答案:

答案 0 :(得分:0)

建议的查询可以正常工作,只需将GROUP BY AGENT移动到最后即可进行微小的更改。第二和第三条规则将采用相同的模式。

您可以在单独的表格(代理人,奖励,日期)中跟踪奖励,以避免像Mon-Sun有资格的情况,再到Tues-Mon的再次计算(重复计算重叠日期)。可以在这些表上运行联接,也可以只是单独的查询,以查看代理是否已在过去七天内获得礼品卡,等等。