Fach zu jedem Lehrer ausgeben

Chaoslion

Mitglied
na moin community,

ich hab ein Problem und zwar folgendes:
Ich will zu jedem Lehrer in der Liste die Fächer ausgeben lassen, die in einer anderen DBTabelle stehen. Das hab ich auch über INNER JOIN gelöst, blos wird für jeden Lehrer pro Fach eine neue table erstellt. Hab auch schon was ausprobiert, was nicht wirklich was bringt, danke für Hilfe schonmal, hier noch der Quelltext:
PHP:
<?php
$sql = "SELECT * 
FROM Lehrer
INNER JOIN zuod_Lehrer_Fach ON Lehrer.id = zuod_Lehrer_Fach.Lehrer_ID
INNER JOIN Fach ON zuod_Lehrer_Fach.Fach_ID = Fach.id";
$query = mysql_query($sql);

while($row = mysql_fetch_assoc($query)){
 if($row["Lehrer.id"] == $row["zuod_Fach.Lehrer_ID"]){ //mein versuch rofl
?>
<br>
<center><table width="55%" class="untertable">
	<tr>
		<td width="150">
			<b><?php echo $row["L_Anrede"]." ".$row["L_Vname"]." ".$row["L_Nname"]; ?></b>
		</td>
		<td>
			<?php echo '<b>Sprechzeit:</b> <i>'.$row["L_Sprechzeit"]; ?></i>
		</td>
	</tr>
	<tr>
		<td>
			<img src="include/bilder/lehrer/<?php echo $row["L_Bild"]; ?>">
		</td>
		<td>
			<?phpecho $row["Fachname"];
			}
			 else
			 {
			 echo $row["Fachname"];
			 }?>
		</td>
	</tr>
</table>
</center>
<br>
<?php
}
?>
 
Hi!

Wenn ich Dich richtig verstehe, handelt es sich nur um einen "Logik-Fehler":
Deine DB-Anfrage liefert ja nicht jeden Lehrer ein mal, sondern so oft, wieviele Fächer er hat:
1. Lehrer1 Mathe
2. Lehrer1 Physik
3. Lehrer2 Deutsch
4. Lehrer2 Englisch
...für jede dieser Zeilen erzeugst Du ein komplettes Table.

Möglichkeit 1: eine Innere Schleife / zwei Abfragen
- hole alle Lehrer / Schleife
- - starte Table mit Lehrer n
- - - hole alle Fächer von Lehrer n / Schleife
- - - - schreibe Fächer
- - beende Table
- alle Lehrer abgearbeitet

Möglichkeit 2: weiterhin mit Join
Du könntest abfragen, ob sich der Lehrer beim neuen Datensatz "geändert" hat:
wenn ja: neuen Table beginnen.
wenn nein: nur Fach hinzufügen

... hoffe, das hilft Dir wenigstens ein kleines bischen ;)

Liebe Grüße,
Mark.
 
Speichere einfach in einer Hilfsvariable den aktuell zu verarbeitenden Lehrer und prüfe, ob dieser mit dem zuletzt verarbeiteten Lehrer übereinstimmt. Stimmen sie nicht überein, fängst du einfach eine neue Tabelle an. Beispielsweise:
PHP:
$tmp = null;
echo '<table>';
while( $row = mysql_fetch_assoc($query) ){
	if( $row['Lehrer.id'] !== $tmp && !is_null($tmp) ) {
		echo '</table>';
		echo '<table>';
	}
	echo '<tr>…</tr>';
	$tmp = $row['Lehrer.id'];
}
echo '</table>';
 
Hi!
PHP:
<?php
$sql = "SELECT * 
    FROM Lehrer
    INNER JOIN zuod_Lehrer_Fach ON Lehrer.id = zuod_Lehrer_Fach.Lehrer_ID
    INNER JOIN Fach ON zuod_Lehrer_Fach.Fach_ID = Fach.id";
$query = mysql_query($sql);

$aktLehrer = 0;

while( $row = mysql_fetch_assoc($query) ) {
    if ($row["Lehrer.id"] != $aktLehrer) {
        if ($aktLehrer) {
            echo "</td></tr></table></center><br>";
        }
        $aktLehrer = $row["Lehrer.id"];
?>
<center><table width="55%" class="untertable">
<tr><td width="150"><b><?php echo $row["L_Anrede"]." ".$row["L_Vname"]." ".$row["L_Nname"]; ?></b></td>
    <td><?php echo '<b>Sprechzeit:</b> <i>'.$row["L_Sprechzeit"]; ?></i></td></tr>
<tr><td><img src="include/bilder/lehrer/<?php echo $row["L_Bild"]; ?>"></td>
    <td>
<?php
    }
    
    echo $row["Fachname"];
}

