thealex
Goto Top

Problem wenn kein mehrere Eintrag Einträge für Monat vorhanden

Nachdem ich jetzt dank der Mithilfe eines Users den Eintrag passend zum Tag anzeigen lasssen kann habe ich ein neues problem.

Wenn für den ausgewählten Monat kein Datenbankeintrag vorhanden ist, wird dieser garnicht erst angezeigt.

Hier meine Funktionen:

function print_table_cell_with_data( $i, &$refArrEvents ) // $refArrEvents ist "nur" eine Referenz(&)/Verknüpfung auf das originale Array 
		{
		echo"<td id='border'>". $i ."<br>";  
		if( isset($refArrEvents[$i]) && !empty($refArrEvents[$i]) ) // ist Index vorhanden UND enthält es Daten
		{
		// alle Daten ausgeben
		foreach( $refArrEvents[$i] as $refArrEvent )
		{
		echo $refArrEvent['ma_wish'].'<br>';  
		}
		}
		echo "</td>";  
  
		return NULL;
		}
		
function january($username){
					require_once("class.editcal.php");	  
					$cal_dates = new CALENDAR();
					$date_year = getdate();
					$year = $date_year['year'];  
					
					$days = 31;
					$mnum = 1;
					$i = 1;
					$user = $username;
					$work = $cal_dates->runcQuery("SELECT id, mitarbeiter, cal_day, cal_mon, cal_year, ma_wish FROM ma_wishes WHERE mitarbeiter=:uname AND cal_mon=$mnum AND cal_year=$year");  
					$work->execute(array(":uname"=>$user));  
					echo"<center>";  
					echo"<table id='month'>";  
					echo"<tr>";  
					while($workRow = $work->fetch()) { 
					$events[$workRow['cal_day']] = $workRow;}  
					if(empty($events)){
					$events[$workRow['ma_wishes']] = '&nbsp;';  
					}
					$intLastDayOfMonth = 31; // kann man sicha uch berechnen lassen ;)
					for($i=1; $i<=$intLastDayOfMonth; $i++) // FEHLER KORRIGIERT ( < und <= )
					{
					$this->print_table_cell_with_data( $i, $events );
					if( 0==($i%7) )
					{
					echo '</tr><tr>';  
					}
					}
					echo"</tr>";  
					echo"</table>";  
					echo"</center>";  
		// verschoben nach zeile 33->} 
		}

Habe ich mehrere einträge für einen monat gibt er mir für jeden eintrag einen Kallender aus!<-Problem behoben indem die While-schleife in zeile 33 endet!
Ich habe bislang noch keine lösung gefunden. Danke für jede mithilfe und für jeden Lösungsansatz

Content-ID: 364433

Url: https://administrator.de/contentid/364433

Ausgedruckt am: 17.11.2024 um 09:11 Uhr

Arano
Lösung Arano 11.02.2018 aktualisiert um 20:02:26 Uhr
Goto Top
Hey.

Erstmal für alle anderen, die vorherige Frage: Zuordnung von Daten aus einer Mysql-Tabelle zum passendem Tag
Zweitens. um deiner selbst willen, schau mal nach Codeformatierung. Mindestens aber das gleichmäßige einrücken. Das erhöht nicht nur die Lesbarkeit für Dich und Andere Beteiligten und reduziert Fehler da offensichtlicher, sondern erhöht auch die Hilfsbereitschaft in Foren allgemein. Denn i.d.R. hat niemend Lust und Zeit den Code für jemand Anderen aufzuräumen.

