jquery自动完成和mySql的问题

时间:2011-06-10 06:55:57

标签: php jquery mysql jquery-ui autocomplete

的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个字母时,它会给我数据库中的所有名称,即使这两个字母与任何名称都不匹配。

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

6 个答案:

答案 0 :(得分:1)

您的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”。
  •   

答案 1 :(得分:1)

将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的答案来修复前端代码。

答案 2 :(得分:1)

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

$mysqli->$_POST['term']做什么?我想你应该有$text = $_POST['term'];。这应该有用。

答案 3 :(得分:0)

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

我个人会将查询从LIKE'%text%'更改为LIKE'text%'。

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

答案 4 :(得分:0)

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

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

如果您的名单如

亚伦 亚历山大 Maartha ...

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

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

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

如果您输入'AA,则会产生:Aaron。

请注意,jQuery只返回您向数据库询问的内容。

答案 5 :(得分:0)

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