【问题标题】:How to keep form items selected after post request?发布请求后如何保持选择表单项?
【发布时间】:2010-04-05 11:08:39
【问题描述】:

我有一个简单的 html 表单。在 php 页面上。一个简单的列表放置在表单上。我将此表单(选定的列表项)提交到此页面,以便我刷新页面。我希望在提交表单后选择已发布的项目。

对于我的表单,我使用了这样的代码,它工作得很好,但它是最优的还是你可以建议对我的代码进行一些优化?

<form action="FormPage.php" method="post">
   <select id="Streams" class="multiselect ui-widget-content ui-corner-all" multiple="multiple" name="Streams[]">
     <?php      
     $query = "
SELECT s.streamId, s.userId, u.username
FROM streams AS s
JOIN user AS u ON s.userId = u.id
LIMIT 0 , 30
  ";
$streams_set = mysql_query($query, $connection);
    confirm_query($streams_set);    
    $streams_count = mysql_num_rows($streams_set);

while ($row = mysql_fetch_array($streams_set)){


      if (isset($_POST['submitForm'])){

      $array =  $_POST[Streams];
$count = count($array);
echo ",sid=" ;
for ($i = 0; $i < $count; $i++) {
 if($array[$i] == $row['streamId']){  echo '<option value="' , $row['streamId'] , '" selected="selected" >  ' , $row['username'] , ' (' , $row['streamId'] ,')' ,'</option> ';    }else
     {  echo '<option value="' , $row['streamId'] , '">  ' , $row['username'] , ' (' , $row['streamId'] ,')' ,'</option> ';  }
 }
} else { echo '<option value="' , $row['streamId'] , '">  ' , $row['username'] , ' (' , $row['streamId'] ,')' ,'</option> ';}

}
      </select>
      <br/>
      <input type="submit" class="ui-state-default ui-corner-all" name="submitForm" id="submitForm"  value="Play Stream from selected URL's!"/>    
  </fieldset>
</form>

