# frage zu dem php kalender tutorial



## Rios (5. November 2002)

Also hab den code bis auf bissel css und die veränderung, dass der kalender erst 2001 anfängt nicht verändert, hab dann aber festgestellt, dass bei oktober-november was nicht stimmt:
der 31.10.2002 is laut kalender ein freitag, der 1.11.2002 aber auch..
hier is das mal online, da mit man sehen kann was ich meine 
online beispiel 


```
<?php
define("EINTAG", (60*60*24) );
if ( ! checkdate( $monat, 1, $jahr ) )
    {
     $heuteArr = getdate();
    $monat = $heuteArr[mon];
    $jahr = $heuteArr[year];
    }
$start = mktime ( 0, 0, 0, $monat, 1, $jahr );
$ersterArr = getdate($start);

?>


<html>
<head>
<title><?php print "Kalendar: $ersterArr[month]
        $ersterArr[year]" ?></title>
<style>P,TD,TH {color: #000000;font-size: 12px;font-family: Verdana, Arial, Helvetica, sans-serif;}</style>

</head>
<body>
<form action="<? print $PHP_SELF ?>" method="post">
<select name="monat">
<?php
$monate = Array("Januar", "Februar", "März", "April",
                "Mai", "Jui", "Juli", "August", "September",
                "Oktober", "November", "Dezember");
for ( $x=1; $x <= count( $monate ); $x++ )
    {
    print "\t<option value=\"$x\"";
    print ($x == $monat)?" SELECTED":"";
    print ">".$monate[$x-1]."\n";
    }
?>
</select>
<select name="jahr">
<?php
for ( $x=2001; $x<2010; $x++ )
    {
    print "\t<option";
    print ($x == $jahr)?" SELECTED":"";
    print ">$x\n";
    }
?>
</select>
<input type="submit" value="Los geht's!">
</form>

<p>
<?php
$days = Array("Sonntag", "Montag", "Dienstag", "Mittwoch",
              "Donnerstag", "Freitag", "Samstag");
print "<TABLE cellspacing='5' CELLPADDING=7 bgcolor='#eeeeee'>\n";
foreach ( $days as $day )
    print "\t<td style='border: 1px solid gray'  bgcolor='#dddddd'><b>$day</b></td>\n";


for ( $zaehler=0; $zaehler < (6*7); $zaehler++ )
    {
    $tagArr = getdate( $start );
if ( (($zaehler) % 7) == 0 )
        {
        if ( $tagArr[mon] != $monat )
            break;
        print "</tr><tr>\n";
        }
if ( $zaehler < $ersterArr[wday] || $tagArr[mon] != $monat )
        {
        print "\t<td style='border: 1px solid gray' bgcolor='#ffffff'><br></td>\n";
        }
else
        {
        print "\t<td style='border: 1px solid gray' bgcolor='#ffffff'>$tagArr[mday] $tagArr[month]</td>\n";
        $start += EINTAG;
        }
    }
print "</tr></table>";
?>
</body>
```

Die anderen monate hab ich jetzt nicht mitm kalender überprüft , ka ob das der einzige fehler ist, aber woran köntne das liegen?


----------



## RoninRobert (19. Oktober 2003)

Bei mir der gleiche Fehler. Ist immer nur im Oktober, aber dafür in jedem Jahr! Immer der letzte das Datum des letzten Montags wird doppelt eingetragen!
Gruß Ronin


----------



## won_gak (19. Oktober 2003)

Naja, dann seht mal in der PHP Bug-List nach, ob dieser Bug schon aufgenommen wurde. Wenn nicht, postet diesen.
Dann erhaltet ihr auch weitere Informationen...


----------



## RoninRobert (19. Oktober 2003)

Sorry, aber was für eine Bugliste meinst du?
Gruß Ronin


----------



## won_gak (19. Oktober 2003)

Hier: Report PHP Bugs


----------



## RoninRobert (19. Oktober 2003)

meinst du wirklich, dass das ein Bug von PHP ist und nicht irgendein Fehler im Programm? Außerdem müsste man noch wissen, welche Funktion den Fehler verursacht.

Gruß Ronin


----------



## danube (19. Oktober 2003)

Mal ganz langsam.....

Bei meinem selbst gecodeten Kalender ist der 31.10 ein Freitag und der 1.11 ein Samstag, so wie es auch sein soll!

Also fragt erstmal beim Tutorial Autor nach, wo auch immer ihr das her habt!

