【问题标题】:problem with jquery autocomplete and mySqljquery自动完成和mySql的问题
【发布时间】:2011-09-12 06:39:15
【问题描述】:

search.php

$text = $mysqli->$_POST['term'];
$query = "SELECT name FROM males WHERE name LIKE '%" . $text . "%' ORDER BY name ASC";
$result = $mysqli->query($query);
$json = '[';
$first = true;
while($row = $result->fetch_assoc())
{
    if (!$first) { $json .=  ','; } else { $first = false; }
    $json .= '{"value":"'.$row['name'].'"}';
}
$json .= ']';
echo $json;

index.php

1) HTML

<body>
Text: <input type="text" id="autocomplete" />
</body>

2) jQuery

    $( "#autocomplete" ).autocomplete({
        source: function(request, response) {
            $.ajax({ url: "http://localhost/testing/auto/search.php",
            data: { term: $("#autocomplete").val()},
            dataType: "json",
            type: "POST",
            success: function(data){
                response(data);
            }
        });
    },
    minLength: 2
    });

当我键入 2 个字母时,它会给出我数据库中的所有名称,即使这两个字母与任何名称都不匹配。

这是怎么发生的,我该如何解决?

【问题讨论】:

  • 你的 json 看起来怎么样?您应该使用 json_encode 函数在 php 中生成 json
  • 在我添加 json_encode 后仍然给我所有记录!
  • 不,$text = $mysqli->$_POST['term'];
  • $mysqli->$_POST['term'] 是做什么的?我认为你应该有$text = $_POST['term'];。这应该工作
  • @Rakesh,谢谢你现在没有这个“$mysqli->”

标签: php jquery mysql jquery-ui autocomplete


【解决方案1】:

看起来我的评论作为一个答案,因此这个答案。

$mysqli-&gt;$_POST['term'] 是做什么的?我认为你应该有$text = $_POST['term'];。这应该可以。

【讨论】:

    【解决方案2】:

    把 PHP 改成

    $text = $_POST['term'];
    
    $query = "SELECT name FROM males WHERE name LIKE '%" . $mysqli->real_escape_string($text) . "%' ORDER BY name ASC";
    $result = $mysqli->query($query);
    
    echo json_encode($result->fetch_all(MYSQLI_ASSOC));
    

    您忘记转义输入以防止 SQL 注入。此外,请使用@mu 的答案来修复您的前端代码。

    【讨论】:

    • 很好,在 Swell 向我指出之前,我什至没有注意到 $text 错误。
    • @mu 我一开始并没有发现 JS 错误。猜猜我们专注于不同的事情;-)
    • 公平地说,JS 问题比“真正的”错误更具风格和关于按预期使用 API。
    【解决方案3】:

    您的source 回调没有按照您的想法进行。自动完成器的当前内容在request.term,而不是$("#autocomplete").val()。您将 term 的空值发送回您的 PHP,然后您的 SQL 如下所示:

    SELECT name FROM males WHERE name LIKE '%%' ORDER BY name ASC
    

    哪些课程与males 表中的所有内容相匹配。您的source 回调应如下所示:

    source: function(request, response) { 
        $.ajax({
            url: "http://localhost/testing/auto/search.php",
            data: { term: request.term },
            dataType: "json", 
            type: "POST", 
            success: function(data) { 
                response(data);  
            }
        });
    }   
    

    jQuery-UI 小部件可能对 DOM 进行了相当程度的操作,因此 #autocomplete 输入元素可能在其中没有任何有用的东西,直到自动完成器为其提供最终值。

    作为参考,以下是fine manual 所说的话:

    第三种变体,回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调有两个参数:

    • 一个request 对象,具有一个名为term 的属性,它引用当前文本输入中的值。例如,当用户在城市字段中输入“new yo”时,自动填充词将等于“new yo”。

    【讨论】:

    • $text 在你的 PHP 中是什么样子的?
    • 它也适用于数据:{ term: $("#autocomplete").val()},问题是 $mysqli->$_POST['term']。
    • @Swell:真的吗?我什至没有注意到这一点。所以 Znarkus 得到了复选标记。即便如此,您也应该使用 request.term,因为这是指定的方式,它可以让您免于 $().val() 必须在幕后做的所有额外工作,这可能也是未来的证明。
    • 非常感谢您,我想接受您的回答,但您的回答不是关于这个问题的正确答案,我也听取了您的建议,并将 $().val() 替换为 request.term ,再次感谢您。
    【解决方案4】:

    首先确保您的 search.php 工作正常。切换到 $_GET['term'] 并直接运行页面,直到获得所需的数据。

    我会亲自将查询从 LIKE '%text%' 更改为 LIKE 'text%'。

    之后,使用 Firebug 检查通过 AJAX 调用传输到 search.php 的参数。顺便说一句,你确定你的 jquery 代码是正确的吗?

    【讨论】:

      【解决方案5】:

      我认为是你的 sql 查询。你正在使用

      $query = "SELECT name FROM males WHERE name LIKE '%$text%' ORDER BY name ASC"
      

      如果你的名单喜欢

      亚伦 亚历山大 玛莎 ...

      如果您输入“AA”,上述查询将产生:Aaron, Maartha。因为查询将在整个字符串之间搜索匹配的给定字符串。 % text % 表示查询结果会忽略左右结果。

      如果你正在寻找你应该使用查询的名称字段数据

      $query = "SELECT name FROM males WHERE name LIKE '$text%' ORDER BY name ASC"
      

      如果你输入'AA,它会得到:Aaron。

      请注意,jQuery 只会将您要求的内容返回到数据库。

      【讨论】:

        【解决方案6】:

        使用$_REQUEST['term'] 代替$_POST['term']

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          • 2010-12-04
          • 2011-08-08
          • 2013-01-22
          • 2016-05-31
          • 2011-10-08
          相关资源
          最近更新 更多