我有一个html + php页面。有3个下拉菜单。菜单的值来自sqlite数据库。 我想从第一个菜单中进行选择,然后基于该选择,动态填充第二个下拉菜单。然后再次对第三个菜单相同。
我见过Dynamically populate drop down menu with selection from previous drop down menu 但: 1.如果可能,我想单独使用php完成此操作 2.无需任何外部插件/资源,因为该页面将在Intranet上运行而无需访问网络。
我已经尝试了使用post / get方法的以下代码,但是当第二条帖子被调用时,它将清除第一条帖子中的数据。
<form action="" method="get" name="proj_form">
<?php
$db = new SQLite3('FEINT_DB.db');
$sql="SELECT project FROM synthesis_metrics WHERE is_project=1";
$query = $db->query($sql); // Run your query
echo '<select name="project" id="project">';
while ($row = $query->fetchArray()) {
echo '<option value="'.$row['project'].'">'.$row['project'].'</option>';
}
echo "</select>";
$project =$_GET['project'];
?>
<input type="submit" name="projbutton" value="Submit"/></form>
<?php echo "You chose $project <br>"; ?>
<form action="" method="post">
<?php
$sql="SELECT CL FROM synthesis_metrics WHERE is_CL=1";
$query = $db->query($sql); // Run your query
echo '<select name="CL" id="CL">';
while ($row = $query->fetchArray()) {
echo '<option value="'.$row[CL].'">'.$row['CL'].'</option>';
}
echo "</select>";
$CL =$_POST['CL'];
?>
<input type="submit" name="button" value="Submit"/></form>
<?php echo "You chose $CL <br>"; ?>
<form action="" method="get" name="tile_form">
<?php
$sql="SELECT tile FROM synthesis_metrics WHERE CL=$CL AND is_t=1";
$query = $db->query($sql); // Run your query
echo '<select name="tiel" id="tiel">';
while ($row = $query->fetchArray()) {
echo '<option value="'.$row[tiel].'">'.$row['tiel'].'</option>';
}
echo "</select>";
答案 0 :(得分:3)
第二个帖子被调用时,它将清除第一个帖子中的数据
因为重新渲染数据时不会将其输出到表单。呈现<option>
元素时,没有指示应选择哪个元素:
echo '<option value="'.$row['project'].'">'.$row['project'].'</option>';
提供该指示:
if ($row['project'] == $_GET['project']) {
echo '<option value="'.$row['project'].'" selected>'.$row['project'].'</option>';
} else {
echo '<option value="'.$row['project'].'">'.$row['project'].'</option>';
}
这只是将当前渲染<option>
的值与发布的渲染值进行比较。如果相同,请在该selected
元素上包含<option>
属性。
更新:我也刚刚注意到您使用了三个不同的<form>
元素,其中一些是POST,而其他是GET。这将引起不必要的混乱。将所有这三个元素包装在一个<form>
元素中可能会更容易,以便将它们全部包含在同一请求中。
旁注:您的代码对 SQL注入是完全开放。您应该先阅读this page,然后看看some solutions here。
答案 1 :(得分:0)
乍一看,代码应该可以工作。但是,您将所有查询引用存储在同一变量中。尝试将查询结果存储在不同的变量中。试试这个-
<form action="" method="get" name="proj_form"> <?php $db = new SQLite3('FEINT_DB.db'); $sql="SELECT project FROM synthesis_metrics WHERE is_project=1"; $query1 = $db->query($sql); echo '<select name="project" id="project">'; while ($row = $query1->fetchArray()) { echo '<option value="'.$row['project'].'">'.$row['project'].'</option>'; } echo "</select>"; $project =$_GET['project']; ?> <input type="submit" name="projbutton" value="Submit"/></form> <?php echo "You chose $project <br>"; ?> <form action="" method="post"> <?php $sql="SELECT CL FROM synthesis_metrics WHERE is_CL=1"; $query2 = $db->query($sql); echo '<select name="CL" id="CL">'; while ($row = $query2->fetchArray()) { echo '<option value="'.$row[CL].'">'.$row['CL'].'</option>'; } echo "</select>"; $CL =$_POST['CL']; ?> <input type="submit" name="button" value="Submit"/></form> <?php echo "You chose $CL <br>"; ?> <form action="" method="get" name="tile_form"> <?php $sql="SELECT tile FROM synthesis_metrics WHERE CL=$CL AND is_t=1"; $query3 = $db->query($sql); echo '<select name="tiel" id="tiel">'; while ($row = $query3->fetchArray()) { echo '<option value="'.$row[tiel].'">'.$row['tiel'].'</option>'; } echo "</select>";
很抱歉格式错误。 :(
答案 2 :(得分:0)
在这种情况下,必须使用ajax才能将数据传递到页面并获得结果,而无需重新加载页面或将页面定向到另一个页面。 它是这样的:
$('first_drop_down').change( function() {
var val = $( 'first_drop_down' ).val();
$.get( 'php_file.php?val=' + val , function( response ) {
$( 'div' ).html( response );
} );
} );
您需要创建一个包含第二个下拉列表的div。
在php文件中,您需要回显一个全新的<select>
,其中包含与传递给文件的值相匹配的选项。在php文件中,您可以使用$_GET[ 'val' ]
来访问传递给它的值。