Oder am besten selber coden


----------



## won_gak (19. Oktober 2003)

Ich sagte ja, erst einmal nachsehen ob es sich um einen Bug handelt, bzw. ob ein solcher gelistet ist. Wenn es bei danube funktioniert, müsst ihr eben euren Code nochmal checken.


----------



## Rios (22. Oktober 2003)

oh da hat jemand nen alten thread ausgegraben  
also das ist kein php bug, weil der fehler nicht daher kommt, dass irgend eine datumsfunktion falsche ergebniss ausgibt, sondern die schleife wo die variable $zaehler erhöht wird, komischerweise im oktober 2 mal hintereinander den gleichen wert ausgibt. Zu sehen wenn man sich mal an jedem tag mit echo $zaehler den wert anschaut.

keine ahnung mehr von welchem tutorial der code ist, glaube aber aus dem forum hier, habs auch nie geschafft rauszufinden woran es liegt


----------



## RoninRobert (24. Oktober 2003)

Aber dann muss es doch letzendlich ein Bug von PHP sein, wenn dieser Befehl:

```
for ( $zaehler=0; $zaehler < (6*7); $zaehler++ )
```
 zweimal den gleichen Wert ausgibt. Die Frage ist nur, warum das gerade im Oktober passiert.

Gruß Ronin


----------



## Rios (24. Oktober 2003)

ja gute frage 

der wert $start wird ja bei jedem durchlauf um EINTAG (sekunden einens tages) erhöht und damit wird mit der date funktion das datum erzeugt

nur im oktober gibt es einen tag wo das nicht hinhaut... da is guter rat teuer


----------



## LegoTiger (2. Februar 2004)

Hallo Zusammen,
Hier ein Tip, wie es bei mir funktioniert hatt.

Setzt bei der ersten Zuweisung von "$start" den optionalen Parameter für Sommer/Winterzeit auf "0" (Standard ist "-1").
Also:

```
$start = mktime ( 0, 0, 0, $monat, 1, $jahr,0 );
```

Gruß

Ralf


----------



## RoninRobert (9. Februar 2004)

genial das klappt 

danke

Ronin


----------



## vern (17. Juni 2004)

Hallo ihr,

hab das gleiche Problem.
allerdings im August.
ansonsten stimmen alle.

Habe das Sommer-/Winterzeit-Parameter hinzugefügt, das tuts aber leider nicht.

Hat da jemand vielleicht ne Lösung?


----------



## aktionkuba (26. Februar 2005)

hallo,
ich hab mir das script auch angeschaut. gibt es eine möglichkeit, dass anstatt mit sonntag mit montag begonnen wird?

vielen dank
stephan


----------



## stonedjehova (26. Juli 2005)

jo, ich hab das auch mit Montag beginnen lassen.

Ich habe sogar ganz vorne noch eine Spalte, in der die jeweilige Woche des Jahres ausgegeben wird:


