إدراج المتغيرات والمصفوفات في جداول قاعدة بيانات مختلفة باستخدام 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();
}

يؤدي هذا إلى إدراج المتغيرات في جدول الأفلام.

لكني أحتاج أيضًا إلى إدراج (في نفس الوقت) أنواع الفيلم والممثلين واللغات وما إلى ذلك...هم في صفائف ويدخلون في جداول مختلفة (وربما أيضًا في صفوف مختلفة).على سبيل المثال المصفوفة التي تحتوي على الأنواع (أكشن، جريمة، دراما) في جدول الأنواع، والممثلين في جدول الممثلين وهكذا...سأستخدم بعد ذلك جداول متعدد إلى متعدد وواحد إلى متعدد لعرض المعلومات.

هل يمكن لأحد أن يشرح لي كيف أفعل هذا؟؟أحتاج إلى الاتصال بقاعدة البيانات عدة مرات؟؟أحتاج الحلقات؟أنا جديد حقًا في 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 () أو باستخدام وظيفة مدمج <لأ href = "http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert- المعرف "يختلط =" نوفولو noreferrer "> 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