if ($aktLehrer) {
    echo "</td></tr></table></center><br>";
}
?>
Bitte nicht schlagen, wenn's totaler Stuss ist ... es ist ungetestet ;)

Liebe Grüße,
Mark.

//edit: uff, Gumbo, bist Du fix ... da hätt ich's mir auch sparen können ;)
 
Ich glaub das ich das ned ganz raff...
Ich hab das ganze mal ausprobiert, beide lieferten nicht das gewünschte ergebnis...
Bei meiner version wird in die erste table immer wieder in die hineingeschrieben...
Quellcode:
PHP:
<?php
$sql = "SELECT * 
FROM Lehrer
INNER JOIN zuod_Lehrer_Fach ON Lehrer.id = zuod_Lehrer_Fach.Lehrer_ID
INNER JOIN Fach ON zuod_Lehrer_Fach.Fach_ID = Fach.id";
$query = mysql_query($sql);
$lehrerid = 0;
while($row = mysql_fetch_assoc($query)){
if($row["zuod_Lehrer_Fach.Lehrer_ID"] != $lehrerid){
			?>
		</td>
	</tr>
</table>
<?php
}
			else
			{
?>
<br>
<center><table width="55%" class="untertable">
	<tr>
		<td width="150">
			<b><?php echo $row["L_Anrede"]." ".$row["L_Vname"]." ".$row["L_Nname"]; ?></b>
		</td>
		<td>
			<?php echo '<b>Sprechzeit:</b> <i>'.$row["L_Sprechzeit"]; ?></i>
		</td>
	</tr>
	<tr>
		<td>
			<img src="include/bilder/lehrer/<?php echo $row["L_Bild"]; ?>">
		</td>
		<td>
			<?php echo $row["Fachname"];

			?>
<?php
}
?>
</center>
<br>
<?php

}
?>
 
Hi!

1) Du setzt nie - oder habe ich es übersehen? - die lehrerid, d.h. die erste IF-Abfrage sollte immer wahr sein.
2) Das "Schließen" und "Öffnen" eines Lehrer-Tables kann eigentlich nicht "else" sein: es soll ja geschlossen - wenn eines geöffnet ist - und anschließend ein neues geöffnet werden.
3) Der Fachname ist ja nach wie vor nicht vom Table getrennt ... aber gerade das sollte doch passieren.

-> Schau Dir noch mal genau die Vorgehensweise von Gumbo's und meinem Script an: der Algorithmus ist nicht wirklich kompliziert :)

Liebe Grüße,
Mark.
 
Also,

ich hab jetzt beide getestet aber funktionieren bei mir beide ned richtig.
Mitlerweile sieht mein Quellcode anders aus, aber jetzt werden bei EINEM Lehrer alle Fächer eingetragen.
Ich schätze das irgendwo irgendein klitzekleiner fehler ist:
PHP:
<center>
<br>
<?php
$sql = "SELECT Lehrer.id, Lehrer.L_Anrede, Lehrer.L_Vname, Lehrer.L_Nname, Lehrer.L_Sprechzeit, Lehrer.L_Bild, Fach.id, Fach.Fachname, zuod_Lehrer_Fach.Lehrer_ID, zuod_Lehrer_Fach.Fach_ID
FROM Lehrer
INNER JOIN zuod_Lehrer_Fach ON Lehrer.id = zuod_Lehrer_Fach.Lehrer_ID
INNER JOIN Fach ON zuod_Lehrer_Fach.Fach_ID = Fach.id";
$query = mysql_query($sql);
$lehrerid = 0;
while($row = mysql_fetch_assoc($query)){
if(settype($row["Lehrer.id"],"integer") != $lehrerid){
						if($lehrerid != 0){
						?>
									</table>
								</td>
							</tr>
						</table>
						<?php
						}
			?>
			<table>
				<tr>
					<td width="150">
						<b><?php echo $row["L_Anrede"]." ".$row["L_Vname"]." ".$row["L_Nname"]; ?></b>
					</td>
					<td>
						<?php echo '<b>Sprechzeit:</b> <i>'.$row["L_Sprechzeit"]; ?></i>
					</td>
				</tr>
				<tr>
					<td>
						<img src="include/bilder/lehrer/<?php echo $row["L_Bild"]; ?>">
					</td>
					<td>
						<table>
							<tr>
								<td><?php echo $row["Fachname"]; ?></td>
							</tr>
						
			<? 
			$lehrerid = settype($row["Lehrer.id"],"integer");
         	}
			else
			{
			?>
			<tr>
				<td>
					<?php echo $row["Fachname"]; ?>
				</td>
			</tr>
			<?php
			$lehrerid = settype($row["Lehrer.id"],"integer");
			}
}
?>
</center>
</table>
 
Zurück