```
<html>
<head>
<title>Kalender</title>
</head>
<body>
<?php
if (!checkdate($heuteMonat, 1, $heuteJahr))
{
	$heute=getdate();
	$heuteMonat=$heute[mon];
	$heuteJahr=$heute[year];
}
//monatserster
$start=mktime(0, 0, 0, $heuteMonat, 1, $heuteJahr, 0);
$mon_arr=array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
$tage_arr=array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");

echo "
<form name='kalender' method='post' action='$PHP_SELF'>
<table cellspacing='0px' cellpadding='5px' align='center' style='border: 2px solid $c_bd_all;'>
	<tr>
		<td colspan='8' style='border-bottom: 1px solid $c_bd_all; text-align: center;'><select name='heuteMonat' style='width: 100px;' onchange='this.form.submit();'>";
		for ($m=1; $m<=count($mon_arr); $m++)
		{
			echo "<option value='$m'"; echo ($m==$heuteMonat)?" selected":""; echo ">".$mon_arr[$m-1]."</option>";
		}
		echo "
		</select>
		<select name='heuteJahr' style='width: 100px;' onchange='this.form.submit();'>";		
		for ($j=1980; $j<=2020; $j++)
		{
			echo "<option value='$j'"; echo ($j==$heuteJahr)?" selected":""; echo ">$j</option>";
		}
		echo "
		</select>
		<input type='submit' name='show' value='anzeigen' style='width: 80px;'>
		</td>
	</tr>
	<tr>";
		echo "
		<td style='border: 1px solid $c_bd_all; border-right: 2px solid $c_bd_all; font-weight: bold; font-size: 10px;'>Woche</td>";
		foreach ($tage_arr as $w_tag) {
			echo "<td style='border: 1px solid $c_bd_all; font-weight: bold; font-size: 10px;'>$w_tag</td>";}
			
	for ($z=0; $z<(6*7); $z++)
	{
		$akt_dat=getdate($start);
		if (($z % 7) == 0)
		{
			if ($akt_dat[mon]!=$heuteMonat)
			{ break;}
			else {
			$woche=date("W", $start);
			echo "
			</tr>
			<tr>
				<td style='border-right: 2px solid $c_bd_all; text-align: center;'>"; echo ($woche<10)?"0".$woche:$woche; echo "</td>";}
		}
		if ($akt_dat[wday]==0) {$akt_dat[wday]=7;}
		if ($z < $akt_dat[wday]-1 || $akt_dat[mon]!=$heuteMonat)
		{
			echo "<td></td>";
		}
		else
		{
			if ($akt_dat[wday]==6) {$style="style='text-align: center; background-color: $c_row; color: red;'";}
			if ($akt_dat[wday]==7) {$style="style='text-align: center; background-color: $c_row; color: red; font-weight: bold;'";}
			if ($akt_dat[wday]!=6 && $akt_dat[wday]!=7) {$style="style='text-align: center; background-color: $c_row;'";}
			$today=getdate();
			if /*heutigen Tag hervorheben*/($today[mday]==$akt_dat[mday] && $today[mon]==$akt_dat[mon] && $today[year]==$akt_dat[year]) {$style="style='text-align: center; background-color: $c_bd_all; font-weight: bold; color: white;'";}
			
			echo "<td ".$style.">"; echo ($akt_dat[mday]<10)?"0".$akt_dat[mday]."":$akt_dat[mday]; echo "</td>";
			//einen Tag weiter (in sekunden: 60s*60min*24h=1d): 
			$start=$start+(60*60*24);
		}
	}	
	echo "
	</tr>
</table>
</form>
";
?>
</div>
</body>
</html>
```

Ich hoffe das konnte dir weiterhelfen.

Du solltest natürlich noch mal nach ein paar Variablen schauen, ich habe dort einige Styles mit Variablen definiert.

mfg

s,j.


----------



## Rubosh (31. August 2005)

stonedjehova hat gesagt.:
			
		

> jo, ich hab das auch mit Montag beginnen lassen.
> 
> Ich habe sogar ganz vorne noch eine Spalte, in der die jeweilige Woche des Jahres ausgegeben wird:
> 
> ...







hi, ich hab das problem mit dem datumsfehler im october und mai auch gehabt allerdings hast du den mit deinem script offensichtlich gefixt. nun wollt ich wissen wie du das gemacht hast? Also wo liegt dieser fehler im algorithnus?

GREEZ

rubosh


----------



## Flugzeugfreund (8. Februar 2006)

Hi,

Ich mache grad ein Praktikum in einer Web-Agentur. Im Moment sollen "wir" einen Urlaubskalender programmieren. Ich bräuchte im Moment aber nur einen normalen Kalender, das erweitern mach ich dann..

Leider bin ich in php noch blutiger anfänger. Also hab ich das tutorial hier genommen und den part mit der monats-bestimmung weggelassen und für monat und jahr am anfang des codes einfach zwei variablen geschrieben.

Der Kalender wird allerdings noch in einer anderen Datei included. Nun wird ja nur ein Monat angezeigt, muss ich jetzt den ganzen code für alle Monate nochmal wiederholen oder kann ich nicht von der index.php, die die kalender.php included aus, die variablen monat und jahr festlegen und dann includen lassen? Hoffe mich versteht jemand ^^. Ich will bloß umgehen, dass ich den ganzen code noch 11 mal wiederholen muss.

ThX
Flugzeugfreund


----------



## FipsTheThief (8. Februar 2006)

Also ich hab mir das Tutorial mal durchgelsen nun fix , und so wie es aussieht geht das allles über 2 Select Felder die dann über $_POST die Werte übergeben.

Somit wird ebenfalls nur immer ein Monat in einen gewissen Jahr angezeigt werden können. Bei diesem Tutorial "nur" bis  zum Jahre  2010.

Wobei ich da auch gleich einen Fehler gefunden habe , und das war wohl damals auch die Frage wegen dem Oktober.


