日历功能中的Bughunt

时间:2014-07-22 13:52:05

标签: php navigation calendar

我写了一个非常好的日历脚本,直到我想为上个月/下个月/年添加导航。当我用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.'">&lt;</a></td>'."\n");
echo('    <td class="headtd" colspan="3">'.$mnames[$month].' '.$year.'</td>'."\n");
echo('    <td class="headtd"><a href="?y='.$year.'&m='.$nextmonth.'">&gt;</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);

1 个答案:

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