PHP ve mysqli kullanarak farklı veritabanı tabloları değişkenleri ve diziler takın

3 Cevap php

PHP ve MySQL öğrenme yaşıyorum ve ben öğrenme amaçlı bir sinema web sitesi oluşturma.

Ben bir veritabanına ancak farklı tablolarda değişkenleri ve film bilgisi içeren diziler eklemek istiyorum.

Bu şu anda ne var:

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

Bu filmler tabloya değişkenler eklemek.

Ama aynı zamanda dizilerde ve (farklı satırlara da belki de) farklı tablolar gitmek .. (aynı anda) vb film türleri, aktörler, dilleri, eklemek gerekir. Örneğin türler (Aksiyon, Suç, Dram) türler tabloda türler, ve böylece aktörler masa ve aktörleri içeren dizi ... Ben daha sonra-çok-çok ve bir-çok tabloları kullanacak bilgi ekranı.

Birisi bunu yapmak nasıl bana açıklayabilir misiniz? Ben veritabanı birden fazla kez bağlamak gerekiyor? Ben döngüler ihtiyacınız var? PHP ve MySQLi gerçekten yeni duyuyorum bu yüzden mümkün olduğunca çok anlatmaya çalışın lütfen.

Teşekkürler.

3 Cevap

INSERT, bir seferde sadece tek bir tablo destekler, böylece kesinlikle birden çok tablo gider karmaşık veri varsa birden INSERT ifadeleri yürütmek gerekir.

Belirli bir için $movieid değer takmışsanız movies sonra size tam olarak, yalancı aşağıdaki (tutarlılığını karşılamak için, diğer tabloların satır eklemek için gereken değer biliyorum Fonksiyonel Örnek):

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

Lütfen movies tablo, bir AUTO_INCREMENT birincil anahtarı kullanıyorsa, o zaman ilk INSERT birini çağırarak $mysqli->insert_id(), sırasında oluşturulan değerini alabilirsiniz veya yerleşik işlevini kullanarak 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
}

Not LAST_INSERT_ID() En son otomatik oluşturulan değer, geçerli oturum sırasında bildiriyor, böylece bir oto birincil anahtarı, değer değişiklikleri kullanan başka bir tabloya eklerseniz. Ancak rapor değer, oturumları sırasında sabittir; Başka bir istemci oturumu aynı anda ekler yapıyor eğer not değiştirmez.

Birden fazla veritabanı bağlantısı kullanmanız gerekmez - aslında sen hiç yapmaması gereken ne tek bir atomik işlem halinde grup, ekler yapamadım çünkü.

Yapmanız gerekenler (soyut) olan:

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

Bu şekilde her zaman tutarlı bir veri kümesi olmalıdır.

muhtemelen yabancı anahtarları sonra gidiyorsun - (diğer değerler vb ait ne film tanımlamak için diğer tablodaki kullanım MovieID) diğer tablodaki diğer ilişkilerini tanımlamak için temel tablodan bir kimliği kullanmak