我写了一个日历脚本,工作得很好,直到我想添加导航上/下个月/年。当我调用printmonth($m,$y);当我调用printmonth($m+1,$y)时,它工作并显示当前月份;下个月就出现了。现在我手动添加了导航到NOT调用函数,它不起作用,它显示了今年的12月。总是这样。它甚至尝试导航到第13个月,尽管我添加了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);
你不应该用
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月…
当我自己运行你的函数时,它工作了…尽管一个人得到了很多警告…
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们联机29
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们联机30
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们31
Warning: mktime() [function. s]mktime]:依赖系统的时区设置是不安全的。要求来使用日期。时区设置或date_default_timezone_set()函数。万一你用了这些方法,你仍然收到此警告,您很可能拼错了时区标识符。我们为"EDT/-4.0/DST"选择了"America/New_York"在线33
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们在line 33
Warning: mktime() [function. s]mktime]:依赖系统的时区设置是不安全的。要求来使用日期。时区设置或date_default_timezone_set()函数。万一你用了这些方法,你仍然收到此警告,您很可能拼错了时区标识符。我们为"EDT/-4.0/DST"选择了"America/New_York"在线34
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们34
Warning: mktime() [function. s]mktime]:依赖系统的时区设置是不安全的。要求来使用日期。时区设置或date_default_timezone_set()函数。万一你用了这些方法,你仍然收到此警告,您很可能拼错了时区标识符。我们为"EDT/-4.0/DST"选择了"America/New_York"在线39
Warning: date() [function。:依赖系统的时区设置是不安全的。要求使用的日期。时区设置或date_default_timezone_set()函数。如果你用了这些方法,你还是会得到这个警告,您很可能拼错了时区标识符。我们联机39