【问题标题】:Populate drop down form with months and year php用月份和年份 php 填充下拉表单
【发布时间】:2015-01-14 21:08:46
【问题描述】:

我正在尝试使用 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 年)的日期名称和编号。

【问题讨论】:

  • 您将无法根据用户输入动态显示第二个下拉列表,而无需在发送页面之前预填充数组,然后使用 js 显示所选年份或通过将表单发送到得到年份。

标签: php html date strtotime mktime


【解决方案1】:

我不得不检查第一个脚本的打印,因为它没有多大意义......

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

但这似乎不是问题,至少在 chrome 中不是,因为当我检查正在发送的头部数据时,它很好:

month: 11

当您发送变量时会发生什么,无论您使用 POST 方法发送此表单数据的任何页面都必须进一步处理它。在 PHP 中,您可以使用全局变量 $_POST,在本例中为 $_POST['month']。

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

如果你想让它成为一个会话变量,你发送表单数据的页面将必须与你的浏览器通信来设置它(通过回复 HTTP 标头字段)。要在 PHP 中执行与会话相关的任何操作,您必须首先使用 session_start() 启动会话,然后再向浏览器发送任何 HTML/数据,如果您想使用例如 session_set_cookie_params 设置会话变量,同样如此。您还获得了setcookie,在将任何数据/HTML 发送到浏览器之前也必须使用它,并且可以通过$_COOKIE 访问变量。

看看你能不能理解这一点,我刚刚在这种情况下使用了 $_POST,你可以将它与 session 或 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>';
?>

【讨论】:

  • 通过邮局发送月份,但我如何确定哪一年并将其也发送到邮局?
  • 您可以做很多事情,例如提供一个与该月份和年份组合相匹配的时间戳。或者只是将其格式化为“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>

这给了我年份和月份作为单独的值。

【讨论】:

  • 非常有用,谢谢。虽然缺少结束 标记 :)
【解决方案3】:
  <select required="" class="btn btn-warning btn-raised" onchange="loadMonthYear(this)">
     <?php
        $fdt = date('Y-m-1');
        $tdt = date('Y-m-1', strtotime("-12 months"));
        while (date('Ymd', strtotime($fdt)) >= date('Ymd', strtotime($tdt))) {
                    
            echo '<option value="'.date('M, Y', strtotime($fdt)).'"><a data-tag="' . date('M, Y', strtotime($fdt)) . '" href="javascript: void(0);">' . date('M, Y', strtotime($fdt)) . '</option>';      
            $fdt = date('Y-m-1', strtotime("-1 months", strtotime($fdt)));
        }
    ?>               
</select>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多