Teil deines Problems ist dieser Part:
	while($workRow = $work->fetch())
	{
Hier wird der Codeblock "{ ... }" nur durchlaufen wenn es mindestens ein Datensatz zur Abfrage gefunden wurde. Ergänzend: Der Codeblock wird für jeden gefundenen Datensatz ausgeführt.
0 DS = 0 Ausführunden
10 DS = 10 Ausführungen
1.000 DS = 1.000 Ausführungen.
Da in diesem Codeblock auch die for-Schleife (1-31) steht, wird diese für jeden DS ausgeführt.
In deiner Ursprünglichen Fragestellung hast du das etwas anders stehen so das ich auch von anderen Gegebenheiten ausgegangen bin.
	while($workRow = ...) { $events[$workRow['cal_day'] /* == 1..31 */] = $row; }  
Für mich hat es also das Array $events, in denen alle ausgelesenen DS stehen. beteits gegeben.
Daten Sammeln, Aufbereiten, Analysieren und Ausgeben hat bis jetzt für mich immer ganz gut funktioniert.
Also kannst du die while-Schleife so wieder implementieren. (Ergänzt durch deine Änderung bzgl. fetch())
Und für die Ausgabe brauchst du dann nur einmalig die for-Schleife um dir die Kalendertage auszugeben. Dabei wird das Erzeugen "des Tages" von der zusätzlichen Funktion print_table_cell_with_data() übernommen.

Unterm Strich:
Es werden die Daten aus der Datenbank gelesen und in $events gepeichert.
Dann wird die Tabelle mit der for-Schleife generiert und für jeden Tag wird im Array-$events nach Datensätzen geschaut die zusätzlich mit ausgegeben werden könnten.

Das sollte jetzt etwa so aussehen:
<?php
// vim: set ts=4:
// content:364400 - [content:364433]


function print_table_cell_with_data( $i, &$refArrEvents ) // $refArrEvents ist "nur" eine Referenz(&)/Verknüpfung auf das originale Array 
{
	echo "<td id='border'>". $i ."<br>";  
	if( isset($refArrEvents[$i]) && !empty($refArrEvents[$i]) ) // ist Index vorhanden UND enthält es Daten
	{
		// alle Daten ausgeben
		foreach( $refArrEvents[$i] as $refArrEvent )
		{
			echo $refArrEvent['ma_wish'].'<br>';  
		}
	}
	echo "</td>";  
	
	return NULL;
}




function january($username)
{
	require_once("class.editcal.php");  
	$cal_dates = new CALENDAR();
	$date_year = getdate();
	$year = $date_year['year'];  
	
	$days = 31;
	$mnum = 1;
	$i = 1;
	$user = $username;
	// DATEN SAMMELN
	$work = $cal_dates->runcQuery("SELECT id, mitarbeiter, cal_day, cal_mon, cal_year, ma_wish FROM ma_wishes WHERE mitarbeiter=:uname AND cal_mon=$mnum AND cal_year=$year");  
	$work->execute(array(":uname"=>$user));  
	// DATEN AUFBEREITEN
	$events = array();
	while($workRow = $work->fetch())
	{
		$events[$workRow['cal_day']] = $workRow;  
	}
	// DATEN ANALYSIEREN (kein bedarf)
	// DATEN AUSGEBEN
	// Tabellen-/Kalenderkopf
	echo"<center>";  
	echo"<table id='month'>";  
	echo"<tr>";  
	
	// Tabellenzellen / Kalendertage: 1-$days
	//$intLastDayOfMonth = 31; // kann man sicha uch berechnen lassen ;)
	// Ich habe deine VORHANDENE Variable $days in die for-Schleife aufgenommen
	for($i=1; $i<=$days; $i++) // FEHLER KORRIGIERT ( < und <= )
	{
		$this->print_table_cell_with_data( $i, $events );
		// Neue Tabellenzeile wenn 7. Tag
		if( 0==($i%7) )
		{
			echo '</tr><tr>';  
		}
	}
	// Tabellen-/ Kalenderende
	echo"</tr>";  
	echo"</table>";  
	echo"</center>";  
}
?>


~Arano
TheAlex
TheAlex 11.02.2018 um 20:15:37 Uhr
Goto Top
function print_table_cell_with_data( $i, &$refArrEvents ) // $refArrEvents ist "nur" eine Referenz(&)/Verknüpfung auf das originale Array 
		{
		echo"<td id='border'>". $i ."<br>";  
		if( isset($refArrEvents[$i]) && !empty($refArrEvents[$i]) ) // ist Index vorhanden UND enthält es Daten
		{
		// alle Daten ausgeben
		foreach( $refArrEvents[$i] as $refArrEvent )
		{
		if($refArrEvent['ma_wish'] == "Dienst"){  
		echo '<p style="background-color: yellow; border-radius: 50px;">'.$refArrEvent['ma_wish'].'</p>';  
		}
		if($refArrEvent['ma_wish'] == "Frei"){  
		echo '<p style="background-color: green; border-radius: 50px;">'.$refArrEvent['ma_wish'].'</p>';  
		}
		}
		echo "</td>";  
  
		return NULL;
		}
		}
		
function january($username){
					require_once("class.editcal.php");	  
					$cal_dates = new CALENDAR();
					$date_year = getdate();
					$year = $date_year['year'];  
					$mnum = 1;
					$i = 1;
					$user = $username;
					$work = $cal_dates->runcQuery("SELECT id, mitarbeiter, cal_day, cal_mon, cal_year, ma_wish FROM ma_wishes WHERE mitarbeiter=:uname AND cal_mon=$mnum AND cal_year=$year");  
					$work->execute(array(":uname"=>$user));  
					echo"<center>";  
					echo"<table id='month'>";  
					echo"<tr>";  
					$events = array(); 
					while($workRow = $work->fetch()) { 
					$events[$workRow['cal_day']] = $workRow;}  
					$intLastDayOfMonth = 31; // kann man sicha uch berechnen lassen ;)
					for($i=1; $i<=$intLastDayOfMonth; $i++) // FEHLER KORRIGIERT ( < und <= )
					{
					$this->print_table_cell_with_data( $i, $events );
					if( 0==($i%7) )
					{
					echo '</tr><tr>';  
					}
					}
					echo"</tr>";  
					echo"</table>";  
					echo"</center>";  
		 
		}

Habe das ganze jetzt so gelöst! Danke dir Arano!