Заполните раскрывающуюся форму месяцами и годами php

Я пытаюсь создать два раскрывающихся списка с помощью HTML и PHP. Первый - это автоматическая отправка, которая отправляет месяц в переменную сеанса:

<form action="" method="post">
      <select name="month" onchange="this.form.submit()">
        <option value="">-- Select Month --</option>
        <?php $month = date('n'); // current month
         for ($x = 0; $x < 12; $x++) { ?>
          <option value="<?php echo date('m', mktime(0,0,0,$month + $x,1)); ?>" 
          <?php echo date('m', mktime(0,0,0,$month + $x,1)) == $_SESSION['month'] ? "selected='selected'":""; ?> >
          <?php echo date('F Y', mktime(0,0,0,$month + $x,1)); ?>
         <?php } ?>
      </select>
    </form>

Это прекрасно работает. Но затем мне понадобится второй выпадающий список с названием и номером дня:

<form action="" method="post">
      <select name="day" onchange="this.form.submit()">
        <option value="">-- Select Day --</option>
        <?php for ($i = $current_day; $i < 31; $i++) { 
        $tmp_date = $_SESSION['year']."/".$_SESSION['month']."/".$i; 
              $weekday = date('D', strtotime($tmp_date));  { ?>
        <option value="<?php echo $i; ?>" <?php echo $i == $_SESSION['day'] ? "selected='selected'":""; ?> >
        <?php echo $weekday." ".$i; ?>
     <?php  } ?>  
     <?php } ?>
        </option>
        <?php } ?>
      </select>
    </form>

Здесь используется временная дата с переменной сеанса как «2014», которую я установил ранее. Мне нужно удалить переменную года сеанса и получить первое раскрывающееся меню, чтобы узнать, в каком году выбран месяц, а затем передать это временной дате, чтобы она правильно заполняла имя дня и номер для следующего года (2015), если вы выберете Январь и далее. На данный момент в этом случае отображается только название дня и номер текущего года (2014).


person Pete Naylor    schedule 17.11.2014    source источник
comment
вы не сможете отображать второй раскрывающийся список динамически на основе пользовательского ввода без предварительного заполнения массивов перед отправкой страницы и последующего использования js для отображения выбранного года или выполнения этого путем отправки формы для получения года.   -  person Billy    schedule 18.11.2014


Ответы (2)


<?php
if(isset($_POST)) {
    $date = explode('-', $_POST['month']);
    $year = $date[0];
    $month = $date[1];
    echo "Year: ".$year." Month: ".$month;
}
?>

<form action="" method="post">
<select name="month" onchange="this.form.submit()">
<?php
  for ($i = 0; $i <= 12; ++$i) {
    $time = strtotime(sprintf('+%d months', $i));
    $value = date('Y-m', $time);
    $label = date('F Y', $time);
    printf('<option value="%s">%s</option>', $value, $label);
  }
  ?>
</select>

Это дает мне год и месяц как отдельные значения.

person Pete Naylor    schedule 18.11.2014
comment
Очень полезно, спасибо. Однако отсутствует тег конца ‹/form› :) - person Collins; 04.07.2016

Мне пришлось проверить распечатку первого сценария, потому что это не имело особого смысла ...

<form action="" method="post">
      <select name="month" onchange="this.form.submit()">
        <option value="">-- Select Month --</option>
                  <option value="11" 
           >
          November 2014                   <option value="12" 
           >
          December 2014                   <option value="01" 
           >
          January 2015                   <option value="02" 
           >
          February 2015                   <option value="03" 
           >
          March 2015                   <option value="04" 
           >
          April 2015                   <option value="05" 
           >
           May 2015                   <option value="06" 
           >
          June 2015                   <option value="07" 
               >
          July 2015                   <option value="08" 
           >
          August 2015                   <option value="09" 
           >
          September 2015                   <option value="10" 
           >
          October 2015               </select>
    </form> 

Возможно, мне что-то не хватает, потому что вроде бы это сработало, но не похоже, что вы закрываете теги опций. Вы делаете это:

<option value="11">November 2014
<option value="12">December 2014

Вместо этого:

<option value="11">November 2014</option>
<option value="12">November 2014</option>

Это не похоже на проблему, по крайней мере, не в хроме, потому что, когда я проверил отправляемые данные заголовка, все было в порядке:

month: 11

Что происходит, когда вы отправляете переменную, так это то, что любая страница, на которую вы отправляете эти данные формы с помощью метода POST, должна будет обрабатывать ее дальше. В PHP это делается с помощью глобальной переменной $ _POST, в данном случае $ _POST ['месяц'].

if(!empty($_POST['month']))
{
    echo $_POST['month'];
}

Если вы хотите сделать его переменной сеанса, страница, на которую вы отправляете данные формы, должна будет связаться с вашим браузером, чтобы установить это (через поле заголовка HTTP ответа). Чтобы сделать что-либо, связанное с сеансом в PHP, вы должны сначала запустить сеанс с помощью session_start () перед отправкой в ​​браузер любого HTML / данных, и то же самое происходит, если вы хотите установить переменную сеанса, например, session_set_cookie_params. У вас также есть setcookie, который также необходимо использовать перед отправкой любых данных / HTML. в браузер, а доступ к переменным можно получить через $ _COOKIE.

Посмотрите, можете ли вы понять это, я только что использовал $ _POST в этом случае, вы можете заменить его сеансом или файлом cookie и не забудьте отправить его перед любыми данными / html в браузер.

<?php
$selmonth = 0;
if(!empty($_POST['month']))
{
    $selmonth = $_POST['month'];
}
$month = date('n'); // current month
echo '<form action="" method="post">
<select name="month" onchange="this.form.submit()">
    <option value="">-- Select Month --</option>';
for($i=0; $i<12; $i++)
{
    $monthtime = mktime(0,0,0,$month + $i,1);
    $monthnum = date('m', $monthtime);
    echo '
    <option value="'.$monthnum.'"'.
    ($monthnum == $selmonth ? ' selected="selected"' : '').
    '>'.date('F Y', $monthtime).'</option>';
}
echo '
</select>
</form>';
?>
person Horse SMith    schedule 18.11.2014
comment
Это отправляет месяц по почте, но как я могу определить, в каком году, и отправить его тоже по почте? - person Pete Naylor; 18.11.2014
comment
Есть много вещей, которые вы можете сделать, например, просто поставить отметку времени, которая соответствовала бы комбинации месяца и года. или просто отформатируйте его до 11,2014. - person Horse SMith; 18.11.2014