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

Php 注册页面、电子邮件或密码存在检查,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我已经用PHP编写了一个注册页面,使用了预先准备好的语句。我的问题相当简单。当用户注册时,我想确保他们没有使用与其他人相同的用户名或电子邮件注册。因此,作为验证过程的一部分,我运行了两个查询,一个用于检查电子邮件是否存在,另一个用于检查用户名是否存在。我的问题是,有没有更好的方法?我觉得运行多个查询可能会牺牲一些性能。这样的查询会显著影响性能吗?我意识到我可以运行“SELECT*FROM table WHERE username=?或email=?”,,但我希望用户知道他们出了什么问题,而不仅仅

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

使用或运行您的查询,并检查返回的结果以报告您的确切发现


然而,根据数据库内部结构和索引,两个单独的查询可能比一起使用OR更快。您最好对所有案例(发现一个、发现两个、发现一个)进行基准测试,以获得有关您环境的明确答案。

您的查询很好;您将有1或2个结果;2如果注册仅存在电子邮件或昵称;1如果注册有电子邮件和昵称;使用JS并在输入字段右侧指定原因好吧,我想这是最简单的方法:

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) 如果行数>0,则显示结果的dup_用户名标志


这是我的玩法。

我认为这对性能没有坏处

若您有select查询,该查询从表中获取一行;让我们说几千行;那么影响就不提了

影响性能的是连接查询,它需要大量的资源,而这在您的案例中并没有发生

我相信单独使用它是安全的,我们一直在我们的网站上这样做,目前有超过一百万的用户

还可以尝试在mysql服务器中运行此查询,看看这需要多长时间(特别是对于更复杂的查询)


这对您的目的有何意义?

在保存用户信息的数据库中,用户名和电子邮件实体是唯一的。就像主键一样。

你可以单独检查它们,但这对性能不好。你能证明你说的是正确的吗?编辑:不是故意粗鲁,只是想知道为什么它会慢一些。是因为我两次连接MySQL吗?这是否有效地花费了双倍的时间?如果此查询返回1,则可以首先运行query
select*from table where username=?
,这样username就已经被使用了。如果它返回0条注释,您可以检查电子邮件。这对性能不利,因为您必须运行两个查询,而不是一个。很高兴我从这个问题中得到了如此好的回答。我会把它留一小会儿,看看我是否能收集到更多有助于我做出决定的有用意见。我可能会花更多的时间来研究什么样的选择比改变系统所需的时间要快,但是它对未来的宝贵知识:)。啊。因此,不只是依赖返回的行数,而是实际分析数据?通过在else语句中检查电子邮件,这不意味着只有在用户名有效的情况下才会检查电子邮件吗?新用户完全可以使用现有用户名以及其他用户的现有电子邮件进行注册。这意味着他们必须提交两次表格。是的,第一部分是正确的,但如果用户名无效,它将被踢出,否则它将检查电子邮件,如果这是坏的,它也将踢出。检查我的编辑以查看替代方案。目前我正在使用我编写的一个简单模板引擎,但我明白你关于JS的观点。我所做的将有效地做同样的事情,但在表格的顶部是红色的。希望它尽可能明显。再加上登记表很小,只有几条输入。我喜欢这个。有很多因素需要考虑,例如将使用更多的资源运行两个查询或用IF语句分析查询。我在这里考虑了很多。我认为我的问题比实际情况简单。据我所知,SELECT子句中的CASE/IF语句将仅应用于结果集(已通过“WHERE”过滤)——换句话说,如果表受到适当约束,则应用于一行或零行。所以我不认为它会更慢:不过,在巨大的数据库上检查它以证明或破坏它会更好。)问题是,我认为在我的数据库中只包含少量虚拟内容的情况下尝试查询是无用的。我必须把它填上几十万行,然后看看它是怎么回事,但这仍然不是对现实生活场景的一种精确的背离。该网站的用户可能永远不会超过100000。正如我在回答中所说的,你的查询是安全的…它不会影响你的网站或减慢它的速度。。。。查询是为了使用它(你所关心的远不是什么让事情变得糟糕或混乱),所以放松:)用户名和电子邮件都被索引了。因此,唯一索引将不起作用。就我所知,用户名和电子邮件都可以是唯一的;OP只是想知道其中哪些是(潜在的)重复的。
    $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;
    }