我有一份工作,负责查看桌子,并相应发送电子邮件。
这张桌子非常简单,只有:
脚本(下面)查找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但每个组编号只发送一封电子邮件的行。我在想,也许我在原始查询中使用组BY或唯一的?我在正确的轨道上吗?
发布于 2017-08-18 19:58:52
你走在正确的轨道上。
向第一个查询添加一个GROUP BY
$stmt = $pdo->prepare("SELECT cronid, groupid FROM cron_email_notify WHERE sent = 0 GROUP BY groupid");然后,在循环中的查询中,向WHERE语句添加另一个条件,以确保没有更新已准备好的记录。
$stmt = $pdo->prepare("UPDATE cron_email_notify SET sent = 1 WHERE groupid = ? AND sent = 0");我不知道您多长时间运行一次cron作业,但是您现在的方式可能是更新稍后在检索它们时添加的记录。
https://stackoverflow.com/questions/45764139
复制相似问题