我能够获得您正在寻找的功能。我的例子和解释如下:
假设有两个表:
1) states -> id varchar(2)(AL、MN、FL 等)和 state varchar(32)(阿拉巴马州、明尼苏达州、佛罗里达州等)
2) 城市 -> id int(5) autoinc、city varchar(64)(Mobile、Stillwater、Miami)和 state_id varchar(2)(AL、MN、FL)
表链接方式:city.state_id = states.id
现在我们来看看表格。
// autocomplete.php
在头部调用 JQuery 所需的内容:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" />
在正文中设置您的表单。当焦点从字段移开时,状态输入将调用 javascript 函数,此时它将检索与该州关联的城市。
<form action="#">
<label for="state">State: </label>
<input type="text" name="state" id="state" onBlur="getCities();"/>
<label for="city">City: </label>
<input type="text" id="city" name="city"/>
</form>
下面正文中的表单,发挥 Jquery 的魔力。我想如果您要使用自动完成功能,请将其设置为在用户输入任何位置数据之前工作,在本例中为“状态”。我们通过将代码封装到函数中来做到这一点。
请记住,自动完成正在通过 GET 调用 php 文件,该文件返回一个值数组,自动完成用于在您键入时填充列表。
我们希望首先获得所有城市,然后一旦用户在州字段中输入信息,就可以获得与该州相关联的所有城市。本质上,我们将设置两次自动完成功能。
给你 - 处理自动完成的函数:
// set autocomplete
function setAutocomplete(data) {
$('#city').autocomplete({
source: data,
minLength: 1
});
}
现在设置自动完成,显示所有城市。
// autocomplete default
setAutocomplete('getautocomplete.php');
此时,如果您开始在城市输入字段中输入内容,您将看到所有城市,无论是哪个州。
现在我们将处理当用户在状态输入中进入状态时会发生什么:
// get cities based on state input
function getCities() {
var state_name = $('#state').val();
setAutocomplete('getautocomplete.php?state='+state_name);
}
就是这样!当您输入状态名称并失去对该字段的关注时,它将更改状态输入字段上的自动完成,再次调用 getautocomplete.php 但这次按状态名称过滤。
现在我们来看看 PHP 文件。
// getautocomplete.php
从顶部 -> 设置您的数据库连接:
$mysqli = new mysqli('localhost', 'root', '', 'php_autocomplete');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
然后设置 SQL 查询所需的参数。
// get parameters
$term = isset($_GET['term']) ? $_GET['term'] : NULL;
$state = isset($_GET['state']) ? $_GET['state'] : NULL;
现在我们检查是否设置了 state 参数,因为这决定了我们使用哪个 SQL SELECT 字符串。
// set query dependant on if state available
if ( $state == NULL ) {
// get all cities
$query = 'SELECT city
FROM cities
WHERE city LIKE "%'.$term.'%"
ORDER BY city';
} else {
// filter by state
$query = 'SELECT city
FROM cities
INNER JOIN states ON cities.state_id=states.id
WHERE (state="'.$state.'" AND city LIKE "%'.$term.'%")
ORDER BY city';
}
最后我们返回并打印出结果(本质上是一个数组),这是 JQuery 自动完成将用来填充自动完成列表的:
// get results
$results = $mysqli->query($query);
$json = array();
while ( $city = $results->fetch_array() ) {
$json[] = array( 'value' => $city['city'], 'label' => $city['city'] );
}
echo json_encode($json);
您不需要使用 AJAX。自动完成本质上已经在 getautocomplete.php 上做 AJAX。我们只是通过添加 ?state=state_name 给它一个额外的参数,然后在 PHP 中我们考虑该参数并根据需要制作 SQL SELECT 语句。
这是两个文件的完整代码,因此您可以在没有我的任何 cmets 的情况下在上下文中查看它。我希望这可以帮助您解决问题。您应该能够使用您的表格和表单来完成这项工作。
//// autocomplete.php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Autocomplete</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" />
</head>
<body>
<form action="#">
<label for="state">State: </label>
<input type="text" name="state" id="state" onBlur="getCities();"/>
<label for="city">City: </label>
<input type="text" id="city" name="city"/>
</form>
<script type="text/javascript">
// set autocomplete
function setAutocomplete(data) {
$('#city').autocomplete({
source: data,
minLength: 1
});
}
// autocomplete default
setAutocomplete('getautocomplete.php');
// get cities based on state input
function getCities() {
var state_name = $('#state').val();
setAutocomplete('getautocomplete.php?state='+state_name);
}
</script>
</body>
</html>
///// getautocomplete.php
<?php
$mysqli = new mysqli('localhost', 'root', '', 'php_autocomplete');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// get parameters
$term = isset($_GET['term']) ? $_GET['term'] : NULL;
$state = isset($_GET['state']) ? $_GET['state'] : NULL;
// set query dependant on if state available
if ( $state == NULL ) {
// get all cities
$query = 'SELECT city
FROM cities
WHERE city LIKE "%'.$term.'%"
ORDER BY city';
} else {
// filter by state
$query = 'SELECT city
FROM cities
INNER JOIN states ON cities.state_id=states.id
WHERE (state="'.$state.'" AND city LIKE "%'.$term.'%")
ORDER BY city';
}
// get results
$results = $mysqli->query($query);
$json = array();
while ( $city = $results->fetch_array() ) {
$json[] = array( 'value' => $city['city'], 'label' => $city['city'] );
}
echo json_encode($json);
?>