Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';创建AJAX用户名验证处理程序的最佳方法是什么?_Php_Ajax - Fatal编程技术网

Php 什么';创建AJAX用户名验证处理程序的最佳方法是什么?

Php 什么';创建AJAX用户名验证处理程序的最佳方法是什么?,php,ajax,Php,Ajax,我正在开发一个社交网站,并对前端进行改进 我正在实现的改进之一是聊天名称的AJAX验证程序。设置如下: 访问者进入注册页面,并在字段中键入所需的聊天名称。输入时,用户会得到即时反馈,询问该聊天名称是否已被使用、是否包含非法字符、长度是否错误等 我已经实现了这一点:我已经设置了一个简单的PHP脚本作为AJAX处理程序,它绑定到输入的onkeyup和blur事件。但是,每个请求都涉及一个数据库查询,这不太好 我的问题是:我怎样才能简化这个过程?当然,对每个onkeyup或blur进行数据库查询不是一

我正在开发一个社交网站,并对前端进行改进

我正在实现的改进之一是聊天名称的AJAX验证程序。设置如下:

访问者进入注册页面,并在字段中键入所需的聊天名称。输入时,用户会得到即时反馈,询问该聊天名称是否已被使用、是否包含非法字符、长度是否错误等

我已经实现了这一点:我已经设置了一个简单的PHP脚本作为AJAX处理程序,它绑定到输入的
onkeyup
blur
事件。但是,每个请求都涉及一个数据库查询,这不太好

我的问题是:我怎样才能简化这个过程?当然,对每个
onkeyup
blur
进行数据库查询不是一个好主意吗?

