ich habe einen foreign key aber weiß nicht wie man die id des users in einer andere tabelle einfügt, wie soll das funktionieren (mysql, php)?

1 Antwort

Einmal angenommen, es gibt zwei Tabellen: users und orders. In ersterer Tabelle werden die Nutzerdaten gespeichert (eine ID, Vorname, Nachname) und in letztgenannter Tabelle der Titel einer Bestellung sowie die Nutzer-ID (Fremdschlüssel, der auf die ID-Spalte der users-Tabelle verweist; die ID-Spalte in users ist folglich der Primärschlüssel in users).

Um nun eine neue Bestellung einzutragen, muss erst sichergestellt werden, dass der Nutzer (unter seiner ID) in der users-Tabelle bereits bekannt ist. Dafür könnte man einen SELECT-Query abschicken.

Prepared Statement:

select user_id from users where user_id=?

Ein komplettes Beispiel für einen SELECT-Query mit PHP kannst du dir hier anschauen. Nach dem execute-Aufruf würde es genügen, einmal das Anfrageergebnis zu speichern und danach die Anzahl gefundener Datensätze zu ermitteln.

$stmt->store_result();

if ($stmt->num_rows > 0) {
  // user_id already exists ...
}
else {
  // user_id does not already exists ...
}

In dem Fall, dass der Nutzer noch nicht existiert, ist es notwendig, den Datensatz für ihn anzulegen. Andernfalls kann es direkt mit dem Eintrag der Bestellung in die Datenbank weitergehen.

$statement = $mysqli->prepare("INSERT INTO users (user_id, first_name, last_name) VALUES (?, ?, ?)");
$statement->bind_param("sss", $userId, $firstName, $lastName);

if ($statement->execute()) {
  print "success";
}
else {
  print "failed";
}

Sollte diese Eintragung fehlschlagen, kann nicht mit der Eintragung der Bestellung fortgefahren werden. Das Programm könnte den Nutzer stattdessen darüber informieren, dass ein Fehler aufgetreten ist.

Im Erfolgsfall geht es mit dem eigentlichen Anliegen weiter.

$statement = $mysqli->prepare("INSERT INTO orders (title, user_id) VALUES (?, ?)");
$statement->bind_param("ss", $title, $userId);

if ($statement->execute()) {
  print "success";
}
else {
  print "failed";
}

Jeden Arbeitsschritt solltest du separat testen / prüfen. Bei Fehlern wäre es hilfreich, sich die Daten ausgeben zu lassen, die in die Datenbank eingetragen werden sollen, um sie entsprechend mit dem aktuellen Status in der Datenbank gegenzuprüfen.

Einzelne Spalten in den Tabellen könnten explizite Vorgaben stellen, bspw. bezüglich der Zeichenlänge ihres Wertes oder ob NULL-Werte erlaubt sind.

Um Fehler aufgrund der Zeichenkodierung zu vermeiden, wäre es grundsätzlich ratsam, die involvierten Dokumente sowie die Datenbank(-tabelle) mit derselben Zeichenkodierung zu behandeln. Die Datenbanktabelle könnte utf8mb4 (für UTF-8) verwenden. Bei HTML-Dokumenten kann die Zeichenkodierung als meta-Tag vorgegeben werden.

<!-- inside head ... -->
<meta charset="utf-8">