Вставка переменных и массивов в разные таблицы базы данных с использованием PHP и MySQLi

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

Вопрос

Я изучаю PHP и MySQL, и я создаю веб-сайт фильмов в учебных целях.

Я хочу вставить переменные и массивы, содержащие информацию о фильме, в базу данных, но в разные таблицы.

Это то, что у меня есть прямо сейчас:

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

Это вставит переменные в таблицу movies.

Но мне также нужно вставить (в то же время) жанры фильма, актеров, языки и т.д...они находятся в массивах и переходят в разные таблицы (и, возможно, также в разные строки).Например, массив, содержащий жанры (Боевик, Криминал, Драма) в таблице genres, а также действующих лиц в таблице actors и так далее...Затем я буду использовать таблицы "многие ко многим" и "один ко многим" для отображения информации.

Кто-нибудь может объяснить мне, как это сделать??Мне нужно подключиться к базе данных несколько раз??Мне нужны петли?Я действительно новичок в PHP и MySQLi, поэтому, пожалуйста, постарайтесь объяснить как можно больше.

Спасибо.

Это было полезно?

Решение

INSERT поддерживает только одну таблицу одновременно, поэтому вам, безусловно, придется выполнить несколько INSERT инструкции, если у вас есть сложные данные, которые входят в несколько таблиц.

Если вы вставили определенный $movieid ценность для movies тогда вы знаете, какое значение вам нужно вставить в строки других таблиц, чтобы обеспечить ссылочную целостность (далее следует псевдокод, не полностью функциональный пример):

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

Если ваш movies таблица использует AUTO_INCREMENT первичный ключ, то вы можете получить значение, сгенерированное во время первого INSERT либо позвонив $mysqli->insert_id(), или с помощью встроенной функции 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
}

Обратите внимание , что LAST_INSERT_ID() сообщает о самом последнем автоматически сгенерированном значении во время вашего текущего сеанса, поэтому при вставке в другую таблицу, использующую автоматический первичный ключ, значение изменяется.Но сообщаемое значение остается стабильным во время ваших сеансов;это делает не измените, выполняет ли другой клиентский сеанс вставки одновременно.

Другие советы

  1. Вам нужно только одно подключение к базе данных
  2. Да, вам действительно нужны циклы
  3. Используйте auto_increment поле первичного ключа в каждой таблице, а затем используйте $stmt->insert_id() чтобы извлечь значение после каждого insert
  4. Если вы можете, используйте InnoDB на сервере MySQL, чтобы получить поддержку транзакций, а затем commit соответствующие обновления вместе, чтобы гарантировать согласованность вашей базы данных, если ваш скрипт выйдет из строя на полпути обновления.Чем более распространенный MyISAM формат таблицы базы данных не поддерживает транзакции.

Вам не нужно использовать более одного подключения к базе данных - на самом деле это то, чего вам вообще не следует делать, потому что вы не смогли бы сгруппировать свои вставки в одну атомарную транзакцию.

То, что вы должны сделать (абстрактно), это:

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

Таким образом, у вас всегда должен быть согласованный набор данных.

вероятно, вы ищете внешние ключи - используйте один идентификатор из базовой таблицы, чтобы идентифицировать другие отношения в другой таблице (используйте movieid в другой таблице, чтобы определить, к какому фильму принадлежат другие значения и т.д.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top