Domanda

Sto imparando PHP e MySQL e sto creando un sito Web di film a scopo di apprendimento.

Voglio inserire variabili e array contenenti informazioni sui film in un database ma in tabelle diverse.

Questo è quello che ho adesso:

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();
}

Questo inserisce le variabili nella tabella dei filmati.

Ma devo anche inserire (allo stesso tempo) i generi del film, gli attori, le lingue, ecc ... sono in array e vanno in diversi tavoli (e forse anche in file diverse). Ad esempio l'array che contiene i generi (Action, Crime, Drama) nella tabella dei generi, e gli attori nella tabella degli attori e così via ... Userò quindi le tabelle da molti a molti e da uno a molti per visualizza le informazioni.

Qualcuno può spiegarmi come fare questo ?? Devo collegarmi al database più volte ?? Ho bisogno di anelli? Sono davvero nuovo a PHP e MySQLi, quindi per favore prova a spiegare il più possibile.

Grazie.

È stato utile?

Soluzione

INSERT supporta solo una tabella alla volta, quindi dovrai certamente eseguire più istruzioni INSERT se hai dati complessi che vanno in più tabelle.

Se hai inserito un valore $ movieid specifico in film , sai quale valore devi inserire nelle righe delle altre tabelle, per soddisfare l'integrità referenziale (segue lo pseudocodice, esempio non completamente funzionale):

$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)
}

Se la tua tabella film utilizza una chiave primaria AUTO_INCREMENT , puoi ottenere il valore generato durante il primo INSERT chiamando $ mysqli- > insert_id () oppure utilizzando la funzione integrata 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
}

Si noti che LAST_INSERT_ID () riporta il valore generato automaticamente più recente durante la sessione corrente, quindi se si inserisce in un'altra tabella che utilizza una chiave primaria automatica, il valore cambia. Ma il valore riportato è stabile durante le sessioni; non cambia se un'altra sessione client sta eseguendo inserimenti contemporaneamente.

Altri suggerimenti

  1. È necessaria solo una connessione al database
  2. Sì, hai bisogno di loop
  3. Utilizza un campo chiave primaria auto_increment in ogni tabella, quindi usa $ stmt- > insert_id () per estrarre il valore dopo ogni insert
  4. Se puoi, usa InnoDB sul server MySQL per ottenere il supporto delle transazioni, quindi commit aggiornamenti pertinenti insieme, per assicurarti che il tuo database sia coerente se lo script cade a metà strada attraverso un aggiornamento. Il formato più comune della tabella del database MyISAM non supporta le transazioni.

Non è necessario utilizzare più di una connessione al database, in effetti è ciò che non si dovrebbe fare, perché non è possibile raggruppare gli inserti in un'unica transazione atomica.

Quello che dovresti fare (astratto) è:

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

In questo modo dovresti sempre avere un set di dati coerente.

probabilmente stai cercando chiavi esterne: usa un ID dalla tabella di base per identificare altre relazioni in un'altra tabella (usa movieid in un'altra tabella per identificare a quale film appartengono gli altri valori, ecc.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top