php - 如何将 mysql UPDATE 限制为仅在 for 循环中处理的行?

标签 php mysql email cron

我有一个网络应用程序,每次用户提交表单时都会发送 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/

相关文章:

PHP 7, fatal error : Constant expression contains invalid operations

php - 无法使用 mysqli 创建过程,但可以使用 phpmyadmin?

php - mysql 一个依赖于另一个

php - 将对象添加到数组 - 覆盖而不是添加

PHP - 基于数据库查询发送电子邮件至电子邮件地址

codeigniter - 使用CodeIgniter发送电子邮件时出错

php - Laravel:对 View 的查询进行分页 MySQL 错误 1140 Mixing of GROUP columns

php - 如何将 DOM 对象作为 JSON 对象发送

php - Android 不显示特殊字符

ruby - 邮寄 gem : how to set an email to "read"?