刷新后保持动态下拉列表中的 select 个值
Maintain select values from dynamic drop down list after refresh
我有一个由 11 个元素组成的表单(input 和 select 标签)。该表单具有表单验证功能,当用户输入不正确的数据时,会在字段旁边提示一条错误消息。我想在刷新页面后保持输入到字段中的正确数据。
例如,假设 10 个字段填写正确,1 个字段填写错误。当用户按下提交按钮时,该字段附近会显示一条错误消息。我想做的是保留 10 个正确的值 selected,这样用户就不必重新开始。
对于输入元素,这工作正常,但对于 select 元素,这不起作用。 重要的是我正在使用 PHP.
动态填充下拉列表
这可以在 PHP 中完成吗,因为我不知道怎么做?
下面是我如何生成 select 元素的下拉列表的示例。
select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
echo '<option value="' . htmlspecialchars($row['description']) . '">'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>
</select>
至于输入元素,我使用以下方法实现了这一点:
<input type="text" name="serial" value="<?php echo $serial;?>">
试试这个:
<select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
$selected = "";
if ($row['description'] == $location) {
$selected = " selected";
}
echo '<option value="' . htmlspecialchars($row['description']) . '"' . $selected . '>'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>
</select>
Is this possible to do in PHP since I cannot figure out how?
是的,可以通过在选项元素上使用 selected 属性来保留值 selected。
例如,下面的 <option>
标签包含该属性:
<option value="value2" selected>Value 2</option>
如果您关心 XHTML 验证,请使用 selected="selected"
- 请参阅 this answer 了解更多信息。
<option value="value2" selected="selected">Value 2</option>
来自examples section of the MDN documentation for <select>
,列出了以下HTML:
<!-- The second value will be selected initially -->
<select name="select"> <!--Supplement an id here instead of using 'name'-->
<option value="value1">Value 1</option>
<option value="value2" selected>Value 2</option>
<option value="value3">Value 3</option>
</select>
使用 PHP
呈现 select 列表
要使用 PHP 代码实现此目的,需要有条件地将 selected 属性添加到选项中。
首先,在 while 循环之前,将 selected 位置存储在一个变量中:
$selectedLocation = '';
if (isset($_POST['location'])) {
//Get selected value from values submitted with form
//use $_GET if form is submitted via GET
$selectedLocation = $_POST['location'];
}
然后在 while 循环中,在找到匹配选项时设置 selected 属性(即当 $selectedLocation == $row['description']
).
while($row = mysqli_fetch_assoc()){
$selected = ''; //default to empty string - not selected
if ($selectedLocation == $row['description']) {
$selected = 'selected';
}
echo '<option value="' . htmlspecialchars($row['description']) . '" '.$selected.'>'
. htmlspecialchars($row['description'])
. '</option>';
}
请参阅 this phpfiddle 中的演示。
如 as duplicate linked question 中所述,selected
属性用于标记已提交的选项。 selected
属性解决了使 selected 值可见的问题。
此外,您的代码可以受益于以模块化方式将 select 元素数据绑定到 (SQL) 数据。
让我们暂时不关心数据的检索,只说它们来自 Generator:
/**
* @param string $name of the select field
* @param string $value of the select field
* @param Generator $data to use as select field option values
* @return string HTML of the select element
*/
function select($name, $value, Generator $data) {
$buffer = sprintf('<select name="%s">', htmlspecialchars($name));
foreach ($data as $option) {
$buffer .= sprintf(
'<option%s>%s</option>',
$value === $option ? ' selected' : '',
htmlspecialchars($option)
);
}
$buffer .= "</select>\n";
return $buffer;
}
这个小函数 returns select 元素的 HMTL 以及来自 Generator select 现有值的数据(如果选项的一部分)。
将它与任何生成器结合使用,例如来自数据源的生成器,它可以很容易地放入您的表单模板脚本中:
<form method="post">
<?= select('location', $_POST['location'] ?? 'default value',
datasource($connection, "SELECT description FROM location ORDER BY description ASC", "description")
) ?>
</form>
因此,如果您有 10 个 select,则可以轻松采用。正如您所知的数据库连接被传递给 datasource
函数,看看该函数实际做了什么会很有趣。那个函数就更简单了:
/**
* @param mysqli $mysqli
* @param string $query
* @param string $field from query result to use as option values
* @return Generator
*/
function datasource(mysqli $mysqli, $query, $field) {
$result = $mysqli->query($query);
if ($result) foreach ($result as $row) {
yield $row[$field];
}
}
它查询数据库连接上的查询(这与您的代码中的编写方式不同,但与您的示例中的 $connection
相同)然后迭代结果(如果有结果)。然后产生每个选项值。 yield
是从创建 Generator 的函数返回的一种特殊形式,它在 select
函数中用于输出,通过 Generator 在foreach
循环那里。每次屈服都会成为 Generator.
的一次迭代
我希望这表明您可以如何从将代码划分为函数中获益。变化的值应该放入变量中。这很容易通过创建函数并为这些值使用参数来完成。您可以根据自己的特殊需要扩展语言,例如创建 select 元素。
编辑并尝试:
<select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
$selected = "";
if ($row['description'] == $location) {
$selected = " selected";
}
echo '<option value="' . htmlspecialchars($row['description']) . '"' . $selected . '>'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>
我有一个由 11 个元素组成的表单(input 和 select 标签)。该表单具有表单验证功能,当用户输入不正确的数据时,会在字段旁边提示一条错误消息。我想在刷新页面后保持输入到字段中的正确数据。
例如,假设 10 个字段填写正确,1 个字段填写错误。当用户按下提交按钮时,该字段附近会显示一条错误消息。我想做的是保留 10 个正确的值 selected,这样用户就不必重新开始。
对于输入元素,这工作正常,但对于 select 元素,这不起作用。 重要的是我正在使用 PHP.
动态填充下拉列表这可以在 PHP 中完成吗,因为我不知道怎么做?
下面是我如何生成 select 元素的下拉列表的示例。
select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
echo '<option value="' . htmlspecialchars($row['description']) . '">'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>
</select>
至于输入元素,我使用以下方法实现了这一点:
<input type="text" name="serial" value="<?php echo $serial;?>">
试试这个:
<select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
$selected = "";
if ($row['description'] == $location) {
$selected = " selected";
}
echo '<option value="' . htmlspecialchars($row['description']) . '"' . $selected . '>'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>
</select>
Is this possible to do in PHP since I cannot figure out how?
是的,可以通过在选项元素上使用 selected 属性来保留值 selected。
例如,下面的 <option>
标签包含该属性:
<option value="value2" selected>Value 2</option>
如果您关心 XHTML 验证,请使用 selected="selected"
- 请参阅 this answer 了解更多信息。
<option value="value2" selected="selected">Value 2</option>
来自examples section of the MDN documentation for <select>
,列出了以下HTML:
<!-- The second value will be selected initially -->
<select name="select"> <!--Supplement an id here instead of using 'name'-->
<option value="value1">Value 1</option>
<option value="value2" selected>Value 2</option>
<option value="value3">Value 3</option>
</select>
使用 PHP
呈现 select 列表要使用 PHP 代码实现此目的,需要有条件地将 selected 属性添加到选项中。
首先,在 while 循环之前,将 selected 位置存储在一个变量中:
$selectedLocation = '';
if (isset($_POST['location'])) {
//Get selected value from values submitted with form
//use $_GET if form is submitted via GET
$selectedLocation = $_POST['location'];
}
然后在 while 循环中,在找到匹配选项时设置 selected 属性(即当 $selectedLocation == $row['description']
).
while($row = mysqli_fetch_assoc()){
$selected = ''; //default to empty string - not selected
if ($selectedLocation == $row['description']) {
$selected = 'selected';
}
echo '<option value="' . htmlspecialchars($row['description']) . '" '.$selected.'>'
. htmlspecialchars($row['description'])
. '</option>';
}
请参阅 this phpfiddle 中的演示。
如 as duplicate linked question 中所述,selected
属性用于标记已提交的选项。 selected
属性解决了使 selected 值可见的问题。
此外,您的代码可以受益于以模块化方式将 select 元素数据绑定到 (SQL) 数据。
让我们暂时不关心数据的检索,只说它们来自 Generator:
/**
* @param string $name of the select field
* @param string $value of the select field
* @param Generator $data to use as select field option values
* @return string HTML of the select element
*/
function select($name, $value, Generator $data) {
$buffer = sprintf('<select name="%s">', htmlspecialchars($name));
foreach ($data as $option) {
$buffer .= sprintf(
'<option%s>%s</option>',
$value === $option ? ' selected' : '',
htmlspecialchars($option)
);
}
$buffer .= "</select>\n";
return $buffer;
}
这个小函数 returns select 元素的 HMTL 以及来自 Generator select 现有值的数据(如果选项的一部分)。
将它与任何生成器结合使用,例如来自数据源的生成器,它可以很容易地放入您的表单模板脚本中:
<form method="post">
<?= select('location', $_POST['location'] ?? 'default value',
datasource($connection, "SELECT description FROM location ORDER BY description ASC", "description")
) ?>
</form>
因此,如果您有 10 个 select,则可以轻松采用。正如您所知的数据库连接被传递给 datasource
函数,看看该函数实际做了什么会很有趣。那个函数就更简单了:
/**
* @param mysqli $mysqli
* @param string $query
* @param string $field from query result to use as option values
* @return Generator
*/
function datasource(mysqli $mysqli, $query, $field) {
$result = $mysqli->query($query);
if ($result) foreach ($result as $row) {
yield $row[$field];
}
}
它查询数据库连接上的查询(这与您的代码中的编写方式不同,但与您的示例中的 $connection
相同)然后迭代结果(如果有结果)。然后产生每个选项值。 yield
是从创建 Generator 的函数返回的一种特殊形式,它在 select
函数中用于输出,通过 Generator 在foreach
循环那里。每次屈服都会成为 Generator.
我希望这表明您可以如何从将代码划分为函数中获益。变化的值应该放入变量中。这很容易通过创建函数并为这些值使用参数来完成。您可以根据自己的特殊需要扩展语言,例如创建 select 元素。
编辑并尝试:
<select name="location">
<?php
include("../includes/db_connect.php");
$sql_loc = "SELECT description FROM location ORDER BY description ASC";
$result_loc = mysqli_query($connection, $sql_loc);
if(mysqli_num_rows($result_loc) > 0){
while($row = mysqli_fetch_assoc($result_loc)){
$selected = "";
if ($row['description'] == $location) {
$selected = " selected";
}
echo '<option value="' . htmlspecialchars($row['description']) . '"' . $selected . '>'
. htmlspecialchars($row['description'])
. '</option>';
}
}
?>