Verbindung zweier Tabellen mit PHP / MySQL ?

StrangeThing

Mitglied
Hallo,

also ich möchte zum einen eine Tabelle haben, in denen alle Fächer aufgeführt sind und zum anderen eine Tabelle haben, wo alle Schüler enthalten sind. Eingegeben werden alle Daten via Formularen.

Und nun das eigentliche Problem:

Ich möchte natürlich den Fächern Schüler zuweisen. D.h. wenn ich ein neues Fach anlege, dann möchte ich ein Auswahlfeld haben, wo ich alle verfügbaren Schüler sehe und die betroffenen Auswähle. Da ergibt sich bei mir schon das Problem, daß ich ja z.B. am Anfang 10 Schüler (insgesamt) und später dann vielleicht mehr (nächstes Halbjahr). Also muss das ganze ja dynamisch sein. Nur wie stelle ich sowas an?

Das ganze sollte natürlich auch umgekehrt gehen, das wenn ich einen neuen Schüler eingebe, ich ihm wie oben beschrieben ihm Fächer zuweisen. Gleiches Problem.

Dann letztendlich möchte ich auch abfragen können, weleche Schüler welches Fach belegt.

Habt ihr eine Idee, wie ich das Sinnvoll umsetzen kann mit PHP / MySQL?

Grübele da schon eine ganze Weile drüber :confused:
 
Was Du darstellen willst, nennt sich n:m-Beziehung. Diese werden in relationalen Datenbanken mit drei Tabellen dargestellt. Zwei davon sind die beiden Tabellen mit den zu verknüpfenden Entitäten. Diese hast Du nach Deiner Schilderung ja bereits. Ich hoffe, Du hast auch eine Auto-Increment-ID als Primärschlüssel in jeder der beiden Tabellen.
Zur Verknüpfung verwendet man eine dritte Tabelle. In dieser stehen als Fremdschlüssel die IDs der beiden Tabellen. Beide gemeinsam bilden den (zusammengesetzten) Primärschlüssel dieser Tabelle. Du könntest die Tabelle zum Beispiel 'SchuelerBelegtFach' nennen.
In jede Zeile dieser Tabelle schreibst Du ein Paar aus Schüler und Fach. Weitere Attribute sind in dieser Verknüpfungstabelle auch möglich, in Deinem Fall zum Beispiel die erlangte Note. Steht diese noch nicht fest (z.B. weil der Kurs noch nicht abgeschlossen ist) könnte man NULL eintragen.

Das ganze mal an einem Beispiel:

Du hast die Schüler Alex, Basti, Carla und Dennis. Die angebotenen Fächer sind Erdkunde, Französisch und Geschichte.

Alex belegt Geschichte.
Basti belegt Erdkunde und Geschichte.
Carla belegt Französisch und Geschichte.
Dennis belegt Erdkunde und Französisch.

Die Tabelle Schueler:
Code:
ID Name
 1 Alex
 2 Basti
 3 Carla
 4 Dennis
Die Tabelle Faecher:
Code:
ID Fach
 1 Erdkunde
 2 Französisch
 3 Geschichte
Die Tabelle SchuelerBelegtFach:
Code:
schuelerID fachID
         1      3
         2      1
         2      3
         3      2
         3      3
         4      1
         4      2
Gruß hpvw
 
Ja, exakt das ist es, was ich suche .. Danke schonmal :)

Jetzt bleibt nur noch die Frage, wie ich das ganze nun via PHP abfrage. Normale abfragen ala "Zeige Zeile mit ID =3" kann ich, nur wie macht man dies über die 3 Tabellen hinaus.

Sprich an deinem Beispiel die Auflistung aller Schüler mit dem Fach Erdkunde.

Werde das auf jeden Fall testen :)
 
Zum Verknüpfen von Tabellen in einer Abfrage gibt es den JOIN:
Code:
SELECT
  Schueler.Name
FROM Schueler
JOIN SchuelerBelegtFach 
  ON Schueler.ID=SchuelerBelegtFach.SchuelerID
JOIN Faecher 
  ON SchuelerBelegtFach.FachID=Faecher.ID
