我使用预处理语句在PHP中编写了一个注册页面。我的问题很简单。当用户注册时,我想确保他们没有使用与其他人相同的用户名或电子邮件进行注册。因此,作为验证过程的一部分,我会运行两个查询,一个用于检查电子邮件是否存在,另一个用于检查用户名是否存在。我的问题是,有更好的方法吗?我觉得运行更多的查询可能会以某种方式牺牲一些性能。性能是否会受到这种查询的显着影响?我意识到我可以运行"SELECT * FROM table WHERE username = ? or email = ?",
,但我希望用户知道他们出了什么问题,而不仅仅是一个通用的“当前正在使用您的用户名或电子邮件,请随意使用试验和错误来查找它是”。可能我只是对速度感到偏执,但我只是想知道其他人对此事的看法。
答案 0 :(得分:3)
使用OR运行查询并检查返回的结果以报告您找到的确切内容。
但是,根据数据库内部和索引,两个单独的查询可能比OR一起更快。您可以更好地对所有案例进行基准测试(找到一个,找到两个,找不到),以获得有关您环境的明确答案。
答案 1 :(得分:2)
在您保存用户信息的数据库中,使用户名和电子邮件实体是唯一的。像主键一样。
答案 2 :(得分:0)
你的查询很好;你将得到1或2个结果; 2如果仅存在电子邮件或仅有昵称的注册; 1如果注册有电子邮件和昵称;使用JS并在输入字段右侧指定原因
答案 3 :(得分:0)
嗯,我想这是最简单的方法:
SELECT IF(username = :username_to_check, 1, 0) AS dup_username
FROM users
WHERE username = :username_to_check OR email = :email_to_check
然后检查:1)行数 - 如果为0,则没有找到重复项; 2)结果的dup_username标志,如果行数> 0.
这里是an example。
答案 4 :(得分:0)
我认为这不利于表现
如果你有从表中获取一行的select查询;让我们说千行;然后根本没有提到影响..
您的表现会加入查询,这需要大量资源,这些资源在您的情况下不会发生......
我认为单独使用它是安全的,我们一直在我们的网站上进行,目前有超过一百万用户
也尝试在你的mysql服务器中运行这个查询,看看这需要多长时间(特别是对于更复杂的查询)
答案 5 :(得分:0)
$result = mysql_query("SELECT * FROM table1 WHERE Username = ''", $link);
$num_rows = mysql_num_rows($result);
$result2 = mysql_query("SELECT * FROM table1 WHERE Email= ''", $link);
$num_rows2 = mysql_num_rows($result2);
$checkUsrN = false;
$checkEmail = false;
$mesg = "The following is bad: ";
if($num_rows == 0)
{
$checkUsrN = true;
}
else{
$mesg .= "Username";
}
if($num_rows2 == 0)
{
$checkEmail = true;
}
else{
$mesg .= "Email";
}
if($checkUsrN == false || $checkEmail == false)
{
echo $mesg;
break;
}
这是怎么回事?