【问题标题】:Maintain select values from dynamic drop down list after refresh刷新后保持从动态下拉列表中选择的值
【发布时间】:2017-10-15 15:52:07
【问题描述】:

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

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

对于输入元素,这工作正常,但对于选择元素,这不起作用。 重要的是我正在使用 PHP 动态填充下拉列表。

由于我不知道怎么做,这可能在 PHP 中实现吗?

以下是我如何生成选择元素的下拉列表的示例。

    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;?>">

【问题讨论】:

  • @Blackbam 仅供参考,您发布的链接有一个非常不同的问题
  • @asish 是的,但重复不是关于问题,而是关于答案。我链接的线程包含一个答案,您必须放置所选的 HTML 属性,这解决了问题。

标签: php html netbeans selected


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    正如as duplicate linked question 中所述,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,其中的数据来自一个 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];
        }
    }
    

    它查询数据库连接上的查询(它与您的代码中的编写方式不同,但与您的示例中的$connection 相同)然后迭代结果(如果有结果)。然后产生每个选项值。 yield 是从创建 Generator 的函数返回的一种特殊形式,该函数在 select 函数中用于输出,通过在 @987654331 中添加 Generator @ 循环在那里。每个收益都成为 Generator 的一次迭代。

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

    【讨论】:

      【解决方案3】:

      这是否可以在 PHP 中实现,因为我不知道怎么做?

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

      例如,下面的&lt;option&gt; 标记包含该属性:

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

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

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

      来自 &lt;select&gt; 的 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 循环中,在找到匹配选项时设置该 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 中查看演示。

      【讨论】:

        【解决方案4】:

        编辑并尝试:

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

        【讨论】:

          猜你喜欢
          • 2021-07-16
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-04
          • 1970-01-01
          相关资源
          最近更新 更多