【问题讨论】:

    标签: php html list forms select


    【解决方案1】:

    收到 POST 后,您需要正确更新数据库并在 &lt;option&gt; 元素上设置 selected 属性。例如:

    $streams = $_POST['Streams'];
    $selected = array_combine($streams, array_fill(0, count($streams), true);
    $query = <<<END
    SELECT s.streamId, s.userId, u.username
    FROM streams AS s
    JOIN user AS u ON s.userId = u.id
    LIMIT 0 , 30
    END;
    $streams_set = mysql_query($query, $connection);
    confirm_query($streams_set);    
    $streams_count = mysql_num_rows($streams_set);
    while ($row = mysql_fetch_array($streams_set)) {
      $id = $row['streamId'];
      $sel = $selected[$id] ? ' selected' : '';
      echo '<option value="' , $row['streamId'] , '"' . $sel . '>  ' , $row['username'] , ' (' , $row['streamId'] ,')' ,'</option> ';
    }
    

    话虽如此,这并不是最佳实践,因为如果用户使用浏览器上的后退按钮,它可能会无意中提交表单。出于这个原因,许多人更喜欢使用POST+REDIRECT+GET pattern。

    在您的情况下,脚本将看到它是一个 POST 并将数据保存到数据库中。然后它将向用户发送 HTTP 重定向以重新加载页面或加载不同的 URL(根据需要)。该 GET 请求将具有保存的信息。这会导致额外的服务器往返,但通常会带来更好的用户体验。

    【讨论】:

    • 只是一个注释-不确定是否仅在 xhtml 中,但您应该使用 selected 而不是 selected="selected"
    • @Adam selected 是有效的 HTML。如果您愿意,可以指定selected="selected"。 HTML 规范暗示它w3.org/TR/REC-html40/interact/forms.html#h-17.6
    • @Adam Kiss:这仅适用于 xhtml。 HTML5 不需要布尔属性的属性/值对。
    • hmm 它只是在 $selected = array_combine($streams, array_fill(0, count($streams), true); 行上给我一个错误(即使我将 $query 请求放入“”。 ..)
    【解决方案2】:
    <form action="FormPage.php" method="post">
       <select id="Streams" class="multiselect ui-widget-content ui-corner-all" multiple="multiple" name="Streams[]">
         <?php      
         $query = "
    SELECT s.streamId, s.userId, u.username
    FROM streams AS s
    JOIN user AS u ON s.userId = u.id
    LIMIT 0 , 30
      ";
    $streams_set = mysql_query($query, $connection);
        confirm_query($streams_set);    
        $streams_count = mysql_num_rows($streams_set);
    
    while ($row = mysql_fetch_array($streams_set)){
     echo '<option value="' . $row['streamId'] . '"' . (in_array($row['streamId'], $_POST['Streams']) ? ' selected' : ''). '>  ' . $row['username'] . ' (' . $row['streamId'] .')' .'</option> ';
    } ?>
          </select>
          <br/>
          <input type="submit" class="ui-state-default ui-corner-all" name="submitForm" id="submitForm"  value="Play Stream from selected URL's!"/>    
      </fieldset>
    </form>
    

    【讨论】:

    • 它可以工作,但只保存 1 个选定的项目...(
    • 对不起,我没有看到它是多选的。固定。
    【解决方案3】:

    选择1.去掉刷新并使用AJAX实现表单提交

    选择 2. 当它作为 URL 参数/或其他使用会话传递机制的变量重新加载时将 post 参数发送回表单,如果页面正在重新加载,则通过从 URL/会话中获取值来在表单中显示它们。

    【讨论】:

    • 如果你想支持没有 JS 的用户,选择 1 并不是一个真正的选择。
    【解决方案4】:

    首先,选择字段的名称必须是“Streams[]”而不是“Streams”。否则你不会有多种选择。 另外,你的代码对我来说看起来太意大利面了。我建议你把它分成两部分:业务逻辑和表现逻辑。
    首先,我们获取所有数据:

    <?php      
    $query = "
    SELECT s.streamId, s.userId, u.username
    FROM streams AS s
    JOIN user AS u ON s.userId = u.id
    LIMIT 0 , 30
    ";
    $streams_set = mysql_query($query, $connection);
    confirm_query($streams_set);    
    $streams_count = mysql_num_rows($streams_set);
    
    while ($row = mysql_fetch_array($streams_set)){
      if (in_array($row['streamId'], $_POST['Streams'])) {
        $row['sel'] = 1; 
      } else {
        $row['sel'] = 0;
      }
      $select1[]=$row;
    }
    

    然后,让它输出

    <form action="FormPage.php" method="post">
       <select id="Streams" class="multiselect ui-widget-content ui-corner-all" multiple="multiple" name="Streams[]">
       <? foreach ($select1 as $row): ?>
         <option value="<?=$row['streamId']?>" <?if($row['sel'])?>selected<?endif?> >
           <?=$row['username']?> ( <?=$row['streamId']?> )
         </option>
       <? endforeach ?>
       </select>
          <br/>
          <input type="submit" class="ui-state-default ui-corner-all" name="submitForm" id="submitForm"  value="Play Stream from selected URL's!"/>    
      </fieldset>
    </form>
    

    看起来很整洁,不是吗?

    【讨论】:

    • 嗯,它在 $row['sel'] = 1 中给了我“解析错误:语法错误,意外的 T_ELSE”;否则 $row['sel'] = 0;
    • @Ole,是的,它是在现场编写的,没有一次运行。更正了这个。
    • 它现在运行没有错误但是...我得到 5“警告:in_array() 期望参数 2 是数组,给定空值”在“if (in_array($row['streamId'] , $_POST['Streams'])) {" 所以我没有得到任何形式的项目,只有一个 " "
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2014-06-14
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多