我正在尝试使用PHP从Mysql中选择多个下拉列表中的值。我似乎无法在下拉列表中得到正确的选择。有人能帮帮我吗。
这是SELECT
语句。
$id = '';
if( isset($_GET['id']) && !empty($_GET['id'])) {
$id = $_GET['id'];
$sqlParent = "SELECT * FROM multipleselect";
$resultParent = mysqli_query($con, $sqlParent);
// Output: One Two Three
$sqlChildren = "SELECT * FROM multipleselect WHERE multipleselecttrackerid = $id";
$resultChildren = mysqli_query($con, $sqlChildren);
// Output: Two Three
}
使用两个while loop
的Php下拉列表
<select name ="fm_multiple" multiple>
<?php
while($row = mysqli_fetch_assoc($resultParent)){
$selectedParent = $row['multipleselect_name'];
while($row = mysqli_fetch_assoc($resultChildren)){
$selectedChild = $row['multipleselect_name'];
}
$selected = ($selectedParent == $selectedChild) ? "selected='selected'": '';
echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
}
?>
</select>
这是我得到的输出。
<select name="fm_multiple" multiple="">
<option value="One">One</option>
<option value="Two">Two</option>
<option value="Three" selected="selected">Three</option>
<option value=""></option>
</select>
发布于 2018-10-26 03:42:06
在没有看到数据的情况下,我所能做的只是猜测,但这肯定是错误的:
while($row = mysqli_fetch_assoc($resultParent)){
$selectedParent = $row['multipleselect_name'];
while($row = mysqli_fetch_assoc($resultChildren)){ //$row is overwritten
$selectedChild = $row['multipleselect_name'];
}
$selected = ($selectedParent == $selectedChild) ? "selected='selected'": '';
echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
}
您不能多次迭代查询(从技术上讲,这不是真的),但是在外部while循环的第一次迭代之后,内部while循环将遍历$resultChildren
集的全部结果集。因此,在外部循环的第二次迭代中,您的结果将从那时起返回false。
如果您想再次迭代结果(在本例中是没有意义的),则必须执行mysqli_data_seek($resultChildren,0)
。这是没有意义的,因为您可以在循环之前获取数据。使用in_array
比循环更有效率(即使在找到匹配之后调用match也能稍微改进循环)。
//only column you need is multipleselect_name, the smaller the result set the easier it is on the network trafic (so the faster it responds)
$sqlChildren = "SELECT multipleselect_name FROM multipleselect WHERE multipleselecttrackerid = $id";
$resultChildren = mysqli_query($con, $sqlChildren);
$selected = array_column(mysqli_fetch_all($resultChildren,MYSQLI_ASSOC), 'multipleselect_name');
/*
we need ['item1','item2', .... ] instead of [['multipleselect_name'=>'item1'],['multipleselect_name'=>'item2']]
I don't think you can fetch all from one column in mysqli
..PDO..
$selected = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
*/
while($row = mysqli_fetch_assoc($resultParent)){
$selectedParent = $row['multipleselect_name'];
$selected = in_array($selectedParent,$selected) ? "selected='selected'": '';
echo "<option value='{$selectedParent}' {$selected}>{$selectedParent}</option>";
}
在我前面提到的基础上,使用第二个循环覆盖$row
。在这种情况下,这可能并不重要(您不再从家长那里使用$row ),但是它的错误实践可能会导致各种难以跟踪的问题。
我简化了逻辑,因为如果:
$selectedParent = $parent['multipleselect_name']; //changed from row for clarity
$selectedChild = $child['multipleselect_name']; //changed from row for clarity
//and
$selectedParent == $selectedChild
//then
$parent['multipleselect_name'] = $child['multipleselect_name'];
//so if we have a list of all
$child['multipleselect_name']
//the we can find
$parent['multipleselect_name']
//in that list
希望这是有意义的,就像说a=b
和b=c
所以a=c
发布于 2018-10-26 03:40:46
据我所知,它应该选在你的参赛作品中。
<select name="fm_multiple" multiple="">
<option value="One">One</option>
<option value="Two">Two</option>
<option value="Three" SELECTED>Three</option>
<option value=""></option>
</select>
https://stackoverflow.com/questions/53000777
复制相似问题