Kalender zeigt falsche Tage an

real-insanity

Erfahrenes Mitglied
Nabend liebe Community :)

Ich hab da ein Problem:
Ich habe mir einen Kalender gebastelt, der sich Timestamps aus einer DB holen soll und diese dann dementsprechend markieren soll. Das markieren an sich klappt, jedoch wird der markierte Tag, beispielsweise wenn ich für heute einen Termin eintrage, der Tag doppelt angezeigt, was nicht sein soll.

Ich kann mir eigentlich nur erklären, dass ich einen Logikfehler in den Schleifen habe.
Aber hier einmal der Code des Kalenders:

PHP:
<?php
$date			= getdate();
$currentmonth	= $date[mon];
$year			= $date[year];
?>
<table width="100%" border="0" class="calendar">
	<tr>
		<th colspan="7"><?php echo $months[$currentmonth]. " " . $year; ?></th>
	</tr>
    <tr>
        <th>Mo</th>
        <th>Di</th>
        <th>Mi</th>
        <th>Do</th>
        <th>Fr</th>
        <th>Sa</th>
        <th>So</th>
    </tr>
    <tr>
        <?php
			$datum			= Convert2Date(time());
			$result 		= GetMySQLData("SELECT * FROM appointment WHERE Oeffentlich = 1"); 
			
			$termine 		= array();
            $today			= $datum[0];
            $firstofmonth 	= mktime(0, 0, 0, date("m"), 1, date("Y"));
            $offset 		= (date('w', $firstofmonth) -1) % 7;
			$dayspermonth 	= date("t");
			$appointment	= Convert2Date("1210261832");
			
            for($i = 0; $i < $offset; $i++) 
                echo '<td></td>';
            while ( $row = mysql_fetch_assoc ( $result ) )
			{
				$termine[] = Convert2Date ( $row [ 'Datum' ] );
			}
			
            for($i=1; $i <= $dayspermonth; $i++)
            {
				foreach ($termine as $termin)
				{
					if ($i == $termin[0])
					{
						if($i % 7 == 7 - $offset)
						{
							echo '<td class="appointmentonsunday">'.$i.'</td>';
							$AppointmentSet = true;
						}
						else
						{
							echo '<td class="appointment">&nbsp;</td>';
							$AppointmentSet = true;
						}
					}
				}
				if($i == $today)
				{

					if($i % 7 == 7 - $offset)
					{
						echo '<td class="todayissunday">'.$i.'</td>';
					}
					else
					{
						echo '<td class="today">'.$i.'</td>';
					}
				}
				elseif($i % 7 == 7 - $offset)
				{
					echo '<td class="sunday">'.$i.'</td>';
				}
				else
				{
					echo '<td>'.$i.'</td>';
				}
				
				if( (($i + $offset) % 7 == 0) && ($i + 1 <= $dayspermonth))
				{
					echo '</tr><tr>';
				}
            }
        ?>
</table>

Als Anlage habe ich einmal den Kalender angefüht (Screenshot) damit ihr wisst was ich meine.

Die Funktion Convert2Date wandelt einen Timestamp in ein Dataarray um.
Die Funktion GetMySQLData, gibt ein Array mit den Daten in einer Tabelle aus.

Vllt findet einer von euch den Fehler.

MfG
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    6,7 KB · Aufrufe: 17
Ja, das ist definitiv ein Logikfehler.

Du gehst alle Tage durch und machst für jeden Tag:
- falls Termin, kennzeichnen
- wenn heute, dann als heute kennzeichnen
- falls nicht heute, dann den Sonntag kennzeichnen oder den Tag ausgeben.

Somit wird der Termin immer doppelt ausgegeben.

Weiterhelfen dürfte der Befehl
PHP:
continue;

Dieser unterbricht die Schleife und setzt mit dem nächsten Durchgang fort. Das also, sobald du deinen Termin abgearbeitet hast, und das sollte schon mal besser aussehen.
 
Also ich habs eben mal so eingebaut:

PHP:
foreach ($termine as $termin)
				{
					if ($i == $termin[0])
					{
						if($i % 7 == 7 - $offset)
						{
							echo '<td class="appointmentonsunday">'.$i.'</td>';
							continue;
						}
						else
						{
							echo '<td class="appointment">&nbsp;</td>';
							continue;
						}
					}
				}

Scheint dennoch nicht zu funktionieren :(

Edit:
Hat nun so geklappt:
PHP:
<?php
			$datum			= Convert2Date(time());
			$result 		= GetMySQLData("SELECT * FROM appointment WHERE Oeffentlich = 1"); 
			
			$termine 		= array();
            $today			= $datum[0];
            $firstofmonth 	= mktime(0, 0, 0, date("m"), 1, date("Y"));
            $offset 		= (date('w', $firstofmonth) -1) % 7;
			$dayspermonth 	= date("t");
			$appointment	= Convert2Date("1210261832");
			
            for($i = 0; $i < $offset; $i++) 
                echo '<td></td>';
            while ( $row = mysql_fetch_assoc ( $result ) )
			{
				$termine[] = Convert2Date ( $row [ 'Datum' ] );
			}
			
            for($i=1; $i <= $dayspermonth; $i++)
            {
			$appointmentset = "";
				foreach ($termine as $termin)
				{
					if ($i == $termin[0])
					{
						if($i % 7 == 7 - $offset)
						{
							echo '<td class="appointmentonsunday">'.$i.'</td>';
							$appointmentset = true;
						}
						else
						{
							echo '<td class="appointment">&nbsp;</td>';
							$appointmentset = true;
						}
					}
				}
				if($i == $today AND $appointmentset != 1)
				{
					if($i % 7 == 7 - $offset)
					{
						echo '<td class="todayissunday">'.$i.'</td>';
					}
					else
					{
						echo '<td class="today">'.$i.'</td>';
					}
				}
				elseif($i % 7 == 7 - $offset AND $appointmentset != 1)
				{
					echo '<td class="sunday">'.$i.'</td>';
				}
				elseif($appointmentset != 1)
				{
					echo '<td>'.$i.'</td>';
				}
				
				if( (($i + $offset) % 7 == 0) && ($i + 1 <= $dayspermonth))
				{
					echo '</tr><tr>';
				}
            }
        ?>
 
Zuletzt bearbeitet:
Zurück