仅在需要时更新MySQL Row

时间:2014-06-25 17:25:05

标签: php mysql stripe-payments

我有一个来自Stripe的webhook用于更改用户的电子邮件地址。

我希望能够在Stripe网站上更改它并将其转移到我的网站,反之亦然。

现在的情况是: 用户在网站上更改电子邮件,网站更新mysql中的电子邮件,向Stripe发送信息,Stripe发起webhook,webhook无缘无故再次更新电子邮件。

我正在考虑解决此问题的方法是让webhook mysql查询仅在值实际发生变化时再次更新电子邮件(也就是说,仅当我通过Stripe仪表板更新电子邮件时)。

是否有人知道如何将此查询转换为仅在电子邮件不同时运行的内容?

$update_email = $dbh->prepare("UPDATE `users` SET `email` = :email WHERE id = :id");
$update_email->execute(array(
    ':email'   => $new_email,
    ':id'   => $user_id,
));

我也对其他建议持开放态度。

1 个答案:

答案 0 :(得分:1)

您可以在尝试更新之前先阅读该电子邮件,以确定是否会更改该值,这比更新更便宜。存在竞争条件,该值已更改为您在阅读和更新之间寻找的值。无论如何,我不确定你在基于主键的更新中购买了多少。

然而,对您开放的一个优化是使更新以电子邮件值为条件,即

$update_email = $dbh->prepare("UPDATE `users` SET `email` = :email WHERE id = :id AND email <> :email");
$update_email->execute(array(
    ':email' => $new_email,
    ':id'    => $user_id,
));

这至少可以防止覆盖相同的值(尽管优化器可能会为您执行此操作)。