Verbindung zweier Tabellen mit PHP / MySQL ?

Oh man, ich habe entweder ehrlich ein Brett vor dem Kopf oder irgendwas verwechsle ich noch (bin nicht sehr geübt im Umgang mit PHP).

Ich habe nun folgenden Quellcode in der Datei neu_sch.php. Man soll da neue Schüler einpflegen können und diesen gleich mit vorhandenen Fächer verknüpfen können.

Der Code sieht dann so aus:

Code:
 // Datei: neu_sch.php

<html>
<body>
<?

if ($submit) {
$db = mysql_connect("localhost","root","");
mysql_select_db("test",$db);
$sql = "INSERT INTO schueler (name) VALUES ('$name')";
$sql1 = "INSERT INTO join (fachID) VALUES('$vfach')";
$result = mysql_query($sql,$db);
$result1 = mysql_query($sql1,$db);
echo "Datensatz des Schülers erfolgreich aufgenommen!<br><br>";
}

?>
<form method="post" action="<? echo $PHP_SELF ?>">
Name des Sch&uuml;lers:<input type="text" name="name" value="<? echo $name ?>" size="10">

<?
$db = mysql_connect("localhost", "root", "");
mysql_select_db("test",$db);
$sql= "SELECT * FROM faecher";
$result=mysql_query($sql,$db);


?>
<br><br>
Bitte F&auml;cher ausw&auml;hlen: 
<select name="fachID[]" size="5" multiple>
<?while($row = mysql_fetch_object($result))
	{
	$name2= $row->name;
	print ("<option value=$vfach>$name2 ");
	}
?>
</select>
<br><br>

<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>

Er zeigt mir nun korrekt in dem SELECT-Feld die vorhandenen Fächer an. Diese kann ich auch (multiple) Auswählen. Wenn ich auch "Eintragen" klicke, dann schreibt er auch die automatische ID und den Namen des Schülers in die Tabelle "schueler" aber absolut nichts in die Tabelle "join".

Woran mag das nun wieder liegen?
 
Zuerst mal ganz wichtig:

Benutze die Superglobalen Array $_GET, $_POST,$_SESSION und $_COOKIE (in deinem Fall $_POST). Du hast, offensichtlich, register_globals auf "on" gestellt! Stell das auf "off", denn es ist eine ziemlich unsichere Geschichte und kann auch zu ziemlich gravierenden Problemen beim Scripten führen. Ich schreib dir mal das Script so damit du nicht alles umschreiben musst, aber setz dich mit dem Thema auseinander. Hier im Forum oder bei Google findest du genug! ;)

Außerdem wärs besser wenn du für PHP-Code auch den PHP-Tag benutzen würdest! funktioniert genauso, wie der von dir benutzte CODE-Tag ([ CODE][ /CODE]) Nur anstatt CODE schreibst du PHP.

So nun zu deinem Problem. Du musst in der Tabelle "join" für jedes Element in dem Array "fachID" einen Eintrag erstellen! Außerdem übergibst du den Wert falsch! ;) :


PHP:
// Datei: neu_sch.php

<html>
<body>
<?
if (isset($_POST['submit'])) {

$submit=$_POST['submit'];
$name=$_POST['name'];
$fach_id=$_POST['fachID'];


$db = mysql_connect("localhost","root","");
mysql_select_db("test",$db);
$sql = "INSERT INTO schueler (name) VALUES ('$name')";

foreach($fach_id as $fach_id_v){
    $sql1 = "INSERT INTO join (fachID) VALUES('$fach_id_v')";
}

$result = mysql_query($sql,$db);
$result1 = mysql_query($sql1,$db);
echo "Datensatz des Schülers erfolgreich aufgenommen!<br><br>";
}

?>
<form method="post" action="<? echo $PHP_SELF ?>">
Name des Sch&uuml;lers:<input type="text" name="name" value="<? echo $name ?>" size="10">

<?
$db = mysql_connect("localhost", "root", "");
mysql_select_db("test",$db);
$sql= "SELECT * FROM faecher";
$result=mysql_query($sql,$db);


?>
<br><br>
Bitte F&auml;cher ausw&auml;hlen: 
<select name="fachID[]" size="5" multiple>
<?while($row = mysql_fetch_object($result))
	{
	$name2= $row->name;
                $id_fach=$row->id;
	print ("<option value='$id_fach'>$name2</option>");
	}
?>
</select>
<br><br>

<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>

So müsste das jetzt funktionieren! Ist nicht getestet! d.h.: Fehler sind möglich! Probiers einfach aus!
 
