我写了一个非常好的日历脚本,直到我想为上个月/下个月/年添加导航。当我用printmonth($ m,$ y)调用该函数时;它工作并显示当月,当我打电话给printmonth($ m + 1,$ y);它显示了下个月。现在我手动添加导航到NOT调用功能它不起作用,它显示当年的12月。总是。它甚至试图导航到13个月althogh我添加if语句来检查它是一年中的最后一个月还是一年中的第一个月。如果你看到可疑的东西请评论,我知道它的结构很糟糕,变量名不是很漂亮,但我正在用PHP做我的第一步。
感谢您的时间和反馈,这是我的功能:
function printmonth($month,$year) {
// abort if invalid values
if($month>=13) { die("No month >=13 please"); };
if(($year<=1970) || ($year>=3000)) {die("No year <=1970 or >=3000 please");};
// an array of names
$mnames = array(
1 => "Januar",
2 => "Februar",
3 => "März",
4 => "April",
5 => "Mai",
6 => "Juni",
7 => "Juli",
8 => "August",
9 => "September",
10 => "Oktober",
11 => "November",
12 => "Dezember"
);
// more vars
$month = intval($month);
$year = intval($year);
$thisday = intval(date('j'));
$thismonth = intval(date('m'));
$thisyear = intval(date('Y'));
$weekday = date("N", mktime(0,0,0,$month,"01",$year));
$lastdayofmonth = date('t', mktime(0,0,0,$month,2,$year));
$oneless = $weekday-1;
/* calculate end of last month */
$lastdayoflastmonth = date('t', mktime(0,0,0,$month-1,2,$year));
$pp=$lastdayoflastmonth-$oneless+1;
$seven = 0+$weekday;
// next year/month... problem must be somewhere in this section
$prevyear = $year-1;
$nextyear = $year+1;
if ($month=1) { $prevmonth=12; $nextmonth=$month+1; };
if ($month=12) { $prevmonth=$month-1; $nextmonth=1; };
if (($month>=2) || ($month<=11)) {$prevmonth=$month-1; $nextmonth=$month+1;};
// print table head and navigation and day names
echo('<table class="cal">'."\n");
echo('<tr class="headnav">'."\n");
echo(' <td class="headtd"><a href="?y='.$prevyear.'&m='.$month.'">|<</a></td>'."\n");
echo(' <td class="headtd"><a href="?y='.$year.'&m='.$prevmonth.'"><</a></td>'."\n");
echo(' <td class="headtd" colspan="3">'.$mnames[$month].' '.$year.'</td>'."\n");
echo(' <td class="headtd"><a href="?y='.$year.'&m='.$nextmonth.'">></a></td>'."\n");
echo(' <td class="headtd"><a href="?y='.$nextyear.'&m='.$month.'">>|</a></td>'."\n");
echo('</tr>'."\n");
echo('<tr class="head">'."\n");
echo(' <td class="headtd">Mo</td>'."\n");
echo(' <td class="headtd">Di</td>'."\n");
echo(' <td class="headtd">Mi</td>'."\n");
echo(' <td class="headtd">Do</td>'."\n");
echo(' <td class="headtd">Fr</td>'."\n");
echo(' <td class="headtd">Sa</td>'."\n");
echo(' <td class="headtd">So</td>'."\n");
echo('</tr>'."\n");
echo(' <tr>'."\n");
//print end of last month
for ($l=1;$l<=$oneless;$l++) {
echo('<td class="placebegin">'.$pp.'</td>'."\n");
$pp++;
};
// print each day until last day of month
for ($x=1;$x<=$lastdayofmonth;$x++)
{
if (($x==$thisday) && ($thismonth==$month) && ($thisyear==$year))
{$bold = 1;}
else {$bold = 0;};
if ($seven<=7) {
if ($bold = 1)
{ echo('<td class="today"><a href="tage.php?d='.$x.'&m='.$month.'&y='.$year.'" class="tag">'.$x.'</a></td>'."\n"); }
else { echo('<td class="row"> <a href="tage.php?d='.$x.'&m='.$month.'&y='.$year.'" class="tag">'.$x.'</a></td>'."\n");};
$seven++;
} else {
echo('</tr><tr>');
$seven = 1;
$x--;
};
};
// print numbers until row is complete
$p = 1;
for ($e=$seven;$e<=7;$e++) { echo('<td class="placebegin">'.$p.'</td>'); $p++; };
// complete table
echo (' </tr> ');
echo (' </table>');
//done
};
//function ends here, the call and some vars:
if (isset($_GET['y']) && (!empty($_GET['y'])))
{
$y=intval($_GET['y']);
}
else
{
$y = intval(date('Y'));
};
if (isset($_GET['m']) && (!empty($_GET['m'])))
{
$m=intval($_GET['m']);
}
else
{
$m = intval(date('n'));
};
// call function
printmonth($m, $y);
答案 0 :(得分:0)
你不应该使用
if($month == 1)//condition
而不是
if($month = 1)//assignment
以及第二个if
。
第三个if必须使用&&
而不是||
,因此替换
if (($month>=2) || ($month<=11))
通过
if (($month>=2) && ($month<=11))
分配成功并且(如果我正确地回想一下,如果在操作之后设置了您指定的变量)。因此$month = 1
成功。结果,$prevmonth
设置为12
,因此12月......
当我自己运行你的功能时,它有效......虽然有很多警告......
警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在线 29
警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在 30
上警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在 31
上警告:mktime()[function.mktime]:依靠系统的时区设置是不安全的。您必需来 使用date.timezone设置或date_default_timezone_set() 功能。如果你使用了这些方法中的任何一种而你仍然存在 得到这个警告,你很可能拼错了时区 标识符。我们选择了&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;代替 在线 33
警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在 33
上警告:mktime()[function.mktime]:依赖系统的时区设置是不安全的。您必需来 使用date.timezone设置或date_default_timezone_set() 功能。如果你使用了这些方法中的任何一种而你仍然存在 得到这个警告,你很可能拼错了时区 标识符。我们选择了&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;代替 在线 34
警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在线 34
警告:mktime()[function.mktime]:依赖系统的时区设置是不安全的。您必需来 使用date.timezone设置或date_default_timezone_set() 功能。如果你使用了这些方法中的任何一种而你仍然存在 得到这个警告,你很可能拼错了时区 标识符。我们选择了&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;代替 在线 39
警告:date()[function.date]:依赖系统的时区设置是不安全的。您必需才能使用 date.timezone设置或date_default_timezone_set()函数。 如果你使用了这些方法中的任何一种,你仍然会得到这个 警告,你很可能拼写错误的时区标识符。我们 选择&#39; America / New_York&#39;对于EDT / -4.0 / DST&#39;而是在线 39