2010-04-05 76 views
2

我有一个简单的HTML表单。在PHP页面上。一个简单的列表放在窗体上。我将此表单(选定列表项目)提交到此页面,以便让页面刷新。我希望在表单被提交后选择POSTED的项目。如何在发布后请求选择表单项?

对于我的形式我用这样的代码,它工作得很好,但它是最佳的,或者你可以建议我的代码一些优化?

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

回答

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

它工作,但只保存1所选项目...( – Rella 2010-04-05 11:53:01

+0

对不起,我没有看到,它是多项选择固定 – vooD 2010-04-05 12:31:28

4

当您收到的POST,你需要正确地更新数据库,并设置selected属性上<option>元素。例如:

$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请求将具有保存的信息。这会导致额外的服务器往返,但通常会带来更好的用户体验。

+1

只是一张纸条 - 如果只在XHTML不知道,但不是'selected',你应该使用'选择=“选择”' – 2010-04-05 11:17:00

+0

@Adam'selected'是有效的HTML。如果你愿意,你可以指定'selected =“选择”'“。 HTML规范暗示它http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.6 – cletus 2010-04-05 11:18:25

+0

@Adam吻:这只适用于xhtml。 HTML5不需要布尔属性的属性/值对。 – 2010-04-05 11:19:17

0

选择1.拆下刷新和实现形式提交使用AJAX

选择2.发送回来后参数的形式,当它重新加载为URL参数/或使用会话其他一些变量传递mechanish,并告诉他们在如果页面重新加载,则从URL /会话获取值。

+0

选择1是不是一个真正的选择 – 2010-04-05 11:18:41

+0

@Andy:我同意 – Umesh 2010-04-05 14:42:03

0

首先选择字段的名称必须是“Streams []”而不是“Streams”。或者你不会得到多个选择。 另外,你的代码对我来说看起来太spaghetty。我建议你将它分成两部分:业务逻辑和表示逻辑。
首先,我们得到的所有数据:

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

看起来整洁,不是吗?

+0

嗯,它给了我 “解析错误:语法错误,意外T_ELSE” 在$行[ 'SEL'] = 1;否则$行[ 'SEL'] = 0; – Rella 2010-04-05 11:51:36

+0

@Ole,是的,它。是现场写的,没有一次运行,更正了这一个。 – 2010-04-05 12:06:22

+0

它现在没有错误运行,但是...我得到5“警告:in_array()期望参数2是数组,空给出”in“if(in_array($ row ['streamId']​​,$ _POST ['Streams'])){” 所以我得到没有项目在形式,但一个“” – Rella 2010-04-05 12:42:12

相关问题