的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;
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个字母时,它会给我数据库中的所有名称,即使这两个字母与任何名称都不匹配。
这是怎么发生的,我该如何解决?
答案 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']
。