2014-06-25 41 views
1

我有一个来自Stripe的webhook用于更改用户电子邮件地址。仅在需要更新MySQL行时

我想让它可以在Stripe网站上进行更改,并将其传送到我的网站,反之亦然。

是怎么回事,现在是: 用户改变电子邮件的网站,网站更新电子邮件在MySQL中,发送信息,以条纹,条纹启动网络挂接,网络挂接再次无故更新的电子邮件。

我想解决这个问题的方法是让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, 
)); 

我也接受其他建议。

+3

我认为这是默认行为 – Fabricator

+0

虽然你试图做的是正确的,我也可能会尝试做到这一点,你认为你会保存服务器每月/每年做多少个查询? – jeroen

+0

正如@Fabricator所说,这就是你已经在做的事情。此外,增加一个单独的步骤来检查数据是否需要更新实际上会增加数据库服务器上的负载,而不是减少它。 –

回答

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, 
)); 

这样至少可以防止相同的值的覆盖(尽管优化器可能会为你做这个而不管)。