MySQL Fremdschlüssel

  • Ersteller Ersteller SGD-Daniel
  • Erstellt am Erstellt am
S

SGD-Daniel

Gast
Hallo,

ich habe mehrere Tabellen. Eine Tabelle ist eine Tabelle, wo alle Nutzer der Website aufgelistet sind. Jeder hat eine ID-Nummer und ist zudem der Primärschlüssel.
Alle anderen Tabellen haben auch die Spalte "ID", nur ist das eben kein Primärschlüssel, sondern soll der Fremdschlüssel von der Nutzertabelle sein. So dass, wenn sich ein Nutzer anmeldet, in jeder Tabelle die "ID-Nummer" hinzugefügt wird.

Was muss ich dabei jetzt machen?
 
Was willst Du denn genau machen, bzw präzisiere mal Deine Frage.

Pauschal sage ich:
Die Schlüssel der gewünschten Tabellen in einer Select-blabla-where abfrage miteinander vergleichen und das Ergebnis verarbeiten. :)
 
Ein Nutzer soll sich registrieren. Dabei wird die Tabelle "nutzer" mit seinen Daten vollständig ausgefüllt. z.B. ID, Name, Passwort usw.! Es gibt aber noch andere Tabellen, die sich mit der Tabelle "nutzer" verknüpfen. Daher will ich, dass, wenn der Nutzer sich registriert, gleichzeit die anderen Tabellen deren ID mit deren der Tabelle "nutzer" ID einträgt.
So dass alle Tabellen die Spalte ID haben (haben sie bereits) und überall die ID eingetragen wird, bei Registrierung!

Edit: Denn momentan ist es so, dass nur in der Tabelle "nutzer" Daten eingetragen werden.
 
Naja dann trägste erstmal in die nutzertabelle mit insert ein.

Dann ermittelste zb.
mit einer select id from nutzer order by id desc limit 1
diese, die letzte ID. Dann haste schonmal die neue id.

Nun kannste in die anderen tabellen per insert auch die id und sonstige daten eintragen. das ganze dann zb. in php zu realisieren.
 
INSERT INTO nutzer (nickname,name,passwort) VALUES ('".$_POST["nickname"]."','".$_POST["name"]."','".$_POST["passwort"]."');";

Ich denke mal, du meinst direkt beim registrieren. Aber wie schreibe ich das jetzt? Bei Tabelle Nutzer ist die "ID" mit auto_incremental definiert. Bei den anderen tabellen nicht.
 
ja das ist alles richtig, das autoincrement in der nutzertabelle, bei den anderen ists egal, jenachdem für was du die nun brauchst.
Eventuell kann auch dort die ID primärschlüssel sein, wenn kein anderer bzw. nur dieser immer eindeutig sein muss, braucht aber nicht unbedingt.

also so in etwa:

INSERT INTO nutzer (nickname,name,passwort) VALUES ('".$_POST["nickname"]."','".$_POST["name"]."','".$_POST["passwort"]."');";

SELECT ID FROM nutzer ORDER BY ID DESC LIMIT 1
dann das ergebnis (die ID) per php in $deineIDvariable abholen

dann sowas wie:

INSERT INTO tabelle2 (ID, blabla, blablobb) VALUES ('".$deineIDvariable.", ".$blabla.", .$blablobb."');"

INSERT INTO tabelle3 (ID, blabla, blablobb) VALUES ('".$deineIDvariable.", ".$blabla.", .$blablobb."');"

etc.
 
Zuletzt bearbeitet:
$sql = "INSERT INTO nutzer (nickname,name,passwort) VALUES ('".$_POST["nickname"]."','".$_POST["name"]."','".$_POST["passwort"]."');";
$sql = "SELECT ID FROM nutzer ORDER BY ID LIMIT 1";
$id=id;
$sql = "INSERT INTO tag (id) VALUES ('".$id."')";
$sql = "INSERT INTO woche (id) VALUES ('".$id."')";
$result=mysql_query($sql);
if($result){
echo "Herzlichen Glückwunsch!<br><br>Ihre Daten wurden erfolgreich registriert.";
}
else {
echo "Ihre Registrierung konnte nicht erfolgen.<br><br>Vermutlich war der Name schon vergeben. Wenden Sie sich bitte an den Administrator.";
}
@mysql_close();
}

So habe ich das jetzt. Funktioniert aber nicht! Er erstellt ein Datensatz bei "woche" mit alles nullen!
 
Zuletzt bearbeitet:
Versuchs mal so :)

$sql = "INSERT INTO nutzer (nickname,name,passwort) VALUES ('".$_POST["nickname"]."','".$_POST["name"]."','".$_POST["passwort"]."');";
$result = mysql_query($sql);

if($result){

$sql = "SELECT ID FROM nutzer ORDER BY ID DESC LIMIT 1";
$result = mysql_query($sql);

$ergebnis = mysql_fetch_array($result); # in array einlesen
$id=$ergebnis['ID'];

$sql = "INSERT INTO tag (id) VALUES ('".$id."')";
mysql_query($sql);
$sql = "INSERT INTO woche (id) VALUES ('".$id."')";
mysql_query($sql);

echo "Herzlichen Glückwunsch!<br><br>Ihre Daten wurden erfolgreich registriert.";

}
else {

echo "Ihre Registrierung konnte nicht erfolgen.<br><br>Vermutlich war der Name schon vergeben. Wenden Sie sich bitte an den Administrator.";


}

