Insérer des variables et des tableaux dans différentes tables de base de données en utilisant PHP et MySQLi

StackOverflow https://stackoverflow.com/questions/621893

Question

J'apprends PHP et MySQL et je crée un site Web de films à des fins d'apprentissage.

Je souhaite insérer des variables et des tableaux contenant des informations sur le film dans une base de données mais dans des tableaux différents.

Voici ce que j'ai en ce moment:

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

Ceci insère les variables dans la table des films.

Mais je dois aussi insérer (en même temps) les genres du film, les acteurs, les langues, etc., ils sont dans des tableaux et vont dans des tableaux différents (et peut-être aussi dans des rangées différentes). Par exemple, le tableau contenant les genres (Action, Crime, Drama) dans la table des genres, ainsi que les acteurs dans la table des acteurs, etc. ... J'utiliserai ensuite des tables plusieurs à plusieurs et un à plusieurs pour afficher les infos.

Quelqu'un peut-il m'expliquer comment faire cela ?? J'ai besoin de me connecter à la base de données plusieurs fois? J'ai besoin de boucles? Je suis vraiment nouveau sur PHP et MySQLi, alors essayez d’expliquer le plus possible.

Merci.

Était-ce utile?

La solution

INSERT ne prend en charge qu'une table à la fois; vous devrez donc exécuter plusieurs instructions INSERT si vous avez des données complexes qui entrent dans plusieurs tables.

Si vous avez inséré une valeur $ movieid spécifique dans movies , vous savez quelle valeur vous devez insérer dans les lignes des autres tables, afin de garantir l'intégrité référentielle. (pseudo-code suit, exemple non entièrement fonctionnel):

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

Si votre table movies utilise une clé primaire AUTO_INCREMENT , vous pouvez obtenir la valeur générée lors du premier INSERT en appelant $ mysqli- > insert_id () , ou en utilisant la fonction intégrée 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
}

Notez que LAST_INSERT_ID () rapporte la dernière valeur générée automatiquement au cours de votre session en cours. Par conséquent, si vous insérez dans une autre table utilisant une clé primaire automatique, la valeur change. Mais la valeur rapportée est stable pendant vos sessions. il ne change pas si une autre session client effectue des insertions simultanément.

Autres conseils

  1. Une seule connexion à la base de données est nécessaire
  2. Oui, vous avez besoin de boucles
  3. Utilisez un champ de clé primaire auto_increment dans chaque table, puis utilisez $ stmt- > insert_id () pour extraire la valeur après chaque insert
  4. Si vous le pouvez, utilisez InnoDB sur le serveur MySQL pour obtenir le support des transactions, puis commit en même temps que les mises à jour pertinentes, pour garantir la cohérence de votre base de données en cas de suppression du script. au milieu d'une mise à jour. Le format de table de base de données MyISAM plus commun ne prend pas en charge les transactions.

Vous n'avez pas besoin d'utiliser plus d'une connexion à une base de données. En fait, c'est ce que vous ne devriez pas faire du tout, car vous ne pouvez pas regrouper vos insertions dans une seule transaction atomique.

Ce que vous devez faire (résumé) est:

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

Ainsi, vous devriez toujours avoir un ensemble de données cohérent.

vous allez probablement chercher des clés étrangères - utilisez un ID de la table de base pour identifier les autres relations dans une autre table (utilisez movieid dans une autre table pour identifier le film auquel les autres valeurs appartiennent, etc.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top