以下是我在这里尝试做的一些背景信息。我正在尝试为我的网站创建一个注册表单(到目前为止成功到此为止)。可以将数据输入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
已经在数据库中!有人可能会指出我的代码搞砸了吗?在尝试执行此操作时,我可能会遇到一个愚蠢的错误吗?
答案 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!";
}