2010-04-05 67 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