我有一个网络应用程序,每次用户提交表单时都会发送 btw 1 和 20 封通知电子邮件。用户将已经在一个组中(他们将有一个 groupid
号码)并且该组中的所有人都会收到一封通知电子邮件。
注意:我正在通过 Amazon SES 使用 PHPMailer 和 SMTP 发送电子邮件。
背景:如果有 10 封以上的电子邮件,在向用户显示“表单提交成功”消息之前发送大约需要 5 秒。
所以我决定在后台发送电子邮件以改善用户体验,使用每分钟运行一次的 cron 作业。
我创建了一个名为“cron_email_notify”的简单附加 mysql 表,其中仅包含以下字段:
groupid
(用户所在组的id)sent
(默认为0,cron-job运行后会更新为1)
在可能每分钟运行一次的 cron 脚本中,我搜索所有将 sent
设置为 0 的 groupid
(这意味着他们仍然需要接收通知电子邮件) .我循环并发送电子邮件,并在每次循环后将 sent
更新为 1。
问题是,如果在 cron-job 运行之前来自同一组的超过 1 个用户提交表单,将有 2 个(或更多)具有相同 groupid
和 的条目发送
设置为0。
如果我随后使用下面的代码将该 groupid 的 sent
更新为 1,它将使用该 groupid
更新所有行。应该发送 3 或 4 封通知电子邮件时,只会发送一封通知电子邮件。
$stmt = $pdo->prepare("UPDATE cron_email_notify SET sent = 1 WHERE groupid = ? ");
$stmt->execute([$poolid]);
仅更新我正在循环的行的 groupid
的正确方法是什么?是否像在 UPDATE 查询末尾添加“LIMIT 1”一样简单?或者有更合适的方法吗?
最佳答案
如果我没理解错的话,你的表上没有设置主键。添加一个名为例如的新列mailId 并使其成为自增主键。每次更新一行时,使用该列来定义要更新的行
$stmt = $pdo->prepare("UPDATE cron_email_notify SET sent = 1 WHERE mailID = ? ");
$stmt->execute([$mailID]);
您可能还想跟踪邮件发送的日期/时间,例如将 sentTime 替换为 sentTime,使其成为整数(如果您想使用 UnixTime)或 DateTime。发送邮件后,将值设置为当前时间。未发送的邮件将具有默认值,或设置为 NULL(通过它可以找到它们)
另一种选择是检查 groupid 与 sent = 0 的组合是否已存在于表中。如果是这样,请不要插入...为什么要向该组发送两封邮件?
关于php - 如何将 mysql UPDATE 限制为仅在 for 循环中处理的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759036/