【问题标题】:Option value doesn't match the right value选项值与正确值不匹配
【发布时间】:2019-08-27 08:01:12
【问题描述】:

我有一个包含 21 个季节的 $seasons 变量。对于每个季节,我想在 html 中创建一个您可以选择的选项。如果我按下提交按钮,我希望在提交之前选择的选项仍然被选中。我尝试用这段代码做到这一点:

<select name="season" id="season" class="filter-season">
          <option value="all">-- Alle seizoenen --</option>
          <?php foreach($seasons as $season): ?>
          <option <?php if (isset($_GET['season']) == $season['season']){?> selected = "true" <?php }; echo "selected" ?>\value="<?php echo $season['season'] ?>"><?php echo $season['season']; ?></option>
          <?php endforeach; ?>
 </select>

问题是选项的值总是跳回21。

【问题讨论】:

    标签: php html select option selected


    【解决方案1】:

    你需要

    selected="selected"

    而不是

    selected=true

    <select name="season" id="season" class="filter-season">
    <option value="all">-- Alle seizoenen --</option>
    <?php foreach($seasons as $season): ?>
    <?php
    $isSelected = (isset($_GET['season']) && $_GET['season'] == $season['season']) ? 'selected="selected"' : '';
    ?>
    <option <?php echo $isSelected;?> value="<?php echo $season['season'] ?>"><?php echo $season['season'];?></option>
    <?php endforeach; ?>
    </select>
    

    【讨论】:

    • isset(...) 返回 boolean
    • 深入了解代码 OP 提供了更多信息:每个正在生成的 option 元素将始终具有 selected 属性 (selected = "true")。 selected 属性的存在足以将option 设置为当前选定的元素(忽略其实际值)。因此,添加到 DOM 的最后一个将成为默认选择的那个,在 OPs 情况下表现为第 21 个选择。
    • 现在,您允许显示 undefined index "season" 警告
    • 现在添加 isset() 条件。
    • 现在好了,但是你忘了在&lt;option之前关闭php标签
    【解决方案2】:

    这取决于您的数组类型,但对于普通数组:

     $seasons = [
         'winter',
         'summer'
     ];
     $selected_season = isset($_GET['season']) ? $_GET['season'] : false;
    
    
     <select name="season" id="season" class="filter-season">
         <option value="all">Alle seizoenen</option>
         <?php foreach($seasons as $season): ?>
             <option value="<?= $season; ?>" <?php $season == $selected_season ? 'selected="selected"' : ''?>><?= $season; ?></option>
         <?php endforeach; ?>
     </select>
    

    【讨论】:

      【解决方案3】:

      你犯了一个错误。 我已经重写了你的代码:

      <select name="season" id="season" class="filter-season">
          <option value="all">-- Alle seizoenen --</option>
          <?php foreach($seasons as $season): ?>
              <option <?php if (isset($_GET['season']) &&  $_GET['season'] == $season['season']) echo "selected" ?> value="<?php echo $season['season'] ?>"><?php echo $season['season']; ?></option>
          <?php endforeach; ?>
      </select>
      

      您的 "echo selected" 调用超出了您的 if 语句。在您的情况下,您选择了所有选项,然后您的浏览器显示最后选择的选项,在您的情况下,选项 21。您的 if 语句 本身也是错误的。

      我已经重写了你的代码。它现在检查是否设置了 $_GET['season'] 以及 $_GET['season'] 是否等于 $season['season']

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 2016-07-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        相关资源
        最近更新 更多