Kalender mit Timestamps aus einer DB füttern

Hab i-wie ein Problem, die Termine die in der DB stehen, als Termine im Kalender zu markieren.
Gebe ich dem Kalender manuell einen Stamp, geht das alles soweit.
Ich denke ich hab da einfach nen riesen Denkfehler...

Hier die Kalender:
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 = true"); 
			
			
            $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>';
            
            for($i=1; $i <= $dayspermonth; $i++)
            {
				if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
					while($row = mysql_fetch_assoc($result)) {
						$Appointment = Convert2Date($row['Datum']);
						if($i == $Appointment[0]){
							if($i % 7 == 7 - $offset){
								echo '<td class="appointmentonsunday">'.$i.'</td>';}
							else{
								echo '<td class="appointment"> </td>';
							}
						}
					}
				}
				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>

Hier die Funktion Convert2Date:
PHP:
function Convert2Date($timestamp)
{
		$Date = array(date("d",$timestamp),date("m",$timestamp),date("Y",$timestamp));
		
		return $Date;
}

Un die Funktion GetMySQLData:
PHP:
function GetMySQLData($SQLStatement)
{
		if($localhost == "true"){
			@mysql_connect(localhost, root, " ") OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());}
		else{
			@mysql_connect(localhost, usr entfernt, pw entfernt) OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());}
		mysql_select_db(db entfernt) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
		$result = mysql_query($SQLStatement) OR die(mysql_error());
		return $result;
}

Vllt findet einer von euch den Fehler.
Vllt gibts auch etwas was ich verkürzen kann oder besser machen kann.

Wäre echt nett :)
 
Dein Fehler liegt darin, dass du zwar am Anfang dein Query ausführst und dort sicherlich auch ein paar Ergebnisse bekommst. Die Auswertung der Ergebnisse ist aber Murks. Du gehst jeden Tag des Monats in einer Schleife durch und prüfst darin dann, ob es Ergebnisse bei deinem Query gab. Dann gehst du alle Ergebnisse durch... nur leider wird das Resultset nie zurückgesetzt. Das heißt, nachdem du für den ersten Tag alle Ergebnisse durchgegangen bist (und ggf. kein passendes gefunden hast), wird bei den übrigen Tagen die Zeile 38 nichts mehr bewirken.

Ich würde also die Termine vor dem Durchlauf der einzelnen Tage in einem Array o.ä. zwischenspeichern.
 
also wenn ich das richtig verstanden habe:

- Timestamps & ID aus der DB lesen, in in Array packen
- Daten umwandeln mittels Convert2Date
- In Kalender eintragen.


Also anfür sich hab ich das verstanden, aber ei könnte ich das umsetzen?
Ich steh grad etwas auf dem Schlauch und seh den Wald vor lauter Bäume nicht mehr ?(
 
Das hast du schon richtig verstanden, nur im Code haut deine Reihenfolge eben nicht hin. Du wertest das Ergebnis deiner SQL-Abfrage zum falschen Zeitpunkt aus. mysql_fetch_assoc() holt sich immer einen Datensatz und springt dann zum nächsten in deinem Resultset $result. Das Problem ist nur, dass nachdem du für den Monatsersten alle Ergebnisse durchgegangen bist, du nicht mehr zum ersten Datensatz zurückspringen kannst. Am 2. des Monats beginnst du wieder mit mysql_fetch_assoc() einen Datensatz abzurufen, aber es gibt keinen mehr...

Du musst also das Auslesen deiner Ergebnisse vor der Schleife über die Tage des Monats machen, z.B. so:

PHP:
$termine = array();

while ( $row = mysql_fetch_assoc ( $result ) )
{
    $termine[] = Convert2Date ( $row [ 'Datum' ] );
}

for ( $i = 1; $i < $dayspermonth; $i++ )
{
    foreach ( $termine as $termin )
    {
        if ( $termin [ 0 ] == $i )
        {
            ...
        }
    }
}
 
Hab das mal eingebaut, funkioniert auch super. Jedoch werden die Termine, doppelt eingetragen.

PHP:
<?php
			$datum			= Convert2Date(time());
			$result 		= GetMySQLData("SELECT * FROM Appointment WHERE Oeffentlich = true"); 
			
			$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 ( $termin [ 0 ] == $i )
					{
						if($i % 7 == 7 - $offset){
							echo '<td class="appointmentonsunday">'.$i.'</td>';
						}
						else{
							echo '<td class="appointment">'.$i.'</td>';
						}
					}
				}
					
				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>';
				} 
            }
        ?>

BTW: Gibt es nicht ne möglichkeit PHP zu debuggen, wie das mit normal Windows-Forms geht?! Das würde viel Mühe und Fragerei sparen :D
 
Diesmal ist das Problem in Zeile 36. Nachdem du (eventuell) in deiner Schleife schon einen Termin ausgegeben hast, wird hier eine weitere Tabellenzelle für diesen Tag angelegt. Du müsstest dieses IF also noch erweitern und in jedem Schleifendurchlauf eine weitere Variable definieren, in der ein Flag steht, ob ein Termin eingefügt wurde oder nicht.
 
Also ich hab jetzt mal eine Variable reingeprügelt, jedoch scheint es nicht zu fuktionieren wie ich will ôo

PHP:
for($i = 0; $i < $offset; $i++) 
                echo '<td></td>';
            
            for($i=1; $i <= $dayspermonth; $i++)
            {
$appointmentset = "";
                if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
                    while($row = mysql_fetch_assoc($result)) {
                        $Appointment = Convert2Date($row['Datum']);
                        if($i == $Appointment[0]){
                            if($i % 7 == 7 - $offset){
                                echo '<td class="appointmentonsunday">'.$i.'</td>';
$appointmentset=true;}
                            else{
                                echo '<td class="appointment"> </td>';
$appointmentset=true;
                            }
                        }
                    }
                }
                if($i == $today AND $appointmentset != true){
                    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>';
                } 
            }

EDIT:
hat 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"> </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>';
				}
            }
        ?>

Hatte vergessen in den anderen If's auch zu prüfen... ?(
 
Zurück
Oben