So, habe nun Deinen Quellcode kopiert und es noch um die letzte ID erweitert, damit ich auch in der "join" Tabelle den Wert der SchülerID habe.

Der Quellcode sieht nun so aus (nur leicht abgeändert):

PHP:
// Datei: neu_sch.php

<html> 
<body> 
<? 
if (isset($_POST['submit'])) { 

$submit=$_POST['submit']; 
$name=$_POST['name']; 
$fach_id=$_POST['fachID']; 


$db = mysql_connect("localhost","root",""); 
mysql_select_db("test",$db); 
$sql = "INSERT INTO schueler (name) VALUES ('$name')"; 

$result = mysql_query($sql,$db); 


$new_id =mysql_insert_id();
foreach($fach_id as $fach_id_v){ 
    $sql1 = "INSERT INTO join (schuelerID,fachID) VALUES('$new_id','$fach_id_v')"; 
} 
$result1 = mysql_query($sql1,$db);

echo "Datensatz des Schülers erfolgreich aufgenommen!<br><br>"; 
} 

?> 
<form method="post" action="<? echo $PHP_SELF ?>"> 
Name des Sch&uuml;lers:<input type="text" name="name" value="<? echo $name ?>" size="10"> 

<? 
$db = mysql_connect("localhost", "root", ""); 
mysql_select_db("test",$db); 
$sql= "SELECT * FROM faecher"; 
$result=mysql_query($sql,$db); 


?> 
<br><br> 
Bitte F&auml;cher ausw&auml;hlen:  
<select name="fachID[]" size="5" multiple> 
<?while($row = mysql_fetch_object($result)) 
    { 
    $name2= $row->name; 
                $id_fach=$row->id; 
    print ("<option value='$id_fach'>$name2</option>"); 
    } 
?> 
</select> 
<br><br> 

<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>

Allerdings passiert da nach wie vor nichts in der Tabelle "join". Der Name des Schülers wird nach wie vor korrekt in die Tabelle "schueler" eingetragen.

Die Tabellen sehen so aus:

Code:
-- 
-- Tabellenstruktur für Tabelle `faecher`
-- 

