2009-03-07 2 views
1

私はPHPとMySQLを学習しており、学習目的で映画のWebサイトを作成しています。PHPとMySQLiを使用して異なるデータベーステーブルに変数と配列を挿入

私は、映画情報を含む変数と配列をデータベースに挿入するが、別のテーブルに挿入したい。

これは私が今持っているものです。

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

この映画のテーブルに変数を挿入します。

しかし、映画、俳優、言語などのジャンルも挿入する必要があります。それらは配列に入っていて、別のテーブルに移動します(多分異なる行に)。たとえば、genresテーブルのジャンル(Action、Crime、Drama)のジャンルとactorsテーブルのアクタなどを含む配列...多対多と多対一のテーブルを使用して、情報を表示します。

誰かが私にこれを行う方法を説明できますか?私はデータベースに複数回接続する必要がありますか?私はループが必要ですか?私はPHPとMySQLiの新機能ですので、可能な限り説明してください。

ありがとうございました。

+0

ポロポワの代わりに目的を意味しないのですか? – Gumbo

+0

porpoisesの学習のために、海洋学のウェブサイトのいくつかの種類が欲しいかもしれません:) –

+0

:)私は目的を..私はスペルチェッカーを使用しました... – Jonathan

答えて

1

(他の値等に属しているものを、ムービーを識別するために、他のテーブルで使用MOVIEID)他のテーブル内の他の関係を識別するために、ベーステーブルから1つのIDを使用しますINSERTは一度に1つのテーブルしかサポートしないため、複数のテーブルに格納される複雑なデータがある場合は、確かに複数のINSERTステートメントを実行する必要があります。

あなたはmoviesに特定$movieid値を挿入した場合、あなたはあなたが参照整合性(擬似コードは、以下の、完全に機能していない例)を満たすために、他のテーブルの行に挿入する必要が価値を知っている:

$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主キーを使用する場合は、$mysqli->insert_id()を呼び出すことによって、または組み込み関数LAST_INSERT_ID()のいずれかを使用して最初のINSERT中に生成された値を得ることができます。

$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()は、現在のセッション中に、最新の自動生成された値を報告していることに注意してください。しかし報告された価値は、あなたのセッション中は安定しています。 ではない他のクライアントセッションが同時に挿入を行っている場合は変更されます。

+0

ありがとうございました!!!! – Jonathan

0

2つ以上のデータベース接続を使用する必要はありません。挿入を1つのアトミックなトランザクションにグループ化できないため、実際にはすべきではありません。

は、あなたが何をすべき(抽象的)である:

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

この方法であなたは常に一貫性のあるデータセットを持っている必要があります。

+0

しかし、私は値をバインドしますか?あなたはもっと具体的になりますか?異なる行に配列の各値を挿入する方法を知っていますか?ありがとう! – Jonathan

1
  1. は、あなただけの1つのデータベース接続を必要とする
  2. はい、あなたは必要が
  3. は各insert
  4. 後の値を抽出するために$stmt->insert_id()を使用し、各テーブルにauto_increment主キーフィールドを使用して、ループを行うことができます場合はMySQLサーバー上でInnoDBを使用してトランザクションのサポートを取得し、次にcommitの関連アップデートを一緒に使用して、スクリプトの途中で更新が中断した場合にデータベースが一貫性を保つようにします。より一般的なMyISAMデータベーステーブル形式はトランザクションをサポートしません。
0

あなたはおそらく外部キーの後に起こっている -

関連する問題