2009-03-07 1 views
1

Ich lerne PHP und MySQL und ich erstelle eine Film-Website für Lernzwecke.Einfügen von Variablen und Arrays in verschiedenen Datenbanktabellen mit PHP und MySQL

Ich möchte Variablen und Arrays mit Filminformationen in eine Datenbank einfügen, aber in verschiedenen Tabellen. Diese

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 legen Sie die Variablen in den Filmen Tabelle.

Aber ich muss auch (gleichzeitig) die Genres des Films, die Schauspieler, Sprachen usw. einfügen ... sie sind in Arrays und gehen in verschiedene Tabellen (und vielleicht auch in verschiedenen Reihen). Zum Beispiel das Array mit den Genres (Action, Crime, Drama) in der Genres-Tabelle und den Aktoren in der Aktor-Tabelle usw. Ich werde dann viele-zu-viele und eins-zu-viele-Tabellen verwenden zeige die Info an.

Kann mir jemand erklären, wie man das macht ?? Ich muss mich mehrmals mit der Datenbank verbinden ?? Ich brauche Schleifen? Ich bin wirklich neu in PHP und MySQLi, bitte versuchen Sie so viel wie möglich zu erklären.

Danke.

+0

Meinst du nicht Zwecke anstelle von Schweinswalen? – Gumbo

+0

Zum Lernen von Schweinswalen möchten Sie vielleicht eine Art von Ozeanographie Website :) –

+0

:) Ich meine Zwecke .. Ich habe die Rechtschreibprüfung verwendet ... – Jonathan

Antwort

1

INSERT unterstützt nur eine Tabelle gleichzeitig, Sie müssen also sicher mehrere INSERT-Anweisungen ausführen, wenn Sie komplexe Daten haben, die in mehrere Tabellen übertragen werden.

Wenn Sie einen bestimmten $movieid Wert movies eingefügt haben, dann wissen Sie, was schätzen Sie an den Reihen der anderen Tabellen einfügen müssen, erfüllen referentielle Integrität (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 der ersten INSERT entweder durch den Aufruf $mysqli->insert_id(), oder mit der eingebauten Funktion LAST_INSERT_ID() erzeugt bekommen.

$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() Berichte des 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 gemeldete Wert ist während Ihrer Sitzungen stabil; es tut nicht ändern, wenn eine andere Clientsitzung gleichzeitig Einsätze durchführt.

+0

Vielen Dank !!!! – Jonathan

0

Sie müssen nicht mehr als eine Datenbankverbindung verwenden - das sollten Sie eigentlich gar nicht tun, da Sie Ihre Einfügungen nicht in einer atomaren Transaktion gruppieren können.

Was sollten Sie (Auszug) zu tun ist:

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

diese Weise können Sie immer einen konsistenten Datenbestand haben sollte.

+0

Ok, aber wie binde ich die Werte ??? Kannst du genauer sein?? Wissen Sie, wie Sie jeden Wert eines Arrays in verschiedenen Zeilen einfügen? Vielen Dank! – Jonathan

1
  1. Sie benötigen nur eine Datenbankverbindung
  2. Ja Sie müssen Schleifen
  3. in jeder Tabelle ein auto_increment Primärschlüsselfeld verwenden, und dann $stmt->insert_id() verwenden Sie den Wert nach jedem insert
  4. zu extrahieren Wenn Sie können , verwenden Sie InnoDB auf dem MySQL-Server, um Transaktionsunterstützung zu erhalten, und dann commit relevante Updates zusammen, um sicherzustellen, dass Ihre Datenbank konsistent ist, wenn Ihr Skript mitten in einer Aktualisierung ausfällt. Das häufigere MyISAM Datenbanktabellenformat unterstützt keine Transaktionen.
0

Sie werden wahrscheinlich nach Fremdschlüssel - Verwenden Sie eine ID aus der Basistabelle andere Beziehungen in anderer Tabelle zu identifizieren (Verwendung MovieID in anderer Tabelle zu identifizieren, welcher Film die anderen Werte usw. gehören)