【发布时间】:2018-01-27 13:58:37
【问题描述】:
我有一个 cron 作业,它查看表格并相应地发送电子邮件。
表格非常简单,只需:
- cronid(自增主键id)
- groupid(用户所在组的id)
- 已发送(默认为0,cron-job运行后将更新为1)
脚本(如下)查找所有带有sent = 0 的行并循环发送电子邮件。
//find all instances of a hunch being submitted that haven't yet had notification emails sent, and loop thru and send emails
$stmt = $pdo->prepare("SELECT cronid, groupid FROM cron_email_notify WHERE sent = 0 ");
$stmt->execute();
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
$cronid=$row['cronid'];
$groupid=$row['groupid'];
//phpmailer stuff to actually send emails goes here, not relevantto this question
//update cron_email_notify table's sent field to 1, so we know not to send again
$stmt = $pdo->prepare("UPDATE cron_email_notify SET sent = 1 WHERE groupid = ?");
$stmt->execute([$groupid]);
}
我有 4 个条目与 sent=0 相同的组号,所以我假设上面的代码将发送第一封电子邮件,然后最后一个查询将使用该组号更新所有其他行以具有 sent = 1,因此它不会发送其他 3。但我测试并发送了 4 封单独的电子邮件。
我花了一分钟才意识到(我知道,非常愚蠢)原始查询和 foreach 循环会立即找到所有 4 行,然后我们会循环遍历这 4 行,而不管循环期间所做的任何更改。因此,即使我在发送第一封电子邮件后将其他 3 行的 sent 更新为 1,它仍将完成对原始查询结果的循环(即所有 4 行)并发送 4 封电子邮件。
所以我现在的问题是,我如何设置它来搜索所有具有 sent = 0 但每个组号仅发送一封电子邮件的行。我在想也许我在原始查询中使用 GROUP BY 或 UNIQUE ?我在正确的轨道上吗?
【问题讨论】: