刷新后从动态下拉列表中维护选择值

我有一个由11个元素组成的表单(输入和选择标签)。 表单具有表单验证功能,当用户输入错误的数据时,会在字段旁边提示错误消息。 我想在页面刷新后保持输入到字段中的正确数据。

例如,假设有10个字段正确填充,1个字段不正确。 当用户按下提交按钮时,在该字段附近显示错误消息。 我想要做的是保持10个正确的值被选中,以便用户不必再次重新开始。

对于输入元素,这是工作正常,但选择元素这是行不通的。 重要的是,我正在用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>

如重复链接问题中所述, selected属性用于标记已提交的选项。 selected属性解决了问题,使选定的值可见。

此外,您的代码可以通过模块化方式将select元素绑定到(SQL)数据。

让我们不关心检索数据的一瞬间,只是说它们来自发生器

/**
 * @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;
}

这个小函数返回选择元素的HMTL和来自发生器的数据,选择一个现有值(如果是选项的一部分)。

将它与任何生成器相结合,例如从数据源,它可以很容易地放入您的表单模板脚本中:

<form method="post">

<?= select('location', $_POST['location'] ?? 'default value',
    datasource($connection, "SELECT description FROM location ORDER BY description ASC", "description")
) ?>

</form>

所以如果你有10个选择,这很容易被采用。 正如你所知的数据库连接被传递给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函数中用于输出,方法是让Generatorforeach循环中。 每个屈服变成发生器的一次迭代。

我希望这可以显示如何将代码划分为函数。 改变的值应该被放入变量中。 这很容易通过创建函数和使用这些值的参数来完成。 您可以根据自己的特殊需求来扩展语言,例如创建选择元素。


这是可能的,因为我无法弄清楚如何在PHP中做?

是的,可以通过使用选项元素上的选定属性来保持选定的值。

例如,下面的<option>标签包含该属性:

<option value="value2" selected>Value 2</option>

如果您关心XHTML验证,请使用selected="selected" - 请参阅此答案以获取更多信息。

<option value="value2" selected="selected">Value 2</option>

<select>的MDN文档的示例部分列出了以下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>
链接地址: http://www.djcxy.com/p/88089.html

上一篇: Maintain select values from dynamic drop down list after refresh

下一篇: PHP Update content chosen in a drop down list in a form on edit