Doppelte Ausgabe

diggakool

Mitglied
Hallo,

ich habe ein Script in dem ich bestimmte Tage aus der Datenbank abfrage. Wenn diese in der Datenbank eingetragen sind sollen diese bei der Ausgabe gefärbt werden. Das klappt soweit auch alles wunderbar nur werden zu den gefärbten Tagen die gleichen Tage angezeigt die noch ungefärbt sind. D.h. er wiederholt die Tage.

Bsp.: 4(gefärbt) 4 (normal) | 5(gefärbt) 5 (normal) usw..

Wie kann ich die doppelten Tage die ungefärbt sind, also nicht aus der DB kommen, aussortieren um sie nicht zwischen den gefärbten anzuzeigen?

Hier das Script:
PHP:
for ($day=1; $day<=$total_days; $day++)
        {
          if ($day_highlight && ($day == $n_day) && ($month == $n_month) && ($year == $n_year))
          {
		echo "\t";
		echo '</td>
       		<td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
       		echo "\n";       			
		}				
    else {
		
		$query = mysql_query("SELECT * FROM XXXXX WHERE Titel='$Titel'order by Datum2",$db);
		$num=mysql_NumRows($query);
		$i=0; while ($i<$num):
		$row = mysql_fetch_array($query);
		$Datum1=makedate($row[Datum1]);
		$Datum2=makedate($row[Datum2]);
				
		if (($day == $Datum2 [1]) && ($month == $Datum2 [2])&& ($year == $Datum2 [3])) {
          echo "\t";
	      echo '</td>
    	   <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
	       echo "\n";           
		} 				
		$i++; endwhile; 
			echo "\t";
		    echo '</td>
    		<td id="day_'.$day.'">'.$day.'</td>';
	         echo "\n";
    	   }
       		$day_offset++;
	        if ($day_offset == 7)   {
    	    $day_offset = 0;
        	if ($day < $total_days)
           {
           	echo "</tr>\n<tr>";
            }
       	}

Vielleicht hat jemand von Euch eine Idee oder einen Hinweis für mich. :)

Danke und schöne Grüße
 
