我有一个来自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,
));
我也对其他建议持开放态度。
答案 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,
));
这至少可以防止覆盖相同的值(尽管优化器可能会为您执行此操作)。