电子邮件已经在数据库中,就像它不是一样返回

时间:2015-06-19 02:35:35

标签: php mysqli registration

以下是我在这里尝试做的一些背景信息。我正在尝试为我的网站创建一个注册表单(到目前为止成功到此为止)。可以将数据输入DB。我现在唯一要做的就是防止将重复的电子邮件/用户名输入数据库。通过大量的stackoverflow研究,我发现并测试了以下代码:

$query = "SELECT COUNT(*) AS num_rows FROM users WHERE email = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $email);

if ($stmt->execute()) {
    return $stmt->num_rows;
}

接下来我要做的是:

if(user_exists($user_email) > 0) {
    echo "Email already exists!";
}

但是这个if语句会传递,好像电子邮件确实存在于数据库中一样! 我正在尝试输入的电子邮件,我的测试是testemail@testemailweb.com已经在数据库中!有人可能会指出我的代码搞砸了吗?在尝试执行此操作时,我可能会遇到一个愚蠢的错误吗?

3 个答案:

答案 0 :(得分:2)

此处针对您的特定问题的解决方法是不使用John提到的COUNT(*)而不依赖mysqli_stmt->num_rows使用缓冲结果集:

$query = "SELECT * FROM users WHERE email = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $email);

return $stmt->execute() && $stmt->store_result() && $stmt->num_rows > 0;

附录

  

我现在唯一想做的就是防止将重复的电子邮件/用户名输入数据库

您将希望使用表约束来防止这种情况(不仅仅是来自应用程序,还有其他可以访问数据库的东西)。这有防止竞争条件的额外好处。

ALTER TABLE users ADD UNIQUE(email);

如果您尝试插入包含已存在的电子邮件值的行,则会引发错误。您可以在应用程序端检查此错误,并使用它执行任何操作。

答案 1 :(得分:1)

您的查询将始终返回1行。 COUNT(*)将返回结果集,即使只报告没有与您的查询匹配的行。因此,user_exists() 总是返回1

将您的查询更改为:

$query = "SELECT * FROM users WHERE email = ?";

现在,如果没有符合您的查询$stmt->num_rows的行0,那么user_exists()将返回0

答案 2 :(得分:0)

变化:

if ($stmt->execute()) {
    return $stmt->num_rows;
}
What I then do is following:

if(user_exists($user_email) > 0) {
    echo "Email already exists!";
}

$j=0;
if ($stmt->execute()) {
    $j= $stmt->num_rows;
} else {
    echo "Email already exists!";
}