Вставьте переменные и массивы в разные таблицы базы данных, используя PHP и MySQLi - PullRequest
1 голос
/ 07 марта 2009

Я изучаю 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();
}

Вставляет переменные в таблицу фильмов.

Но мне также нужно вставить (одновременно) жанры фильма, актеров, языки и т. Д. ... они находятся в массивах и помещаются в разные таблицы (и, возможно, также в разные строки). Например, массив, содержащий жанры (Action, Crime, Drama) в таблице жанров, актеры в таблице актеров и т. Д. Затем я буду использовать таблицы «многие ко многим» и «один ко многим» для отобразить информацию.

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 08 марта 2009

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

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

0 голосов
/ 07 марта 2009

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

Что вы должны сделать (аннотация):

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...