Pergunta

Eu estou aprendendo PHP e MySQL e eu estou criando um site de filmes para fins de aprendizagem.

Eu quero inserir variáveis ??e matrizes contendo informações do filme em um banco de dados, mas em mesas diferentes.

Isto é o que eu tenho agora:

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

Esta inserção das variáveis ??na tabela de filmes.

Mas eu também preciso inserir (ao mesmo tempo) os gêneros de filme, os atores, línguas, etc ... eles estão em matrizes e entrar em tabelas diferentes (e talvez também em linhas diferentes). Por exemplo, a matriz contendo os gêneros (Ação, Crime, Drama) gêneros na tabela de gêneros, e os atores na tabela de atores e assim por diante ... Eu, então, usará muitos-para-muitos e um-para-muitos mesas para exibir a informação.

Alguém pode me explicar como fazer isso ?? Eu preciso para se conectar aos vários banco de dados de tempos ?? Eu preciso laços? Estou muito novo para PHP e MySQLi por isso, tentar explicar o máximo que puder.

Graças.

Foi útil?

Solução

suportes INSERT apenas uma tabela de cada vez, então você certamente vai ter que executar várias instruções INSERT se você tiver dados complexos que entra em várias tabelas.

Se tiver inserido um valor específico $movieid para movies então você sabe o valor que você precisa para inserir as linhas das outras mesas, para satisfazer a integridade referencial (pseudocódigo segue, não exemplo totalmente funcional):

$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 a tabela movies usa uma chave primária AUTO_INCREMENT, então você pode obter o valor gerado durante o primeiro INSERT quer chamando $ mysqli-> insert_id () , ou usando a função interna 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
}

Note que LAST_INSERT_ID() informa o valor gerado automaticamente recente mais durante a sua sessão atual, por isso, se você inserir para outra tabela que usa uma chave primária auto, o valor é alterado. Mas o valor relatado é estável durante as suas sessões; ele faz não mudança, se outra sessão de cliente está fazendo inserções ao mesmo tempo.

Outras dicas

  1. Você só precisa de uma conexão de banco de dados
  2. Sim, você tem laços necessidade
  3. Use um campo de chave primária auto_increment em cada mesa, e, em seguida, usar $stmt->insert_id() para extrair o valor após cada insert
  4. Se você puder, use InnoDB no servidor MySQL para obter suporte a transações, e depois atualizações commit relevantes em conjunto, para garantir que seu banco de dados é consistente se o script sai a meio de uma atualização. O formato mais comum de dados tabela MyISAM não suporta transações.

Você não precisa usar mais de uma conexão de banco de dados - na verdade, é isso que você não deve fazer em tudo, porque você não poderia agrupar as inserções em uma transação atômica.

O que você deve fazer (abstrato) é:

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

Desta forma, você deve ter sempre um conjunto de dados consistente.

você provavelmente está indo atrás chaves estrangeiras - (. Uso FilmeID em outra tabela para identificar qual filme os outros valores pertencem etc) o uso de um ID da tabela base para identificar outras relações em outra tabela

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top