更新:
我做了一些更改并更新了代码。
现在效果更好,加载表单时,数据库中的值会自动显示在表单字段中,这可以通过添加"选择"到OPTION标签。
但是,我某处仍然有一个错误:
选择新值时,它会正确存储在数据库中,并在提交表单时显示在字段中,但前提是我在下拉列表中选择了低于上一个值的值。如果选择了高于上一个值的值,则新值将存储在DB中,但旧值仍显示在表单域中。
调试HTML输出时,我可以看到由于某种原因,旧值和新值都被列为"选择"选项。我使用" if ... elseif .... else"声明,并认为这是正确的,但我不明白为什么我有两个选项"选择"提交后。我是否理解IF语句的用法错误?
HTML输出的一部分:
<option value="MDV">Maldives</option>
<option value="MLI" selected>Mali</option>
<option value="MLT" selected>Malta</option>
<option value="MHL">Marshall Islands</option>
原始问题:
我已经看到了许多使用PHP和MySQL数据库中的值填充html表单下拉列表的方法示例。我选择了一个对我来说效率高且容易理解的方法。
但是我的问题是我的表单的其余部分使用数据库中的数据预先填充表单字段,我很难找到如何使用SELECT标记执行相同的操作。我想问一下这项任务的最佳做法是什么?在填充下拉列表时,从一般的角度来看,我的代码是否正确,或者我是否应该使用第三方脚本,例如&#34; Selectize&#34;或&#34; bootstrap-select&#34;完成这个?
值得一提的是,我的目标是一个解决方案,如果该值尚不存在,用户可以建议自己的值并将其添加到数据库中。对于包含大量选项的下拉列表,任何类型提前变量也是首选。但是现在我只专注于学习基础知识。
我现有的代码,用于为下拉列表提供正确的值,并将所选值存储在数据库中。按下提交后,我无法显示所选值,而是显示数组中的第一个值为下拉列表的默认值。
PHP代码:
//Get countries
$sth = $db->prepare ("SELECT iso3, short_name FROM country ORDER BY short_name ASC");
$sth->execute();
$CountryList = $sth->fetchAll(PDO::FETCH_ASSOC);
HTML code:
<div class="form-group">
<label class="control-label col-sm-2" for="country">Country</label>
<div class="col-sm-10">
<select class="form-control" name="country" id="country">
<?php
foreach ($CountryList as $row) {
if ($row['iso3'] == $_POST['country']) {
echo "<option value={$row['iso3']} selected>";
} elseif ($row['iso3'] == $country) {
echo "<option value={$row['iso3']} selected>";
} else {
echo "<option value={$row['iso3']}>";
}
echo $row['short_name'];
echo '</option>';
}
?>
</select>
</div>
</div>
答案 0 :(得分:0)
我认为你可能过早地结束你的foreach循环,你还需要为你的选项指定一个值,如下所示:
<div class="form-group">
<label class="control-label col-sm-2" for="country">Country</label>
<div class="col-sm-10">
<select class="form-control" name="country" id="country">
<?php foreach ($CountryList as $row): ?>
<option value="<?=$row["short_name"]?>">
<?=$row["short_name"]?>
</option>
<?php endforeach ?>
</select>
</div>
</div>
另一件值得一提的是,你错过了一个大于开头div的标志