WHERE Faecher.Fach LIKE 'Erdkunde'
Besser wäre natürlich, (wenn Du die Abfrage aus einer Suchmaske heraus initiierst,) dass Du in der Suchmaske das Fach zur Anzeige und die ID des Faches als Wert zur Auswahl verwendest. Du sparst Dir im Query dann einen JOIN und arbeitest performanter, da ein INT-Vergleich (am besten noch mit Index) schneller ist als ein CHAR-Vergleich:
Code:
SELECT
  Schueler.Name
FROM Schueler
JOIN SchuelerBelegtFach 
  ON Schueler.ID=SchuelerBelegtFach.SchuelerID
WHERE SchuelerBelegtFach.FachID=1 # <- die ID aus der Suchmaske
Gruß hpvw
 
Dann mal hier die Rückmeldung *seufzt*

Habe nun einiges getestet aber dabei ist außer Kopfweh nichts heraus gekommen. Irgendwie stehe ich auf dem Schlach, weshalb ich auch mal das "Gesamtpaket" poste.


Code:
// Datei: neu_fa.php

<html>
<body>
<?

if ($submit) {
$db = mysql_connect("localhost","root","");

mysql_select_db("test",$db);
$sql = "INSERT INTO faecher (name) VALUES ('$name')";
$result = mysql_query($sql,$db);
echo "Datensatz der Schulung erfolgreich aufgenommen!<br><br>";

}
?>
<table>
<form method="post" action="<? echo $PHP_SELF ?>">
<tr><td>Name des Faches:</td><td><input type="text" name="name" value="<? echo $name ?>" size="10"></td></tr>
<tr><td><input type="hidden" name="datum" value="<? $dat=date("Y-m-d H:m:s");echo $dat; ?>">
<input type="submit" name="submit" value="Eintragen!"></td></tr>
</form> 
</table>
</body>
</html>

Oben stehende Datei nutze ich, um neue Fächer einzutragen. Die Datei "neu_sch" zum erstellen der Schüler sieht entsprechend gleich aus, nur eine andere Tabelle (schueler) wird aufgerufen.

Und da ist nun schon mein Problem. Ich kann mit den beiden Dateien jeweils Einträge in den dafür vorgesehenden Tabellen machen, aber wie kann ich denn gleichzeitig noch einen Eintrag in der join-Tabelle machen?

Und dazu kommt, daß ich ja, falls es schon Schüler gibt, diese auch gleich beim Eingeben berücksichtigen wollte. Andersherum natürlich auch. Wenn ich einen Schüler anlege und es schon Fächer gibt, diese dann auch gleich miteinander verknüpfen.

Da habe ich allerdings bereits schon keine Ahnung mehr, wie ich es machen will.

Hat dazu noch jemand eine Idee ?
 
Sowohl die Funktion [phpf]mysql_insert_id[/phpf], als auch die MySQL-Funktion LAST_INSERT_ID() liefern Dir die letzte in der bestehenden Verbindung vergebene Autoincrement-ID. Ist die ID ein BIGINT musst Du die MySQL-Variante verwenden, bei INTs funktioniert es auch mit der PHP-Variante.
Diese ID kannst Du Dir nach dem Eintragen auslesen und in die Verknüpfungstabelle eintragen.

Gruß hpvw
 
Sehr gut, nun weißt ich schon, wie ich an die vorherige ID komme, für den einen neuen Datensatz.

Nur wie kann ich nun bei der Erstellung eines Faches auch gleichzeitig einen (am besten mehrere) Schüler zuweisen?

Ich stehe da atm sehr auf dem Schlauch *grübel*
 
Dazu brauchst du zuerst eine Auswahlliste. Dieser liste gibst du dann z.B. den Namen schueler[ ]. Wichtig Hierbei sind die eckigen Klammern, denn dadurch wir nachher bei der Verarbeitung des Scriptes ein Array und keine Variable gebildet.

Außerdem muss die Auswahlliste noch multiselect unterstützen. Danach lädst du einfach mit einer SQL-Abfrage die Daten in die Liste. Jetzt kannst du mehrere Schüler auswählen und in der Verarbeitung zur neuen ID (erinnere dich an mysql_insert_id();) hinzugefügt werden.

Hast dus ungefähr verstandenß
 
Zurück