【问题标题】:How to implement autocomplete functionality using PHP, jQuery and AJAX in following scenario?如何在以下场景中使用 PHP、jQuery 和 AJAX 实现自动完成功能?
【发布时间】:2013-09-27 14:30:13
【问题描述】:

我的网站使用 PHP、Smarty、MySQL、jQuery 和 AJAX。现在场景如下: 我的表单上有三个字段。 smarty模板中这三个字段的代码如下:

<label>Class</label>
    <div class="form-element">
        <select name="class_id" id="class_id" onchange="get_section_by_class(this.value, 'get_section_by_class', '#section_id'); return false;">
            <option value="">-Select Class-</option> 
            {foreach from=$all_class item=class key=key} 
            <option value="{$class.group_id}" {if $class_id == $class.group_id} selected="selected"{/if}>{$class.group_name}</option>
            {/foreach}
         </select>
     </div>
<label>Section</label>
    <div class="form-element">
        <select name="section_id" id="section_id">
        {if empty($section_id)}
            <option value="">-Select Section-</option> 
        {else}
            <option value="all">All</option>
        {/if}
        {foreach from=$all_section_by_class item=section key=key} 
            <option value="{$section.group_id}" {if $section_id==$section.group_id} selected="selected"{/if}>{$section.group_name}</option>
        {/foreach}
        </select>
    </div>
<label>Name</label>
    <div class="form-element">
        <input type="text" class="" name="user_name" id="user_name" value="{$user_name}" />
    </div>

现在从上面的代码中,我想让名为 user_name 的字段自动填充。要显示为自动填充的值取决于从上述代码的其他两个选择控件中选择的值。也就是说,我想将控件 class_id 和 section_id 的值传递到 AJAX 请求中以获取用户名的自动填充列表。 为此,我编写了以下代码,但它对我不起作用。您能帮我启用名为 user_name 的文本字段自动完成功能吗?提前致谢。我的不可行的代码如下:

{literal}
<script language="javascript" type="text/javascript">
$(function() { 

  $("#user_name").autocomplete({ 
    source: function( request, response ) { 
        $.ajax({ 
          url: "report_student_result.php",
          data: {'request_type':'ajax', 'op':'get_student_names', 'class_id':request.class_id, 'section_id':section_id },
          dataType: "json",
          success: function( data ) {
            response( $.map( data.myData, function( item ) {
              return {
                //How to access the jason response here and assign it in autopopulate?
              }
            }));
          }
        });
      }
  });

});
</script>
{/literal}

report_student_result.php文件中的PHP代码如下(switch case之一):

<?php
    $request     = empty( $_GET ) ? $_POST : $_GET ;
    $op = $request['op'];
    global $gDb; 
     switch($op) {
         case'get_student_names':
         // escape your parameters to prevent sql injection
         $param   = mysql_real_escape_string($_GET['term']);
         $options = array();

         $sql  = " SELECT CONCAT(u.user_first_name, " ", u.user_last_name) as full_name FROM users as u JOIN  users_groups_subscribe as ugs ON u.user_id = ugs.subscribe_user_id WHERE ugs.subscribe_group_id=10 ";
         $this->mDb->Query( $sql);
         $data = $gDb->FetchArray();
         $data = json_encode($data);
         echo $data;
         die;
         break;
    }

?>

我也不知道应该如何访问 json 响应。经过这么多的谷歌搜索和所有的研究,我写了上面的代码。它可能有很多错误,请帮助我使该字段自动完成可行。

【问题讨论】:

  • 我在自动完成方面遇到了很多问题,但在过去的几周里,我取得了进展并且很好地处理了它。最重要的是您必须确保呈现的数据是 json 格式。自己运行你的 php,然后把屏幕转储到jsonlint.com。然后将自动完成放入成功函数中。如果这是您的目标,多列自动完成非常复杂。
  • 我看到'ajax.success'函数需要调用'response'函数和数组来自动完成。只需从 'item' 的 $.map 函数返回一些东西。而且您的自动完成功能应该可以正常工作。这是一个类似的例子jqueryui.com/autocomplete/#remote-with-cache
  • 我希望您不要在此处的电子邮件上使用 用户名which is a bad practice

