注册页面,电子邮件或密码存在检查

时间:2012-07-03 11:42:02

标签: php mysqli prepared-statement

我使用预处理语句在PHP中编写了一个注册页面。我的问题很简单。当用户注册时,我想确保他们没有使用与其他人相同的用户名或电子邮件进行注册。因此,作为验证过程的一部分,我会运行两个查询,一个用于检查电子邮件是否存在,另一个用于检查用户名是否存在。我的问题是,有更好的方法吗?我觉得运行更多的查询可能会以某种方式牺牲一些性能。性能是否会受到这种查询的显着影响?我意识到我可以运行"SELECT * FROM table WHERE username = ? or email = ?",,但我希望用户知道他们出了什么问题,而不仅仅是一个通用的“当前正在使用您的用户名或电子邮件,请随意使用试验和错误来查找它是”。可能我只是对速度感到偏执,但我只是想知道其他人对此事的看法。

6 个答案:

答案 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;
    }

这是怎么回事?