【问题标题】:How to get jquery autocomplete to display only terms that begin with the typed query如何让 jquery 自动完成以仅显示以键入查询开头的术语
【发布时间】:2013-08-14 02:34:14
【问题描述】:

上下文

  • 我在motherpipe.co.uk 的搜索引擎中添加了自动完成功能。
  • 我希望它只建议以用户输入的字母开头的术语。例如,如果用户键入“lon”,该函数应返回十个以“lon”开头的建议。
  • 我在本地数据库中有大约 50,000 个术语
  • 我已经设法让自动完成功能启动并运行,使用调用数据库 (sql) 的单独 php 脚本。

问题

我的问题是,无论用户输入什么,都会显示数据库中的前十个列表(基于 id)。只有在用户输入另一个字母后,建议才会正确显示。

问题

如何修改 jquery 或 php 代码以确保只返回以输入内容开头的术语(然后根据 id 只返回该子集中的前十个术语。)?

HTML

<script type="text/javascript" src="/scripts/autocomplete/autocomplete/jquery.js"></script>
<script type="text/javascript" src="/scripts/autocomplete/autocomplete/jquery.autocomplete.js"></script>
<script>
$(document).ready(function(){
 $("#tag").autocomplete("/scripts/autocomplete/autocomplete/autocomplete.php",  {
        selectFirst: false,
        minChars: 2
    });
});
</script>

PHP

<?php
    $q=$_GET['q'];
    $mydata=mysql_real_escape_string($q);
    $mysqli=mysqli_connect('localhost','username','password','languages') or die("Database Error");
    $sql="SELECT searchterms FROM topterms WHERE searchterms LIKE '$mydata%' ORDER by id";
    $result = mysqli_query($mysqli,$sql) or die(mysqli_error());

    if($result)
    {
        while($row=mysqli_fetch_array($result))
        {
            echo $row['searchterms']."\n";
        }
    }
?>

【问题讨论】:

  • 我希望每个人都问这种类型的问题,很好的风格,很好的背景:)
  • 您可以更改 PHP 代码以查看结果并删除任何不以传入的字符串开头的答案并限制为 10 个答案。您还可以检测空字符串并返回空数组。
  • 我不知道为什么搜索Shield会找到Cheap flights
  • minChars 属性将搜索开始限制指定为 2 个字符。将其减少到 1 将允许您搜索第一个字符本身。

标签: php jquery sql autocomplete


【解决方案1】:

使用新版本的 jQuery 自动完成功能,当您使用 URL 作为源时(就像您一样):

  1. 您必须返回 JSON 数据:

    字符串:当使用字符串时,自动完成插件期望 指向将返回 JSON 数据的 URL 资源的字符串。它可以 位于同一主机或不同主机(必须提供 JSONP)。

  2. 您收到的 GET 参数是 'term',而不是 'q'

    自动完成插件不过滤结果,而是一个查询 string 添加了一个 term 字段,服务器端脚本应该 用于过滤结果。

  3. 在 PHP 中使用 mySQL 进行真正转义的正确方法是在建立连接后使用它,在您的情况下:

    $q = $_GET['term'];
    $mysqli = mysqli_connect('localhost','username','password','languages');
    if (!$mysqli or $mysqli->connect_error) die("Database Error");
    $mydata = $mysqli->real_escape_string($q);
    $sql = "SELECT searchterms FROM topterms WHERE searchterms LIKE '$mydata%' ORDER by id";
    $result = mysqli_query($mysqli,$sql);
    $json = array();
    if ($result and $result->num_rows > 0) {
        while($row=mysqli_fetch_array($result)) {
           $json[] = $row['searchterms'];
        }
    }
    header('Content-Type: application/json'); // You can skip that because IE doesn't really like it
    echo json_encode($json);
    

【讨论】:

  • P.S.您拥有的 like 语句将返回您需要的结果(仅以输入的字符串开头的项目)。
  • 干杯 Tsanyo,将进行更改,尝试并报告。非常感谢。
猜你喜欢
  • 2020-10-30
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多