标签: php jquery mysql ajax jquery-ui-autocomplete


【解决方案1】:

您可以通过以下方式执行此操作。我没有彻底测试过代码。希望它对你有用。

<script language="javascript" type="text/javascript">
$(function() {
  $( "#user_name" ).autocomplete({
  source: function( request, response ) {
    $.ajax({
      url: "report_student_result.php",
      dataType: "json",
      data: {
        request_type: "ajax",
        op: "get_student_names",
        class_id: $('#class_id').val(),
        section_id: $('#section_id').val(),
        name_startsWith: request.term
      },
      success: function( data ) {
        response(
          $.map(data, function(item) {
            return {
              label: item.full_name,
              value: item.full_name
            }
          })
        );
      }
    });
  },
  minLength: 2,
  select: function( event, ui ) {
    if(ui.item) { 
      $(event.target).val(ui.item.value);
    }
    return false;
  },
  open: function() {
    $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
  },
  close: function() {
    $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
  }
  });
});
</script>

【讨论】:

    【解决方案2】:

    试试这个

     $("#user_name").autocomplete({
             source: function(request, response) {
                 $.ajax({
                     url: "report_student_result.php",
                     dataType: "json",
                     data: {
                         request_type: "ajax",
                         op: "get_student_names",
                         class_id: $('#class_id').val(),
                         section_id: $('#section_id').val()
                     },
                     success: function(data) {
                         response(
                             $.map(data, function(item) {
                                 return {
                                     label: item.full_name,
                                     value: item.full_name
                                 }
                             })
                         );
                     }
                 });
             },
             select: function(event, ui) {
                 if(ui.item) {
                     $(event.target).val(ui.item.value);
                 }
                 return false;
             }
        });
    

    这里来自服务器的响应应该是下面的格式

    [{"full_name":"Name 1"},{"full_name":"Name 2"},{"full_name":"Name 3"},.......]
    

    希望有帮助!

    【讨论】:

      【解决方案3】:

      始终直接测试您的 PHP 以确保您发送给客户端的内容是您所期望的。此外,我通常总是将 ID 与数据一起发送,这样如果我想对它做点什么,我就可以将 ID 发送回服务器。此外,无需在查询中使用CONCAT,因为您可以在客户端上组合它们(您所做的没有错,但有选项很好)。

      我个人不使用 Smarty 模板。为您提供更多答案的受众将是只显示生成的 HTML。

      试试下面的 jQuery 脚本。我不知道你想做什么,你可能不需要焦点事件或选择事件中的blur()preventDefault()

      $("#user_name").autocomplete({
          source: 'report_student_result.php?request_type=ajax&op=get_student_names&class_id='+$('#class_id').val()+'&section_id='+$('#section_id').val(),
          minLength: 2,
          focus: function( event, ui ) {event.preventDefault();$(this).val( ui.item.label );},
          select: function(event, ui) {
              $(this).val('').blur();
              event.preventDefault();
              //Access your returned data (in object "ui") however you want.
              console.log(ui);
              //Note that you could have sent multiple values such as ui.item.firstname, ui.item.lastname if you want
              alert(ui.item.full_name);
          }
      })
      

      【讨论】:

      • -1 用于将逻辑放入source 字符串中,而不是将url 与数据分开
      • @DmitriZaitsev。 GET 请求的数据还会去哪里?
      • 这打破了单一职责原则。应该有一个辅助函数分别接受url 和数据并发出请求。否则你会张开双臂邀请虫子。
      【解决方案4】:

      我对自动完成小部件的响应选项有同样的问题。我将我的自动完成小部件版本从 1.8 升级到了 1.9。现在它工作得很好。假设您的代码是正确的并且您使用的版本低于 1.9,我建议您从 1.8 切换到 1.9。希望它有效..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-07
        相关资源
        最近更新 更多