Wäre noch interessant, zu wissen welche Style, dass der gefärbte ist. (oder halt welcher echo-Block in deinem Code.

Unabhängig davon. Warum gehst du die Schlaufe mit den DB-Resultate für jeden $day durch?
Ich versteh nicht, was dein Code machen sollte. Schreibe doch mal einige Kommentarzeilen rein. Beschreibe all deine Variablen (zB. $n_day, $month, etc), denn so seh ic nicht, was da eigentlich verglichen wird.
 
Hallo,

vielen Dank für Deine Antwort.

der gefärbte Block ist
style="'.$options['block_class'].'"

Ich hole erst die Tage aus der Datenbank die eingetragen wurden um zu zeigen, dass dort gebucht wurde. Diese Tage sollen dann im Kalender gefärbt werden. Das geht auch soweit, nur werden auch die Tage angezeigt, die nicht gefärbt sind.

Die Färbung der Tage geschieht hier:

PHP:
 if (($day == $Datum2 [1]) && ($month == $Datum2 [2])&& ($year == $Datum2 [3])) {
          echo "\t";
          echo '</td>
           <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
           echo "\n";           
        }                 
        $i++; endwhile;

Die Frage ist, wie kann ich den anderen doppelten Tagen sagen, dass sie nicht angezeigt werden sollen?

hier ist mal das ganze Script:
PHP:
<?PHP        

	$month = isset($_GET['month']) ? intval($_GET['month']) : date('n');
    $year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');
    
    $options['today_class'] = "background-color:#008bb8; font-weight:bold; color:#fff;";
	$options['block_class'] = "background-color:#ab0000; font-weight:bold; color:#fff;";
    $weekdays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
    
    $weekdays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
    $months = array('01' => 'Januar', '02' => 'Februar', '03' => 'M&aumlrz', '04' => 'April', '05' => 'Mai', '06' => 'Juni', '07' => 'Juli', '08' => 'August', '09' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember');
    
    $prev_symbol = "&laquo;";
    $next_symbol = "&raquo;";
    $summary = "Belegungsplan";
    $caption = "Belegungsplan";
    $options['month_link']     = '<a href="'.$_SERVER['PHP_SELF'].'?month=%d&amp;year=%d&Titel='.$Titel.'">%s</a>';
    
    $total_days = date('t', mktime(0, 0, 0, $month, 1, $year));
    $day_offset = date('w', mktime(0, 0, 0, $month, 1, $year));
    
    list($n_month, $n_year, $n_day) = split(', ', strftime('%m, %Y, %d'));
    $day_highlight = (($n_month == $month)."&amp;&amp;".($n_year == $year));
    
    list($n_prev_month, $n_prev_year) = split(', ', strftime('%m, %Y', mktime(0, 0, 0, $month-1, 1, $year)));
    $prev_month_link = sprintf($options['month_link'], $n_prev_month, $n_prev_year, $prev_symbol);
 
    list($n_next_month, $n_next_year) = split(', ', strftime('%m, %Y', mktime(0, 0, 0, $month+1, 1, $year)));
    $next_month_link = sprintf($options['month_link'], $n_next_month, $n_next_year, $next_symbol);
    
    echo '
    <table border="0" summary="'.$summary.'" style="width: 400px;">
    <caption>'.$caption.'</caption>
    <thead>
    <tr>
    <th style="background-color:#647b8d;">'?> 
    
    <?PHP
    	if (date('m') >= $month AND date('Y') == $year): 
     		
			else:     
     		echo $prev_month_link;     
      	endif; 
    ?>
    
    <?PHP echo '</th>
    <th colspan="5">'.$months[strftime('%m', mktime(0, 0, 0, $month, 1, $year))].' '.$year.'</th>
    <th style="background-color:#647b8d;">'.$next_month_link.'</th>
    </tr>';
    echo "<tr>\n";
    
    foreach ($weekdays as $weekday)
        {
          echo "\t";
          echo "<th>".$weekday."</th>\n";
          echo "\n";
        }
        
    echo "\n";
    echo "\n";
    echo "</tr>
    </thead>
    <tbody>\n";
    echo "<tr>\n";
    
    if ($day_offset > 0) {
      for ($i=0; $i<$day_offset; $i++)
        {
			echo "\t";
			echo '<td class="empty_cell">';
			echo "\n";
        } 
     }
     for ($day=1; $day<=$total_days; $day++)
        {
          if ($day_highlight && ($day == $n_day) && ($month == $n_month) && ($year == $n_year))
          {
			  echo "\t";
			  echo '</td>
       		  <td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
       		  echo "\n";       			
			} 
				
    else {
		
		$query = mysql_query("SELECT * FROM belegungsplangebucht WHERE Titel='$Titel'order by Datum2",$db);
		$num=mysql_NumRows($query);
		$i=0; while ($i<$num):
		$row = mysql_fetch_array($query);
		$Datum1=makedate($row[Datum1]);
		$Datum2=makedate($row[Datum2]);
				
		if (($day == $Datum2 [1]) && ($month == $Datum2 [2])&& ($year == $Datum2 [3])) {
          echo "\t";
	      echo '</td>
    	   <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
	       echo "\n";           
		} 		
				
		$i++; endwhile;		
				
			echo "\t";
		    echo '</td>
			<td id="day_'.$day.'">'.$day.'</td>';
			 echo "\n";
    	   }
       		$day_offset++;
	        if ($day_offset == 7)   {
    	    $day_offset = 0;
        	if ($day < $total_days)
           {
           	echo "</tr>\n<tr>";
		   }
       	}   
       
     }	 
     if ($day_offset > 0)
        {
          $day_offset = 7-$day_offset;
        }
    if ($day_offset > 0)
	{
	for ($i=0; $i< $day_offset; $i++)
	{
    echo '<td class="empty_cell">';
     echo "\n";
  }
}    
?>
 
Zuletzt bearbeitet von einem Moderator:
Also ehrlich gesagt blick ich bei deinem Code nicht durch.
Was ich aber sehe ist, dass du jedes Mal in der for-Schleife (ist doch stellvertretend für jeden Tag?) das Query abschießt, das dir ich-weiß-es-nicht zurückgibt.

darunter kommt

PHP:
if (($day == $Datum2 [1]) && ($month == $Datum2 [2])&& ($year == $Datum2 [3])) {
          echo "\t";
          echo '</td>
           <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
           echo "\n";           
}

und DANACH kommt wiederum

PHP:
echo "\t";
echo '</td>
  <td id="day_'.$day.'">'.$day.'</td>';
echo "\n";

Das heißt, du gibst einmal bei Erfolg das formatierte TD aus, und danach, ohne Prüfung, das Standard-TD. Beide Male greifst du auf die Variable $day zu, es wird also in der logischen Konsequenz doppelte Tage geben.

Das zum Grundproblem. Ich würde dir gerne einen Ansatz-Schnipsel hinwerfen, aber ich hab absolut keine Ahnung, welche Werte hier wann vorliegen.
Vielleicht hilft dir ja die Theorie weiter:

Entweder fragt man einmalig alle Tage ab, zu denen es ein Ereignis in der DB gibt, und packt diese Tage ein Array. Danach geht man alle möglichen (?) Tage in einer Schleife durch, prüft, ob zu diesem Tag ein Wert in dem Array existiert, und wenn ja, gibt man das formatierte TD aus. Wenn nicht, dann eben das normale.

Oder man geht alle möglichen (?) Tage durch und schickt innerhalb dieser Schleife je ein Query ab, das die DB nach genau diesem Tag anfragt. Hier kommt entweder ein (oder mehrere) Datensatz zurück oder keiner. Mit (u.a.) mysql_num_rows kann man das überprüfen; im positiven Fall gibt man das formatierte Td aus, im negativen...bla.
 
Hey,

vielen Dank für Deine Tipps!

Im Prinzip ist es so, dass es Variablen für Tag, Monat und Jahr gibt die ich versuche mit der DB zu vergleichen und wenn diese dann in der Schleife vorkommen sollen diese gefärbt werden.

Deine Variante eins wäre die Optimallösung.
Wie packe ich diese Tage aus der DB denn in ein Array und gehe diese dann danach alle durch um die danach zu prüfen ob sie vorkommen oder nicht? Da stehe ich etwas auf der Leitung.
 
Das kommt drauf an wie deine Tabellen aussehen (wenn möglich die Create-Statements hier posten).

Ich geh jetz einfach mal davon aus, dass jeder Tag, der in deiner Tabelle belegungsplangebucht vorkommt, "belegt" ist.

PHP:
$sql = "SELECT `SpalteMitDatum` FROM belegungsplangebucht";

Falls Daten auch mehrfach in der Tabelle vorkommen können, wäre hier noch ein GROUP BY angebracht. Da du innerhalb der Schleife je den Tag, den Monat und das Jahr vergleichen willst, holen wir uns pro Treffer in der DB das Datum jeweils als Tag, Monat und Jahr formatiert. Dafür muss die Spalte DateTime sein.

Der grobe Plan:

PHP:
$query = mysql_query("SELECT			
  DATE_FORMAT(`SpalteMitDatum`, '%d' AS 'day', 
  DATE_FORMAT(`SpalteMitDatum`, '%m' AS 'month', 
  DATE_FORMAT(`SpalteMitDatum`, '%Y' AS 'year'
  FROM belegungsplangebucht", $db);

while ($row = mysql_fetch_assoc($query)) {
  $date[] = $row;
  /* ein Beispieldatensatz müsste so aussehen:
	 $date => Array(
	   [0] => Array(
	     ['day'] => '01',
	     ['month'] => '12',
	     ['year'] => '2011'
	   )
	 )
 */
}  
   
for ($day=1; $day<=$total_days; $day++){

  if ($day_highlight && ($day == $n_day) && ($month == $n_month) && ($year == $n_year)){
   echo "\t";
   echo '</td>
   <td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
   echo "\n"; 
                  
  }else{

    $hit = false;

    while(list($index, $data) = each($date)){

     /* vergleiche die jetzigen Daten mit denen aus dem Array */	
      if($day == $data['day'] && $month == $data['month'] && $year == $data['year']){
	$hit = true;
	break; /*lass gut sein */
      }
    }
    reset($date); /* setz den zeiger auf das erste Element, weil wir die Schleife mehrfach brauchen */

    if ($hit){ /* wenn Treffer */
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
      echo "\n"; 
          
    }else{  /* sonst */ 
                
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'">'.$day.'</td>';
       echo "\n";
    }
  }
}

1. Ob das so mit deinen Daten hinhaut, weiß ich nicht.
2. Es gibt sicher noch andere (schnellere, effektivere...) Lösungen, das nur zum grundsätzlichen Ansatz.
 
also ich habe versucht dein script an meins anzupassen. :)
leider ohne erfolg.

die struktur in meiner tabelle sieht so aus:

id Titel Datum2
1 Blabla 2011-11-09
2 Blabla2 2011-11-10

das datum wird immer in 2011-11-09 usw. abgespeichert.

ich dachte wenn ich das datum aus der db in das format bringe wie in deinem script, klappt es. ;)

PHP:
  $query = mysql_query("SELECT * FROM belegungsplangebucht WHERE Titel='$Titel'order by Datum2",$db);
		$i=0; while ($i<$num):	
		$row = mysql_fetch_array($query);
		
		$Datum1=makedate($row[Datum1]);
		$Datum2=makedate($row[Datum2]);
		
		$date = array("day"=>$Datum2 [1], "month"=>$Datum2 [2], "year"=>$Datum2 [3]);						
		$i++; endwhile; 
   
		for ($day=1; $day<=$total_days; $day++){

  if ($day_highlight && ($day == $n_day) && ($month == $n_month) && ($year == $n_year)){
   echo "\t";
   echo '</td>
   <td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
   echo "\n"; 
                  
  }else{
	  
    $hit = false;
	
    while(list($index, $data) = each($date)){
     /* vergleiche die jetzigen Daten mit denen aus dem Array */    
      if($day == $data['day'] && $month == $data['month'] && $year == $data['year']){
    $hit = true;
    break; 
      }
    }
    
	reset($date);

    if ($hit){ /* wenn Treffer */
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
      echo "\n"; 
          
    }else{  /* sonst */ 
                
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'">'.$day.'</td>';
       echo "\n";
    }
}

wo liegt mein denkfehler?
 
Zuletzt bearbeitet:
Also erstmal initialisierst du $date in jedem Schleifengang neu:

PHP:
$date = array("day"=>$Datum2 [1], "month"=>$Datum2 [2], "year"=>$Datum2 [3]);

Also wirds auch jedes Mal überschrieben. Deswegen hatte ich
PHP:
$date[]
verwendet. Du kannst natürlich auch das $i als Index nehmen, wäre aber nicht notwendig.

Zum Zweiten schriebst du

die struktur in meiner tabelle sieht so aus:

id Titel Datum2
1 Blabla 2011-11-09
2 Blabla2 2011-11-10

Also gibt es nur eine Spalte, die dir ein Datum zurückgibt. Ich benutze mysql_fetch_array zwar nie, aber das, was da zurückkommt, kann eigentlich kaum mit der Datenbankabfrage übereinstimmen.

$Datum2[1] müsste nach meiner Ansicht den Titel tragen, $Datum2[2] das Datum und $Datum2[3]....nichts. Lass meine Ansicht da natürlich gern korrigieren. Aber je einen als Tag, Monat und Jahr formatierten Datumsstring wirst du wohl nicht bekommen, demzufolge fällt auch der Vergleich flach. Deswegen
wenn ich das datum aus der db in das format bringe
DATE_FORMAT im Query verwenden :)
 
juchuu! :)
ich habe es nun hinbekommen!

PHP:
$hit = false;
	
     $query = mysql_query("SELECT * FROM belegungsplangebucht WHERE Titel='$Titel'order by Datum2",$db);
        $i=0; while ($i<$num):    
        $row = mysql_fetch_array($query);
        
        $Datum1=makedate($row[Datum1]);
        $Datum2=makedate($row[Datum2]);
        
        $date = array("day"=>$Datum2 [1], "month"=>$Datum2 [2], "year"=>$Datum2 [3]); 
		             
		if($day == $date['day'] && $month == $date['month'] && $year == $date['year']){
    	$hit = true; 
      }					         
      $i++; endwhile; 	
    
    reset($date);

    if ($hit){ /* wenn Treffer */
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
      echo "\n"; 
          
    }else{  /* sonst */ 
                
      echo "\t";
      echo '</td>
      <td id="day_'.$day.'">'.$day.'</td>';
       echo "\n";
    }

ich habe einfach die datenbankabfrage anders platziert! :)

vielen dank für deine hilfe para_noid!
mein tag ist gerettet! ;)
 
Moin,

vielen Dank noch mal an para_noid für die Hilfe. Klappt alles super!
Ich stehe jetzt aber wieder vor einem neuen "Problem". :)

