【问题标题】:How to validate username using Javascript?如何使用 Javascript 验证用户名?
【发布时间】:2010-05-15 21:56:26
【问题描述】:

我想知道如何使用 Javascript 验证用户在创建帐户时输入的任何用户名是否已经存在于数据库中并要求用户输入任何其他用户名?

【问题讨论】:

  • 简答;只有javascript:你不能
  • 那么是什么阻止某人在客户端 javascript 检查后使用 tamperdata 发布自己的用户名?
  • @The Rook:这是一个不错的观点,但不言而喻,客户端检查不应该是任何事情的最后一道防线。这并不意味着不应该有客户端验证。它对用户有帮助,而不是为了数据完整性。

标签: javascript ajax validation


【解决方案1】:
  1. <input /> 元素附加blur 事件的侦听器。
  2. 使用 AJAX 向服务器发送请求(以字段值作为参数)
  3. 在服务器端检查给定的用户名是否已被使用
  4. 基于服务器的响应显示(或不显示)此用户名已在使用中消息

jQuery(纯JS懒得做)+PHP示例代码:

<form ...>
    ...
    <input type="text" name="username" id="input-username" />
    <p class="error"></p>
    ...

$("#input-username").blur(function() {
    $.post("/check-username.php", { username: $(this).val() }, function(data) {
        if ("0" == data) { /* username in use */
             $(this).next("p").text("This username is already in use.</p>");
        } else {           /* username is fine */
             $(this).next("p").empty();
        }
    });
});

<?php

$username = $_POST['username'];

// check whether given username exists in database
$usernameExists = ...;

echo $usernameExists ? '0' : '1'; // 0 if exists, 1 if not.

【讨论】:

    【解决方案2】:

    答案是 AJAX。如果您必须针对数据库进行验证,则需要调用服务器。在不重新加载页面的情况下这样做(EDIT: 正确)的唯一方法是 AJAX。您如何实现它取决于您使用的 JavaScript 库(如果有的话)以及您的服务器是什么样的。我建议您对其进行一些搜索和阅读 - 这是一个非常常见的用例。

    【讨论】:

    • 不重新加载页面的唯一方法是 AJAX。 嗯...从技术上讲,AJAX 不是唯一的解决方案,但它是唯一值得考虑的解决方案。
    • @Crozin:确实如此。你可以做一些事情,比如用页面加载每个用户名,或者只是 AJAX 风格的事情,比如古怪的 iframe。有无数种错误的方法可以做到这一点。
    【解决方案3】:

    就个人而言,我会使用 JQuery 验证插件来简化操作。 http://bassistance.de/jquery-plugins/jquery-plugin-validation/

    但一般情况下,它会包含一个使用用户名对服务器(即 JSON 对象)的小型 AJAX 请求,并在您的数据库中进行“搜索”,并在用户按 Enter 或选项卡后返回真/假文本字段(附加事件侦听器)。然后在您的回调响应中更改您选择的 DOM 元素,以向您的用户指示帐户名称是否已存在于数据库中。

    【讨论】:

      【解决方案4】:

      Ajax 可能不是唯一的解决方案,因为用户名通常是公开的。一种简单的方法是在某个时间点拥有一个 RDF/XML 文档(它会随着每个新用户的添加而更新),其中包含您网站上所有用户的列表,您可以轻松地使用 Javascript DOM 遍历该列表以查看该用户是否已在使用中。你也让他们支付计算能力,而不是你,这取决于你有多好,这是优势还是劣势。

      【讨论】:

      • 可能,但这个解决方案非常糟糕。这是 O(n) 的搜索成本、巨大的带宽成本、大量昂贵的文档更新(资源争用)等。相比之下,最佳解决方案使用的带宽要少得多,而且速度更快、效率更高。跨度>
      • 文档更新是一个空参数,XML文件显然会在每次请求时动态生成,也可以用于其他原因,这就是我建议RDF/XML的原因,就像我输入的这个页面一样。带宽也低于预期。一个专门的 RDF 文件用于容纳该社区的所有用户名,其大小约为显示该页面所需加载的字符大小的 1/4。
      • 除了性能差之外,这实际上与是否使用 AJAX 是正交的。您可以使用 AJAX 或其他解决方案(例如隐藏 iframe)进行直接查找 (/isUsernameTaken?username=foo) 或访问 XML 文档 (/allUserNames.xml)。
      • @Lajla:甚至没有接近。 SO上的用户数是此页面中的字节数的几倍。如果您每次都动态生成 xml 文件,那么您实际上是在为您的数据库增加更多负载,而不是更少。
      • @Lajla:不,不是 490kb,而是 49kb。如果我们假设每个用户名大约有 8 个字符(还有更多),那么这个列表将远远超过一兆字节。而且由于数据库索引的执行方式,在索引字段上输出一个匹配项比输出所有记录要快得多。你还有很长的路要走。
      猜你喜欢
      • 2018-07-14
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2018-06-20
      相关资源
      最近更新 更多