Как сохранить элементы формы выбранными после отправки запроса? - PullRequest
2 голосов
/ 05 апреля 2010

У меня есть простая форма 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>

Ответы [ 4 ]

4 голосов
/ 05 апреля 2010

Когда вы получите 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 .

В вашем случае скрипт увидит, что это POST и сохранит данные в базе данных. Затем он отправит пользователю HTTP-перенаправление, чтобы перезагрузить страницу или загрузить другой URL-адрес (при необходимости). Этот запрос GET будет содержать сохраненную информацию. Это приводит к дополнительному обращению к серверу, но, как правило, к улучшению взаимодействия с пользователем.

2 голосов
/ 05 апреля 2010
<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>
0 голосов
/ 05 апреля 2010

Прежде всего, имя поля выбора должно быть «Streams []», а не «Streams». Или вы не получите несколько вариантов. Кроме того, ваш код выглядит слишком спагетично для меня. Я предлагаю вам разделить его на 2 части: бизнес-логика и логика представления.
Сначала мы получаем все данные:

<?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 голосов
/ 05 апреля 2010

Вариант 1. Удалить обновление и реализовать отправку формы с помощью AJAX

Вариант 2. Отправьте обратно параметры записи в форму, когда она перезагружается в виде параметров URL / или какой-либо другой переменной, передающей механизм с использованием сеансов, и отображайте их в форме, получая значения из URL / сеанса, если страница перезагружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...