想象一下,数据库驱动有两列。第一个是美国本土鸟类的清单。第二列列出了一个子集 - 每只原产于纽约州的鸟。
我不确定我想要如何设置数据库表,但我想修改它以便用户可以选择特定的数据子集。换句话说,他们可以在纽约和佛罗里达之间切换,或者他们可以在第二栏中显示加利福尼亚原产的鸟类列表。
假设第二列中显示的键是WHERE Table.Parent =' NY' (NY代表纽约)。我怎样才能允许用户将WHERE子句更改为WHERE Table.Parent =' CA'或者在哪里Table.Parent =' FL'?
有谁能告诉我我可以用什么策略来实现这个目标?我使用PHP,MySQL和jQuery。如果您可以向Google推荐一两个关键词,那将会很有用,可以提供有关如何操作的提示。
答案 0 :(得分:1)
由于Dagon已对您的帖子发表评论,请正确设置数据库和表格。
我们可以有四个表格(state_tb
,location_tb
,bird_tb
,bird_location_tb
)。
对于state_tb
表,请将其设置如下:
state_id | state
----------+----------
1 | Alabama
2 | Alaska
3 | Arizona
... and so on...
对于location_tb
表:
location_id | state_id | location
-------------+------------+-------------
1 | 1 | Birmingham
2 | 1 | Montgomery
3 | 1 | Mobile
4 | 2 | Anchorage
5 | 2 | Fairbanks
6 | 2 | Juneau
7 | 3 | Phoenix
8 | 3 | Tucson
9 | 3 | Mesa
...and so on...
对于你的bird_tb
表:
bird_id | bird
---------+-----------------
1 | Maya
2 | American Eagle
3 | Wood Pecker
...and so on...
最后,对于您的bird_location_tb
表:
id | bird_id | bird_location (links to location_tb.location_id)
----+-----------+-----------------
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
让用户首先从州和地点选择鸟类。这是一个示例JSfiddle。我在小提琴中给出的例子是修复,所以配置它,它将连接到你的数据库。
有三个选择字段,州,位置和鸟。
<select id="state"> <!-- SELECT FIELD FOR STATE -->
<option value="0">Select State</option>
<?php
$stmt = $connection->prepare("SELECT state_id, state FROM state_tb");
$stmt->execute();
$stmt->bind_result($stateid, $state);
while($stmt->fetch()){
echo '<option value="'.$stateid.'">'.$state.'</option>';
}
$stmt->close();
?>
</select>
<select id="location">
<option value="0">Select Location</option>
</select>
<select id="bird">
<option value="0">Select Bird</option>
</select>
创建一个脚本,根据其先决条件字段填充下一个选择字段。
<script>
$(document).ready(function(){
$("#state").change(){ /* WHEN USER SELECTS A STATE */
var stateid = $(this).val(); /* STORE THE SELECTED STATE ID TO THIS VARIABLE */
$.ajax({
type: "POST", /* METHOD TO USE TO PASS THE DATA */
url: "action.php", /* PAGE WHERE WE WILL PROCESS THE PASSED DATA */
data: {"stateid": stateid }, /* THE DATA WE WILL BE PASSING TO action.php */
dataType: 'json', /* TYPE OF DATA THAT WILL BE RETURNED FROM action.php */
success: function(result){ /* IF AJAX IS SUCCESS */
$("#location").empty().append(result.locations); /* FILL THE LOCATION FIELD WITH THE RETURNED DATA */
$("#bird").empty().append(result.birds); /* FILL THE BIRD FIELD WITH THE RETURNED DATA */
}
});
});
$("#location").change(){ /* WHEN USER SELECT A LOCATION */
var locationid = $(this).val(); /* STORE THE SELECT LOCATION ID TO THIS VARIABLE */
$.ajax({
type: "POST", /* METHOD TO USE TO PASS THE DATA */
url: "action.php", /* PAGE WHERE WE WILL PROCESS THE PASSED DATA */
data: {"locationid": locationid }, /* THE DATA WE WILL BE PASSING TO action.php */
success: function(result){ /* IF AJAX IS SUCCESS */
$("#bird").empty().append(result); /* FILL THE BIRD FIELD WITH THE RETURNED DATA */
}
});
});
</script>
对于action.php
,我们将使用上面代码中的ajax处理传递的数据:
<?php
include("yourconnection.php"); /* INCLUDE YOUR CONNECTION HERE */
if(!empty($_POST["stateid"])){ /* WHEN USER CHANGE THE STATE ID */
$locationoptions = '<option value="0">Select Location</option>';
$birdoptions = '<option value="0">Select Bird</option>';
/* START GETTING THE LOCATIONS THAT MATCHES THE STATE */
$stmt = $connection->prepare("SELECT location_id, location FROM location_tb WHERE state_id = ?");
$stmt->bind_param("i", $_POST["stateid"]);
$stmt->execute();
$stmt->bind_result($locationid, $location);
while($stmt->fetch()){
$locationoptions .= '<option value="'.$locationid.'">'.$location.'</option>';
}
$stmt->close();
/* START GETTING THE BIRDS THAT MATCHES THE STATE ID */
$stmt = $connection->prepare("SELECT d.bird_id, d.bird FROM state_tb a LEFT JOIN location_tb b ON a.state_id = b._stateid LEFT JOIN bird_location_tb c ON b.location_id = c.bird_location LEFT JOIN bird_tb d ON c.bird_id = d.bird_id WHERE a.state_id = ?");
$stmt->bind_param("i", $_POST["stateid"]);
$stmt->execute();
$stmt->bind_result($birdid, $bird);
while($stmt->fetch()){
$birdoptions .= '<option value="'.$birdid.'">'.$bird.'</option>';
}
$stmt->close();
echo json_encode(array("locations" => $locationoptions, "birds" => $birdoptions));
} /* END OF PROCESSING THE PASSED ON STATE ID */
else if(!empty($_POST["locationid"])){ /* WHEN USER CHANGE THE LOCATION */
echo '<option value="0">Select Bird</option>';
$stmt = $connection->prepare("SELECT b.bird_id, b.bird FROM bird_location_tb a LEFT JOIN bird_tb b ON a.bird_id = b.bird_id WHERE a.bird_location = ?");
$stmt->bind_param("i", $_POST["locationid"]);
$stmt->execute();
$stmt->bind_result($birdid, $bird);
while($stmt->fetch()){
echo '<option value="'.$birdid.'">'.$bird.'</option>';
}
$stmt->close();
} /* END OF PROCESSING THE PASSED ON LOCATION ID */
?>