我推荐以下(基于时间的)策略:

  • 钥匙点火
  • 取消超时(如果此时正在运行)
  • 开始新的超时(500-1000毫秒)
  • 超时过期时执行请求
  • 这样,每当用户停止键入至少500-1000毫秒时,您就可以执行请求。这样可以在用户仍在键入时为您节省一些请求。您可以在触发模糊事件时立即启动请求,因为用户显然不再键入任何内容

    500毫秒的示例(使用jQuery):

    var timeout = null;
    
    var stopTimeout = function () {
        // step 2: stop running timeout
        if (timeout !== null) {
            clearTimeout(timeout);
            timeout = null;
        }
    };
    
    var doRequest = function () {
        // step 4: do request
    };
    
    // step 1: event fires
    $('input').keyup(function () {
        stopTimeout();
        // step 3: start new timeout
        timeout = setTimeout(doRequest, 500);
    }).blur(function () {
        stopTimeout();
        doRequest();
    });
    
    正如其他人所说,检查无效字符等应在客户端和服务器端进行,因为您不能信任客户端。

    我建议采用以下(基于时间的)策略:

  • 钥匙点火
  • 取消超时(如果此时正在运行)
  • 开始新的超时(500-1000毫秒)
  • 超时过期时执行请求
  • 这样,每当用户停止键入至少500-1000毫秒时,您就可以执行请求。这样可以在用户仍在键入时为您节省一些请求。您可以在触发模糊事件时立即启动请求,因为用户显然不再键入任何内容

    500毫秒的示例(使用jQuery):

    var timeout = null;
    
    var stopTimeout = function () {
        // step 2: stop running timeout
        if (timeout !== null) {
            clearTimeout(timeout);
            timeout = null;
        }
    };
    
    var doRequest = function () {
        // step 4: do request
    };
    
    // step 1: event fires
    $('input').keyup(function () {
        stopTimeout();
        // step 3: start new timeout
        timeout = setTimeout(doRequest, 500);
    }).blur(function () {
        stopTimeout();
        doRequest();
    });
    

    正如其他人所说,检查无效字符等应该在客户端和服务器端进行,因为您不能信任客户端。

    检查有效用户名是唯一的方法,因为它需要进入您的数据库。我建议将检查无效字符的逻辑放入javascript中,然后只检查可用且有效的用户名onblur,这样,您只需在用户每次单击该字段时发出请求


    当然,尽管将验证放在js中,但仍然应该在php中检查验证,检查有效用户名是唯一的方法,因为它需要进入数据库。我建议将检查无效字符的逻辑放入javascript中,然后只检查可用且有效的用户名onblur,这样,您只需在用户每次单击该字段时发出请求

    当然,尽管将验证放在js中,您仍然应该在php中检查它

    所有验证(非法字符、长度等)都应该在客户端完成,并且在提交表单之前不需要运行服务器端

    可以通过ajax实时检查用户名。除非你有一个非常慢的服务器或大量的用户,否则它应该是好的

    从可用性的角度来看,我并不真正建议使用模糊,而是使用键控或让用户单击字段旁边的链接/按钮

    用户不一定知道他们触发了模糊(特别是如果模糊是由于聚焦到另一个字段而发生的),因此如果ajax返回用户名错误,他们可能无法确定如何再次重复检查。而是让他们清楚地知道他们是如何触发ajax的。

    所有验证(非法字符、长度等)都应该在客户端完成,并且在提交表单之前不需要在服务器端运行

    可以通过ajax实时检查用户名。除非你有一个非常慢的服务器或大量的用户,否则它应该是好的

    从可用性的角度来看,我并不真正建议使用模糊,而是使用键控或让用户单击字段旁边的链接/按钮


    用户不一定知道他们触发了模糊(特别是如果模糊是由于聚焦到另一个字段而发生的),因此如果ajax返回用户名错误,他们可能无法确定如何再次重复检查。而是让他们明白他们是如何触发ajax的。

    多亏了@elusive,我想出了以下解决方案:

    jQuery.fn.inlineValidation = function() {
        return this.each(function() {
            var input = $(this);
            var timeoutId = 0;
            $(this).bind('keyup', function() {
                clearTimeout(timeoutId);
                timeoutId = setTimeout(function() {
                    var value = input.val();
                    $.getJSON('/ajax/user_name.php', { 'user_name': value }, function(data) {
                        if (data.success === true) {
                            input.next('.form_feedback').removeClass('error').addClass('success').text(data.message);
                        } else {
                            input.next('.form_feedback').removeClass('success').addClass('error').text(data.message);
                        }
                    });
                }, 1000);
            });
        });
    };
    

    多亏了@elousive,我想出了以下解决方案:

    jQuery.fn.inlineValidation = function() {
        return this.each(function() {
            var input = $(this);
            var timeoutId = 0;
            $(this).bind('keyup', function() {
                clearTimeout(timeoutId);
                timeoutId = setTimeout(function() {
                    var value = input.val();
                    $.getJSON('/ajax/user_name.php', { 'user_name': value }, function(data) {
                        if (data.success === true) {
                            input.next('.form_feedback').removeClass('error').addClass('success').text(data.message);
                        } else {
                            input.next('.form_feedback').removeClass('success').addClass('error').text(data.message);
                        }
                    });
                }, 1000);
            });
        });
    };
    

    我的想法是,当他们离开这个领域时,应该进行最后一次用户名检查,告诉用户,“嘿,你留下的这个用户名是无效的。”此外,这是一个相当大的网站:它已经有100000名成员,并且正在增长。看看雅虎的注册情况。有一个“检查”按钮,你按下,它会进行检查,并返回基于用户名的可选选项。它不会模糊字段,但需要用户单击按钮。gmail注册也是如此。我的想法是,当他们离开这个领域时,应该进行最后的用户名检查,告诉用户,“嘿,你留下的这个用户名是无效的。”此外,这是一个相当大的网站:它已经有10万名会员,并且正在增长。看看yahoo注册。有一个“检查”按钮,你按下,它会进行检查,并返回基于用户名的可选选项。它不会模糊字段,但需要用户单击按钮。gmail注册也是这样。