首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止循环向每个结果行发送电子邮件?

如何防止循环向每个结果行发送电子邮件?
EN

Stack Overflow用户
提问于 2017-08-18 19:52:14
回答 1查看 183关注 0票数 0

我有一份工作,负责查看桌子,并相应发送电子邮件。

这张桌子非常简单,只有:

  • cronid (自动增量主键id)
  • 群(用户所在组的id)
  • 发送(默认情况下为0,将在cron作业运行后更新为1)

脚本(下面)查找sent =0的所有行,并循环发送电子邮件。

代码语言:javascript
复制
//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但每个组编号只发送一封电子邮件的行。我在想,也许我在原始查询中使用组BY或唯一的?我在正确的轨道上吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-18 19:58:52

你走在正确的轨道上。

向第一个查询添加一个GROUP BY

代码语言:javascript
复制
$stmt = $pdo->prepare("SELECT cronid, groupid FROM cron_email_notify WHERE sent = 0 GROUP BY groupid");

然后,在循环中的查询中,向WHERE语句添加另一个条件,以确保没有更新已准备好的记录。

代码语言:javascript
复制
$stmt = $pdo->prepare("UPDATE cron_email_notify SET sent = 1 WHERE groupid = ? AND sent = 0");

我不知道您多长时间运行一次cron作业,但是您现在的方式可能是更新稍后在检索它们时添加的记录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45764139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档