JQuery UI 自动完成,在 DOM 中加载所有数据,而不是从 mysql DB 中获取

Posted

技术标签:

【中文标题】JQuery UI 自动完成,在 DOM 中加载所有数据,而不是从 mysql DB 中获取【英文标题】:JQuery UI autocomplete, Load all Data in DOM instead taking from mysql DB 【发布时间】:2014-08-01 15:34:50 【问题描述】:

原因:想要加快自动完成结果

我有什么:我有两个输入框。一个是类别,另一个是品种。首先我选择类别,

$("#category").autocomplete(
    autoFocus: true,
    source: function(request, response) 
        $.getJSON("./php/autocompletenontex_getcategory.php",  category: request.term , response);
    ,
    minLength: 0,
    select: function( event, ui ) 
        $('#variety').focus();
    
).focus(function() 
        $(this).autocomplete("search", "");
);

上面的代码在开始输入之前显示了自动完成结果。

我的 PHP 代码是: //包含数据库连接后

$category =  $_REQUEST["category"];
    $sql = "SELECT distinct(category) FROM master_nontextile WHERE category LIKE '%".$category."%'";
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result))
        $results[] = array('label' => $row['category'], 'value' => $row['category']);
    
    echo json_encode($results);

下一个输入字段是品种 - 品种自动完成结果基于类别的选择。代码如下

$("#variety").autocomplete(
    autoFocus: true,
    source: function(request, response) 
        $.getJSON("./php/autocompletenontex_getvariety.php",  variety: request.term, category: $("#category").val() , response);
    ,
    minLength: 0,
    select: function( event, ui ) 
        $('#variety').val(ui.item.variety);
        $('#price').val(ui.item.price);
        $('#quantity').focus();
    
).focus(function() 
        $(this).autocomplete("search", "");
);

对应的PHP为:

//after including DB connection
    $stmt = $pdo->prepare("SELECT variety, price FROM master_nontextile WHERE category = '$category' AND ( variety LIKE '%".$variety."%' OR price ='$variety' ) ORDER BY variety ASC"); $stmt->execute();
    while($row = $stmt->fetch())
        $results[] = array('label' => $row['variety'].' - '.$row['price'], 'value' => $row['variety'], 'price' => $row['price']);
    
    echo json_encode($results);

问题: 我们有一个计费应用程序。在品种字段中,他们可以输入品种名称或价格。 在输入自动完成结果时会显示 1 秒后的结果(客户觉得这太迟了)。 所以我需要它在输入价格或品种名称时快速填充。 我认为建立联系需要时间,然后退休需要时间。

我知道我们可以使用 ajax 请求 link here 在页面加载时加载数据 此解决方案适用于一个独立的自动完成字段。但是我有两个输入字段,第二个的结果取决于第一个。那么我如何在不去数据库的情况下实现它呢?

【问题讨论】:

啊!我在等待答案 【参考方案1】:

您的问题是您获取数据的速度比您预期的要慢。您受到数据库返回结果的速度的限制。我可以建议您关注以加快速度。

    不要为每个请求从 php 建立到 mysql 的新连接。启用数据库连接池。它大大提高了性能。我不知道如何在 php 中做连接池。 This 可能会有所帮助。

    如果可能的话将结果缓存在php中,这样你就不会每次都访问db。

    使用外部服务为自动完成提供数据。看Autocomplete as a Service

【讨论】:

爱你,伙计!这一行解决了我的问题(我的应用程序仅在本地运行) $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::ATTR_PERSISTENT => true ));

以上是关于JQuery UI 自动完成,在 DOM 中加载所有数据,而不是从 mysql DB 中获取的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-UI 自动完成不会显示在 jQuery-UI 对话框中

如何在引导侧导航顶部显示 jQuery-ui 自动完成?

jquery UI 自动完成:我克隆的自动完成字段不起作用

jQuery ui 自动完成在 MVC c# 中不显示任何内容

单独更改 jquery-ui 自动完成小部件的宽度

在 jQuery UI 自动完成中限制结果