@mysql_close();
 
ist doch klar Du musst nach jeder SQL-Anweisung ein query machen. Sonst übershcreibt der doch das $sql jedesmal und führt nur die letzte aus (also die woche). ;)

0 = INSERT INTO tag (id) Gross-Kleinschreibung beachtet?

Also 0 bedeutet die Variable $id ist irgendwie leer.

dann wäre hier ein fehler zu suchen

$sql = "SELECT ID FROM nutzer ORDER BY ID DESC LIMIT 1";
$result = mysql_query($sql);

$ergebnis = mysql_fetch_array($result); # in array einlesen
$id=$ergebnis['ID'];

heisst denn die spalte in der nutzer exakt ID (gross/klein) ?

hast du auch bei nutzer "not null" in der spalte angeben, eventuell ist ja die nutzer-tabelle noch leer und 0 wäre dann wenn nicht, der anfang? ;)
 
Zuletzt bearbeitet:
Ja, habe es in ID geändert. Jetzt erstellt er in den beiden Tabellen zwar ein Datensatz, aber mit ID "0". Was stimmt noch nicht?
 
welche id hat er denn bei "INSERT INTO nutzer (nickname,name,passwort) eingetragen, 1 ?

falls ja, dann ist der fehler wie gesagt hier zu suchen

$sql = "SELECT ID FROM nutzer ORDER BY ID DESC LIMIT 1";
$result = mysql_query($sql);

$ergebnis = mysql_fetch_array($result); # in array einlesen
$id=$ergebnis['ID'];

sprich er hat nicht die letzte ID aus der nutzertabelle erhalten und somit ist die Variabe leer oder 0.
Ich finde aber jetzt so auf die schnelle auch eigentlich keinen Fehler?
 
Danke es geht. War wirklich ein ID klein geschrieben. Hatte kurz zuvor mal was probiert und das eine kleine ID übersehen!

und wenn ich ein Benutzer löschen will, muss ich das gleiche machen?
 
zum löschen so in etwa
Du hast die $id, dann:

mysql_query("DELETE FROM tabelle 1 WHERE ID = '".$id."'");
mysql_query("DELETE FROM tabelle 2 WHERE ID = '".$id."'");
mysql_query("DELETE FROM tabelle 3 WHERE ID = '".$id."'");
 
Keine Ursache. Ja php und SQL unterscheiden peinlichst Gross- und Kleinschreibung und verzeihen keinen Fehler.
Aber darauf wirst Du mit der Zeit automatisch sensibilisiert, ansonsten unnötige Mehrarbeit und Fehlersuche. ;)
 
Ich habe ein ähnliches Problem und habe versucht es mit mysql_insert_id zu lösen. Klappt aber nicht.
Also mein Code sieht folgendermaßen aus:
Code:
  $sql_ort = "INSERT INTO lo_ort (plz, ort) VALUES ('$plz', '$ort')";
  $eintrag_ort = mysql_query($sql_ort);
  $id_ort = mysql_insert_id();
  
  $sql_kontakt = "INSERT INTO lo_kontakt (strasse, nr, tel, handy, mail, o_plz) VALUES ('$strasse', '$nr', '$telefon', '$handy', '$mail', '$id_ort')";
  $eintrag_kontakt = mysql_query($sql_kontakt);
  $id_kontakt = mysql_insert_id();
  
  $sql_schwimmer = "INSERT INTO lo_schwimmer (name, vname, jahrgang, geschlecht, kid) VALUES ('$name', '$vorname', '$jahrgang', '$geschlecht', '$id_kontakt')";
  $eintrag_schwimmer = mysql_query($sql_schwimmer);

Ich habe versucht mal ein paar Daten einzufügen, aber er trägt nur in der Tabelle lo_ort etwas ein. In den anderen Tabellen nicht. Das hat er nur einmal zwischendurch getan, keine Ahnung warum. Am Code hatte ich zwischenzeitlich nichts geändert.
Meine Tabellen sehen folgendermaßen aus:
Code:
CREATE TABLE lo_ort
(
plz INT NOT NULL PRIMARY KEY,
ort VARCHAR(100)
)TYPE=INNODB;

CREATE TABLE lo_kontakt
(
adid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
strasse VARCHAR(50),
nr VARCHAR(4),
tel INT,
handy INT,
mail VARCHAR(50),
o_plz INT NOT NULL,
FOREIGN KEY (o_plz) REFERENCES lo_ort(plz)
)TYPE=INNODB;

CREATE TABLE lo_schwimmer
(
sid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
vname VARCHAR(50),
jahrgang YEAR,
geschlecht ENUM('männlich','weiblich'),
kid INT NOT NULL,
FOREIGN KEY (kid) REFERENCES lo_kontakt(adid)
)TYPE=INNODB;

Edit: Habe den Fehler gefunden. Hab in der Tabelle lo_ort kein AUTO_INC gehabt, somit auch keinen Wert in mysql_insert_id().
 
Zuletzt bearbeitet:
Zurück
Oben