DROP TABLE IF EXISTS `faecher`;
CREATE TABLE IF NOT EXISTS `faecher` (
  `id` int(5) NOT NULL auto_increment,
  `name` longtext collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=5 ;

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `join`
-- 

DROP TABLE IF EXISTS `join`;
CREATE TABLE IF NOT EXISTS `join` (
  `schuelerID` int(11) NOT NULL default '0',
  `fachID` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `schueler`
-- 

DROP TABLE IF EXISTS `schueler`;
CREATE TABLE IF NOT EXISTS `schueler` (
  `id` int(5) NOT NULL auto_increment,
  `name` longtext collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=16 ;

Ist mir eigentlich peinlich dauernd zu Fragen, aber wenn ich etwas ausprobieren möchte, dann beiße ich mich im allgemeinen ziemlich fest.
 
Du solltest das Query, welches Du Dir zum Einfügen in die Join Tabelle zusammensetzt, auch in der foreach-Schleife ausführen und nicht erst danach. Ansonsten wird es ja nur einmal (mit den Daten des letzten gewählten Fachs) ausgeführt.

Gruß hpvw
 
Hm, ja - Du hast recht.

PHP:
foreach($fach_id as $fach_id_v){ 
    $sql1 = "INSERT INTO join (schuelerID,fachID) VALUES('$new_id','$fach_id_v')";
	$result1 = mysql_query($sql1,$db);
}

Aber dennoch sollte er doch irgendetwas in die Tabelle JOIN speichern, oder? Aber da passiert einfach nichts *wunder*
 
Die Ausgabe von [phpf]mysql_error[/phpf] hätte Dich (und uns) der Lösung vielleicht ein Stück näher gebracht:
join ist in MySQL ein reserviertes Wort. Wenn Du es als Tabellenname verwendest, musst Du es in Querys in Backticks (`) setzen.

Gruß hpvw
 
Mann bin ich blind! Nenn die Tabelle von 'join' in 'linktable' oder so um! Denn 'join' ist bereits ein Begriff um Abfragen zu formulieren!

//edit:
Da war wohl jemand schneller als ich!
 
nero_85 hat gesagt.:
Nenn die Tabelle von 'join' in 'linktable' oder so um!
Jetzt, wo Du es sagst: Ich empfehle das gleiche. Der Name ist wirklich nicht glücklich gewählt, zumal in einer Datenbank oft mehr als eine Tabelle zur Verknüpfung vorkommt.

Gruß hpvw
 
Argh. Verdammt nochmal daran lag es wirlkich. Habe die Tabelle wie ihr geschrieben habt von "join" in "linktab1" geändert und es geht. Dann gehen jetzt auch die anderen Funktionen, die ich vorerst deaktiviert hatte, damit ich dieses Testen konnte :) *jubel*

Mist, hätte ich meine letzten Versuche bleiben lassen können - obwohl nein, das übte !

Vielen Vielen Dank Euch beiden !! Den Rest bekomme ich nun leicht selbst hin ! *freut sich sichtlich*
 
Oh man, nun hatte ich in der letzten Zeit diverse Dinge erledigt, bis mir dann auffiel, daß man ja Eingaben auch editieren müßte.

Gut, ich setzte mich ran und stellte schnell fest, daß ich nicht die bereits belegten Fächer mit <option ".." selected>... darstellen kann. Sprich wenn beim Schüler "Klaus" bei der Eingabe die Fächer "Mathe" + "Englisch" eingestellt wurde, so stehen diese Informationen wie es mir hier hier erklärt wurde in den 3 Tabellen. Das Funktioniert wunderbar

Wenn ich aber den Datensatz "Klaus" ändern will, und mit in dem select Feld anzeigen lassen möchte, welche er denn bisher belegte, so bekomme ich es nicht hin.

Ich testete schon den ganzen Tag, aber mitlerweile will ich da auch keinen neuen Gedanken kommen. Vielleicht könntet ihr mir wieder einen Denkanstoß geben?

Hier mal der Code (die Löschtfunktion mit dem neuen einlesen der select-feld eingabe ist noch nicht getestet, da ich erst die select-edit funktion fertig haben möchte)

PHP:
<html>
<head
</head>
<body>


<?

$db = mysql_connect("localhost","root","");

mysql_select_db("test",$db);

if ($id) {
if ($submit) {

$name=$_POST['name']; 
$fach_id=$_POST['fachID'];

/* Name updaten */
$sql = "UPDATE schueler SET name='$name' WHERE id=$id";
$result = mysql_query($sql,$db);

/* Alte Daten löschen aus 'nutzen' und neue danach einlesen */
$result = mysql_query("DELETE FROM nutzen WHERE schuelerID=$id",$db);

$new_id =mysql_insert_id();
foreach($fach_id as $fach_id_v){ 
    $sql1 = "INSERT INTO nutzen (schuelerID,fachID) VALUES('$new_id','$fach_id_v')";
	$result1 = mysql_query($sql1,$db);
	 
} 

echo "Die Informationen wurden aktualisiert.\n";
}
else {

$sql = "SELECT * FROM schueler WHERE id=$id";
$result = mysql_query($sql,$db); 
$myrow = mysql_fetch_array($result);

?>
<table>
<form method="post" action="<? echo $PHP_SELF ?>">
<input type=hidden name="id" value="<? echo $myrow["id"] ?>">

<tr><td>Name des Sch&uuml;lers:</td><td><input type="text" name="name" value="<? echo $myrow["name"] ?>" size="30"></td></tr>
<tr><td>Belegte F&auml;cher:</td>
<td>
<select name="fachID[]" size="5" multiple> 
<?
$db = mysql_connect("localhost","root",""); 
mysql_select_db("test",$db); 
$sql= "SELECT * FROM faecher ORDER BY name ASC"; 
$result=mysql_query($sql,$db);

while($row = mysql_fetch_object($result)) 
    { 
    $name2= $row->name; 
    $id_fach=$row->id; 
	$sql_neu="SELECT * FROM nutzen WHERE fachID=$id_fach";
	$result_neu=mysql_query($sql_neu,$db);
	
	if($id_fach == $id_nutzen)
	{
	print("<option selected value='$id_fach'>$name2</option>");
	}
	else
	{
	print("<option value='$id_fach'>$name2</option>");
	}	
	}
	
	    
    } 


?> 
</select> 
</td></tr>
<input type="hidden" name="datum" value="<? $dat=date("Y-m-d H:m:s");echo $dat; ?>">
<tr><td><input type="submit" name="submit" value="Eintragen!"></td></tr>
</form>
</table>
<?
}
}
else {
printf("Bitte Datensatz zur aktualisierung auswählen!<br><br>");
$result = mysql_query("SELECT * FROM schueler",$db);
while ($myrow = mysql_fetch_array($result)) {
printf("<table><tr><td><a href=\"%s?id=%s\">%s </a></td></tr></table>", $PHP_SELF, $myrow["id"], $myrow["name"]);
}

}
?>
</body>
</html>

Wäre echt nett, wenn ihr mir wieder auf die Sprünge helfen könntet...
 
Zurück