Es soll jetzt nicht nur 1 Monat ausgegeben werden sondern 3.
Beispiel: Dezember 2011 - Januar 2012 - Februar 2012

Zur Zeit wird nur ein Monat angezeigt.

Hier mein Script:

PHP:
<?PHP  // Parameter festlegen 
$month = isset($_GET['month']) ? intval($_GET['month']) : date('n');
$year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');
    
$options['today_class'] = "background-color:#008bb8; font-weight:bold; color:#fff;";
$options['block_class'] = "background-color:#ab0000; font-weight:bold; color:#fff;";
$weekdays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');    
$weekdays = array('So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa');
$months = array('01' => 'Januar', '02' => 'Februar', '03' => 'M&aumlrz', '04' => 'April', '05' => 'Mai', '06' => 'Juni', '07' => 'Juli', '08' => 'August', '09' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember');

   
$prev_symbol = "&laquo;";
$next_symbol = "&raquo;";
$summary = "Belegungsplan";
$caption = "Belegungsplan";
$options['month_link']     = '<a href="'.$_SERVER['PHP_SELF'].'?month=%d&amp;year=%d&Titel='.$Titel.'">%s</a>';
    
$total_days = date('t', mktime(0, 0, 0, $month, 1, $year));
$day_offset = date('w', mktime(0, 0, 0, $month, 1, $year));
    
list($n_month, $n_year, $n_day) = split(', ', strftime('%m, %Y, %d'));
$day_highlight = (($n_month == $month)."&amp;&amp;".($n_year == $year));
    
list($n_prev_month, $n_prev_year) = split(', ', strftime('%m, %Y', mktime(0, 0, 0, $month-1, 1, $year)));
$prev_month_link = sprintf($options['month_link'], $n_prev_month, $n_prev_year, $prev_symbol);
 
list($n_next_month, $n_next_year) = split(', ', strftime('%m, %Y', mktime(0, 0, 0, $month+1, 1, $year)));
$next_month_link = sprintf($options['month_link'], $n_next_month, $n_next_year, $next_symbol);
 
 // Ausgabe HTML 
    
echo '
<table border="0" summary="'.$summary.'" style="width: 400px;">
<caption>'.$caption.'</caption>
<thead>
<tr>
<th style="background-color:#647b8d;">'?> 

<?PHP
if (date('m') >= $month AND date('Y') == $year) { 

}	else {     
	echo $prev_month_link;     
}
?>
    
<?PHP 
echo '</th>
<th colspan="5">'.$months[strftime('%m', mktime(0, 0, 0, $month, 1, $year))].' '.$year.'</th>
<th style="background-color:#647b8d;">'.$next_month_link.'</th>
</tr>';
echo "<tr>\n";

foreach ($weekdays as $weekday) {
	echo "\t";
	echo "<th>".$weekday."</th>\n";
	echo "\n";
}

echo "\n";
echo "\n";
echo "</tr>
</thead>
<tbody>\n";
echo "<tr>\n";

if ($day_offset > 0) {
for ($i=0; $i<$day_offset; $i++)
{
echo "\t";
echo '<td class="empty_cell">';
echo "\n";
} 
} 

for ($day=1; $day<=$total_days; $day++) {

if ($day_highlight && ($day == $n_day) && ($month == $n_month) && ($year == $n_year)) {

	$hit = false;

	$query = mysql_query("SELECT * FROM XX WHERE Titel='$Titel'order by Datum2",$db);
	$i=0; while ($i<$num):    
	$row = mysql_fetch_array($query);

	$Datum1=makedate($row[Datum1]);
	$Datum2=makedate($row[Datum2]);

	$date = array("day"=>$Datum2 [1], "month"=>$Datum2 [2], "year"=>$Datum2 [3]); 

	if($day == $date['day'] && $month == $date['month'] && $year == $date['year']) {
		$hit = true; 
}       

$i++; endwhile; 	

reset($date);

if ($hit) { // wenn Treffer
	echo "\t";
	echo '</td>
	<td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
	echo "\n"; 

}	else {  // aktuellen Tag 

	echo "\t";
	echo '</td>
	<td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
	echo "\n"; 
}
}	else {
	$hit = false;
	$query = mysql_query("SELECT * FROM XX WHERE Titel='$Titel'order by Datum2",$db);
	$i=0; while ($i<$num):    
	$row = mysql_fetch_array($query);

	$Datum1=makedate($row[Datum1]);
	$Datum2=makedate($row[Datum2]);

	$date = array("day"=>$Datum2 [1], "month"=>$Datum2 [2], "year"=>$Datum2 [3]); 

if($day == $date['day'] && $month == $date['month'] && $year == $date['year']) {
	$hit = true; 
}					         
$i++; endwhile; 	

reset($date);

if ($hit) { // wenn Treffer Tag markieren 
	echo "\t";
	echo '</td>
	<td id="day_'.$day.'" style="'.$options['block_class'].'">'.$day.'';
	echo "\n"; 

}	else {  // sonst /

	echo "\t";
	echo '</td>
	<td id="day_'.$day.'">'.$day.'</td>';
	echo "\n";
}
} // restliche Tage
$day_offset++;
if ($day_offset == 7)   {
	$day_offset = 0;
if ($day < $total_days) {
	echo "</tr>\n<tr>";
}
}   

}	 
if ($day_offset > 0) {
	$day_offset = 7-$day_offset;
}
	if ($day_offset > 0) {
	for ($i=0; $i< $day_offset; $i++) {
	echo '<td class="empty_cell">';
	echo "\n";
}
}    
?>

Hat jemand eine Idee, einen Lösungsansatz oder einen Tipp für mich wie ich das in Zusammenhang mit meinen Script umsetzen könnte?
 
Zurück