Frage

Ich lerne PHP und MySQL und ich bin eine Film Webseite zu Lernzwecken zu erstellen.

Ich mag Variablen und Arrays Informationen in eine Datenbank mit Film einfügen, aber in verschiedenen Tabellen.

Das ist, was ich habe jetzt:

include('inc/connection.php');
$conn = dbConnect();

// create SQL
$sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
    VALUES(?, ?, ?, ?, ?)';

// initialize prepared statement
$stmt = $conn->stmt_init();
if ($stmt->prepare($sql)) {
    // bind parameters and execute statment
    $stmt->bind_param('isiis', $movieid, $title, $year, $runtime, $plot);
    $stmt->execute();
}

Diese Variablen in den Filmen Tabelle einfügen.

Aber ich brauche auch (gleichzeitig) einzufügen die Genres des Films, die Schauspieler, Sprachen, etc ... sie sind in Arrays und gehen in verschiedene Tabellen (und vielleicht auch in verschiedenen Reihen). Zum Beispiel enthält das Array die Genres (Action, Krimi, Drama) Genres in der Genre-Tabelle und die Akteure in dem Schauspieler Tisch und so weiter ... Ich werde dann many-to-many-und One-to-many verwendet Tabellen Anzeige der Informationen.

Kann mir jemand erklären, wie dies zu tun ?? Ich muss die Datenbank mehrmals verbinden ?? Ich brauche Schleifen? Ich bin wirklich neu in PHP und MySQLi so versuchen Sie es so viel zu erklären, wie Sie können.

Danke.

War es hilfreich?

Lösung

INSERT unterstützt nur eine Tabelle zu einer Zeit, so werden Sie sicherlich mehrere INSERT Anweisungen ausführen müssen, wenn Sie komplexe Daten, die in mehrere Tabellen geht.

Wenn Sie einen bestimmten Wert $movieid eingefügt haben, um movies dann wissen Sie, was schätzen Sie an den Reihen der anderen Tabellen einfügen müssen, referentielle Integrität zu erfüllen (Pseudo-Code folgt, nicht voll funktionsfähig Beispiel):

$movies_sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
        VALUES(?, ?, ?, ?, ?)';

// execute ($movieid, ...)

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (?, ?)';

foreach ($actorlist as $actorid) {
    // execute ($movieid, $actorid)
}

$lang_sql = 'INSERT INTO movie_languages (movieid, language) 
    VALUES (?, ?)';

foreach ($languagelist as $language) {
    // execute ($movieid, $language)
}

Wenn Ihre movies Tabelle gibt einen AUTO_INCREMENT Primärschlüssel verwendet, dann können Sie den Wert während des ersten INSERT erzeugt erhalten entweder telefonisch unter $ mysqli-> insert_id () oder durch die eingebaute Funktion mit LAST_INSERT_ID() .

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (LAST_INSERT_ID(), ?)';
foreach ($actorlist as $actorid) {
    // execute ($actorid) -- only one param in this INSERT
}

Beachten Sie, dass LAST_INSERT_ID() berichtet den jüngsten automatisch generierten Wert während der aktuellen Sitzung, so dass, wenn Sie in einer anderen Tabelle einfügen, die einen automatischen Primärschlüssel verwendet, der Wert ändert. Aber der angegebene Wert ist stabil während der Sitzungen; es tut nicht ändern, wenn eine andere Client-Sitzung Einsätze gleichzeitig zu tun.

Andere Tipps

  1. Sie benötigen nur eine Datenbankverbindung
  2. Ja, Sie brauchen Schleifen
  3. Verwenden eines auto_increment Primärschlüsselfeld in jeder Tabelle und dann $stmt->insert_id() verwenden den Wert nach jedem insert zu extrahieren
  4. Wenn Sie können, InnoDB auf dem MySQL-Server verwenden, um Transaktionsunterstützung zu bekommen, und dann commit relevanten Updates zusammen, um sicherzustellen, dass Ihre Datenbank konsistent ist, wenn Ihr Skript auf halbem Weg durch ein Update abfällt. Das häufigere MyISAM Datenbank Tabellenformat nicht unterstützt Transaktionen.

Sie brauchen nicht mehr als eine Datenbank-Verbindung zu verwenden - in der Tat, das ist, was Sie überhaupt nicht tun sollten, denn man konnte nicht gruppieren Sie Ihre Einsätze in eine atomare Transaktion.

Was Sie tun sollten (Zusammenfassung) ist:

BEGIN;
INSERT INTO Genres...;
INSERT INTO Actors...;
INSERT INTO othertable....;
and so on, for referenced columns/tables.
INSERT INTO Movies....;
COMMIT;

Auf diese Weise sollten Sie immer einen konsistenten Datenbestand haben.

Sie werden wahrscheinlich nach Fremdschlüssel - eine ID aus der Basistabelle verwenden, um andere Beziehungen in anderer Tabelle zu identifizieren

(Verwendung MovieID in anderer Tabelle zu identifizieren, welcher Film die anderen Werte usw. gehören.)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top