首页 文章

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

提问于
浏览
8

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

例如,假设正确填充的10个字段和1个字段不正确 . 当用户按下提交按钮时,字段附近会显示错误消息 . 我想要做的是保持选择10个正确的值,这样用户就不必重新开始了 .

对于输入元素,这工作正常,但对于选择元素,这是行不通的 . Important is that I am populating the drop down list dynamically with 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;?>">

4 回答

  • 2

    编辑并尝试:

    <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>';
            }
        }                                             
    ?>
    
  • 2

    这是可以用PHP做的,因为我无法弄清楚如何?

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

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

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

    如果您关心XHTML验证,请使用 selected="selected" - 有关详细信息,请参阅this answer .

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

    <select>的MDN文档的examples section中,列出了以下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渲染选择列表

    要使用PHP代码实现此目的,需要将 selected 属性有条件地添加到选项中 .

    首先,在while循环之前,将选定的位置存储在变量中:

    $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循环中,在找到匹配选项时设置所选属性(即 $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中对此的解释 .

  • 0

    试试这个:

    <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>
    
  • 3

    as duplicate linked question中所述, 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;
    }
    

    这个小函数返回一个select元素的HMTL,其数据来自 Generator ,选择一个现有值(如果是选项的一部分) .

    将它与任何生成器(例如,从数据源)组合,可以轻松地将其放入表单模板脚本中:

    <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];
        }
    }
    

    它查询数据库连接上的查询(它与您的示例中的's a different way of writing as in your code, but it'相同)然后迭代结果(如果有结果) . 然后产生每个选项值 . yield 是一个特殊的形式,从函数返回创建 Generator ,在 select 函数中用于输出,通过在 foreach 循环中使用 Generator . 每个屈服都成为 Generator 的一次迭代 .

    我希望这能说明如何将代码划分为函数 . 更改的值应放入变量中 . 通过创建函数和使用这些值的参数可以轻松完成此操作 . 您可以根据自己的特殊需求扩展语言,例如创建选择元素 .

相关问题