```
print "\t<td>$tagArr[mday] $tagArr[month]</td>\n"; 
        $start += EINTAG;
```

EINTAG ist eine Konstante mit 60 * 60 * 24 , also genau 1 Tag der auch genau 24 Stunden hat. Dabei passiert es aber , bzw ist mir schon passiert , das man im Oktober und zwar zwischen den 25 und 31 auf Winterzeit umstellt. Was zur Folge hat das der Tag auf einmal 25 Stunden hat und nicht mehr 24 und er sich somit aufhängt. 
Kann man umgehen indem man überprüft ob der nächste Tag bereits Winterzeit hat oder nicht , falls dies der Fall sein sollte rechnet man eben mit *25 statt *24.Oder aber man macht es alles mittels date("d",mktime(0,0,0,monat,tag,jahr), da muss man nur den Tag erhöhen und muss sich um diese Sommer / Winterzeit keine Sorgen mehr machen.

Zu Deiner eigentlichen Frage , du kannst das ganze Ding quasi in eine Funktion packen , mit 2 Parametern die übergeben werden sollen , und zwar den Monat und den Tag. Als Rückgabe Wert lieferst Dir dann einfach ein komplettes Kalender Grid zurück.

Aber ich kann Dir dann auch gleich eine Kalender Klasse ans Herz legen. Blos wird das Erweiteren für Dich als "blutiger PHP Anfänger" Sofern Du einer bist etwas kniffliger nehm ich an.

Aber dennoch mal ein Link dazu :

http://www.tutorials.de/forum/php-codeschnipsel/227051-kalender-klasse.html

MfG


----------



## Flugzeugfreund (8. Februar 2006)

Hmm,
also der code in der index.php sieht so aus:


```
<?

require('config.php');

include('./templates/head.php');
?>

<table width="33%">
	<tr align="center">
		<td width="33%"><? include('./templates/Kalender.php'); ?></td>
		</tr>
</table>
```

Wie schon gesagt, habe ich in meinem kalendercode die beiden select-felder wegegelassen und gleich mit den variablen $monat und $jahr bestimmt.
Kann ich nun nich einfach von der index.php jeweils nen code mit den beiden bestimmten variablen zu der kalender.php senden und danach mit ausgefüllten variablen wieder abfragen? Und das ganze dann 12 mal mit immer anderen variablen?

ThX für deine Hilfe
Flugzeugfreund

PS: Bei dem Praktikum hab ich eigentlich arbeiten im designtechnischen design vorgestellt und nich progrannieren.. ^^ Nich das ich hier komische sachen unterstellt krieg...


----------



## FipsTheThief (9. Februar 2006)

```
<?

require('config.php');

include('./templates/head.php');
?>

<table width="33%">
    <tr align="center">
        <td width="33%"><? include('./templates/Kalender.php'); ?></td>
        </tr>
</table>
```

Also bei deiner Index.php bindest ja immer den kompletten Kalender ein , also könnte man das mit den Variablen mittels einer for Schleife realisieren. Ich nehm an Du willst einen Jahres Kalender haben.


```
<?php
for($i = 1 ; $i <= 12 ; $i++){

    // das müssten dann die Variablen sein wie sie im Tutorial stehen , da das komplette
    // Kalender Script ja 2 zeilen weiter komplett eingebunden wird gelten auch die    
    //Kalender Variablen für hier

    $monat = $i; 
    $Jahr     = date("Y"); // aktuelles Jahr im Format jjjj     
   
     echo'<tr align="center">
                  <td width="33%">';
     include('./templates/Kalender.php');
     echo '</td></tr>';
}
?>
```

Ungetestet und käme auf einen Versuch an , das man das komplette Script x mal einbindet macht mich dabei aber irgendwie nervös


----------



## Flugzeugfreund (9. Februar 2006)

Joooo,
ne for schleife ist mir auch schon in den sinn gekommen, war aber noch nicht dazu gekommen, das auszuprobieren, aber es funktioniert!!

1000 Dank!
Flugzeugfreund

EDIT:
Hi, zwei kleine problemchen hätt ich da noch, erstmal ein screenshot von dem jetzigen kalender:







1. Ich habe nun in die for-schleife gleich noch die bestimmung der monatsnamen eingebunden, wird auch soweit richtig angezeigt, aber beim januar fehlt oben die beschriftung. Woran kann das liegen?

2. Wie schaff ich es, dass jeweils 3 monate in einer zeile angezeigt werden, sodass dann 4 zeilen enstehen?

Hier noch der code der kalender.php:

```
<?
require('./config.php');

define("EINTAG", (60*60*24));


$start = mktime(0,0,0,$monat,1,$jahr,0);
$ersterTag = getdate($start);
$monate = Array("NULL", "Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
$tage = Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");

print "<br><table border=0 cellspacing=2 width=33%><tr><td bgcolor=#cccccc colspan=7 align=center><font face=verdana size=-1>$monatsname</font></td></tr>\n";
foreach ($tage as $tag)
		if ($tag == "So") {
				print "\t<td bgcolor=#FFDDCA><font color=#000000 face=arial size=-1><i>$tag</i></font></span></td>\n";
		 } else{
				print "\t<td bgcolor=#efefef><font face=arial size=-1><b>$tag</b></font></td>\n";
			}

for ($zaehler=0; $zaehler <= (6*7); $zaehler++)
		{
		$tag = getdate($start);
		
if ((($zaehler) % 7) == 0){
			if ($tag[mon] != $monat )
				break;
			print "</tr><tr bgcolor=#efefef>\n";
		}

if ($zaehler < $ersterTag[wday] || $tag[mon] != $monat )
		{
			print "<td></td>";
		}else{
		if ($tag[wday] == "So") {
				print "\t<td bgcolor=#FFDDCA><font face=arial size=-1>$tag[mday]</font></td>\n";
		 }else{
				print "\t<td bgcolor=#efefef><font face=arial size=-1>$tag[mday]</font></td>\n";
			}
		
		$start += EINTAG;
	}
}
print "</table>";

?>
```
Thx nochmal ^^
Flugzeugfreund


----------



## FipsTheThief (10. Februar 2006)

Naja das ist aber normales HTML dann eigentlich , im Prinzip bildet ja die Tabelle den Platzhalter für den gesammten Kalender.Somit musst Du dieses in der for schleife innerhalb der index.php oder da wo der Kalender eingebunden wird regeln , mittels des Modulo Operators.


```
<?php
echo'<tr align="center">

$Jahr     = date("Y"); // aktuelles Jahr im Format jjjj   

for($i = 1 ; $i <= 12 ; $i++){
  $monat = $i; 
     
    if($i%3 != 0){
        echo '<td width="33%">';
         include('./templates/Kalender.php');
        echo '</td>';
     }else{
         echo '<td width="33%">';
          include('./templates/Kalender.php');
         echo '</td></tr><tr align="center">';
    }
}
echo '</tr>';
?>
```


----------



## varul (26. Juni 2007)

*threadausgrab*

Hallo!

Abgesehen davon, dass ich das Kalender Tutorial großartig finde, bleibt etwas Grundsätzliches noch unklar für mich! (mein Gott, was für ein Satzbau)

Der Wert von EINTAG beträgt ja die Sekunden eines Tages, also: 86.400, und die werden am Ende des Skripts zu $start addiert.


```
define("EINTAG", (60*60*24) );
...
$start += EINTAG;
```

$start wiederum beinhaltet das Ergebnis aus mktime()


```
$start = mktime ( 0, 0, 0, $monat, 1, $jahr )
```

Angenommen: $monat=3 und $jahr=2000, dann steht in $start als Ergebnis 0,0,0,3,1,2000.

Meine Frage, woher weiss $start, dass die 86.400 "Sekunden" sind und weiß auch noch wo es sie hinstecken soll?

Ich weiß nicht wie ich es anders erklären soll, hoffentlich versteht ihr mein Problem.

Danke schonmal


----------



## FipsTheThief (26. Juni 2007)

Öhm $start weiss nicht wirklich das dies Sekunden sind , für $start ist das nen normaler Integer Wert.

$start hat aber auch nicht den Wert von0,0,0,3,1,2000 , sondern hier ebenfalls einen Integer Wert und zwar die Anzahl der Sekunden die seit dem 01.01.1970 bis zum 01.03.2000 vergangen sind.


----------



## varul (26. Juni 2007)

ahhhh...das erklärt einiges. Vielen Dank

Das mktime () die vergangenen Sekunden seit dem 01.01.1970 bis zum eingegebenen Datum ausgibt wusste ich nicht. Danke für die Antwort! 

Vielleicht hätte ich deinen Tipp aus der Sig berücksichtigen sollen


----------

