gpt4 book ai didi

php - mysql_affected_rows() 解决方法?

转载 作者:行者123 更新时间:2023-11-29 00:50:21 24 4
gpt4 key购买 nike

我将此代码用作电子邮件确认脚本的一部分。它工作得很好,除了我想不出一种方法来区分某人何时提供了无效的电子邮件地址与何时他们只是刷新了页面(即已经确认了他们的帐户)。我唯一能想到的就是在始终更新的 users 表中放置一个时间戳字段,但我希望有更好的方法。我认为 REPLACE 可以解决问题,但是,虽然 email 是唯一的,但它不是主键。

if (isset ($email, $token, $correctToken)){    
$success = FALSE; //Set the $success variable so that we don't get an error when testing for it later
if ($token == $correctToken) {
$confirm = mysql_query("UPDATE users
SET conf = 'TRUE'
WHERE email = '$email'");
if (mysql_affected_rows() == 1) {
echo "Thank you! Your email address is confirmed and your account is actived.";
$success = TRUE;
}
}
if (!$success) {
echo "There was a problem with the confirmation. Try the link in your email again or contact us at Support@WiseRenters.com";
// Send email to admin to notify of error
exit;
}
}

提前感谢您的建议!比利

编辑:$email$token 变量是通过 $_GET 或 $_POST 提供的,以防不明显。

最佳答案

重定向会阻止他们刷新 - 但如果他们再次单击电子邮件中的链接怎么办?

您应该检查当前用户是否已激活。

$sql = "SELECT id, conf FROM users WHERE email = '{$email}'";
$exec = mysql_query($sql) or die(mysql_error());
list( $id, $conf ) = mysql_fetch_row($exec);

if( $conf ) {
// Redirect them to their profile with a message saying "your account has already been activated"
header("Location: /profile?already_activated");
exit;
}

// your code
$confirm = mysql_query("UPDATE users
SET conf = 'TRUE'
WHERE id = '{$id}'");

回应您的评论:

请记住,这只会为尚未激活的用户添加一个额外的查询。如果它们已激活,则会发生重定向,并且该页面仍仅运行 1 个查询。

要稍微优化一下,您可以根据电子邮件地址选择用户 ID 和确认状态。然后,如果确实需要激活它们,您可以根据用户 ID 而不是电子邮件来激活它们。由于整数键要快得多,因此 2 个查询的组合时间将与您基于字符串列更新的 1 个查询大致相同。我更新了代码以反射(reflect)这一点。

此外,此页面可能不会被频繁访问。此处的任何优化实际上都是微观的,并没有那么大的帮助。

顺便说一下,我希望您在电子邮件中使用 mysql_real_escape_string,并且 conf 是 bool 值 true/false 而不是字符串“true”/“false”。

关于php - mysql_affected_rows() 解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com