UI自动完成上的JSON数据源问题

时间:2018-10-04 09:06:29

标签: php jquery jquery-ui autocomplete

我的代码有问题。我通过ajax接收数据并且可以正常工作,但是问题是,当我尝试搜索元素时,所有元素都出现了,因此搜索无法正常进行。

JS代码:

let marque_id =$("#marque_id").val();
    $( "#grp_name" ).autocomplete({
        source: function( request, response ) {
            $.ajax({
                url:"abonne/ajax_get_grp_autorisation",
                method:"POST",
                dataType: "json",
                data: {
                    marque_id : id_marque
                },
                success: function( data ) {
                    response( data );
                    console.log(data);
                }
            });
        },
        select: function (event, ui) {
            // Set selection
            $('#grp_name').val(ui.item.label); // display the selected text
            $('#id_grp_selected').val(ui.item.id); // save selected id to input
            return false;
        } 
    });

PHP代码:

$data = array();
while($line = mysqli_fetch_object($liste_grp) ){
    $data[] = array("label"=>$line->grp_nom,"value"=>$line->grp_nom ,"id"=>$line->groupement_id);
}  
echo json_encode($data);

result

3 个答案:

答案 0 :(得分:0)

您应该将要搜索的文本发送到ajax请求,以便您的自动完成功能应该是

let marque_id =$("#marque_id").val();
    $( "#grp_name" ).autocomplete({
        source: function( request, response ) {
            $.ajax({
                url:"abonne/ajax_get_grp_autorisation",
                method:"POST",
                dataType: "json",
                data: {
                    marque_id : id_marque , 
                    term: request.term       
                },
                success: function( data ) {
                    response( data );
                    console.log(data);
                }
            });
        },
        select: function (event, ui) {
            // Set selection
            $('#grp_name').val(ui.item.label); // display the selected text
            $('#id_grp_selected').val(ui.item.id); // save selected id to input
            return false;
        } 
    });

request.term是您的搜索文本,在您的示例中是组文本

,此外,您还需要修改mysql查询并添加条件(例如) 例如

$rs = mysql_query("SELECT * FROM table WHERE colum LIKE '%" . $_POST['term'] . "%'");

最后,您可以检查https://jqueryui.com/autocomplete/#remote-jsonp

答案 1 :(得分:0)

我建议使用以下jQuery:

$( "#grp_name" ).autocomplete({
  source: function(request, response) {
    $.ajax({
      url:"abonne/ajax_get_grp_autorisation",
      method:"POST",
      dataType: "json",
      data: {
        marque_id: request.term
      },
      success: function( data ) {
        console.log(data);
        response(data);
      }
    });
  },
  select: function (event, ui) {
    // Set selection
    $('#grp_name').val(ui.item.label); // display the selected text
    $('#id_grp_selected').val(ui.item.id); // save selected id to input
    return false;
  } 
});

这是一个很小的变化。这会将request.term发送到您的PHP脚本。例如,如果用户键入“ gro”,它将被发送到您的脚本并通过以下方式访问:

$_POST['marque_id']

这将假定您的SQL查询类似于:

$stmt = $mysqli->prepare("SELECT * FROM table WHERE column LIKE '?%'");
$stmt->bind_param("s", $_POST['marque_id']);
$stmt->execute();
$liste_grp = $stmt->get_result();
$data = array();
while($line = $liste_grp->fetch_assoc()) {
  $data[] = array(
    "label" => $line['grp_nom'],
    "value" => $line['grp_nom'],
    "id" => $line['groupement_id']
  );
}
$stmt->close();
header('Content-Type: application/json');
echo json_encode($data);

这使用MySQLi Prepared Statement,将有助于防止SQL注入。我还把JSON标头作为一种很好的做法。搜索"gro"的结果将类似于:

[
  {
    "label": "GROUPE DATAPNEU TEST",
    "value": "GROUPE DATAPNEU TEST",
    "id": 1
  }
];

答案 2 :(得分:0)

谢谢大家,我找到了一个效果更好的解决方案 我在很多选项中使用了tokeninput

http://loopj.com/jquery-tokeni

$.ajax({
        url:"ajax_get_societe_authorisation",
        method:"POST",
        scriptCharset: "iso-8859-1",
        cache: false,
        dataType: "json",
        data: {
            marque_id : id_marque
        },
        success: function( data ) {
        console.log(data);
        $("#soc_name").tokenInput(data
        ,{
            tokenLimit: 1,
            hintText: "Recherche une société par son nom",
            noResultsText: "Aucune société trouvé",
            searchingText: "Recherche en cours ...",
            onAdd: function (data) {
                $("#soc_id").val(data.id);
            },
            onDelete: function (item) {
                $("#soc_id").val("");
            }
        }

    );
    }
    });