إدراج بيانات المصفوفة باستخدام معرف إدراج MySQL وبيانات if
-
11-12-2019 - |
سؤال
حسنًا، بينما كنت أعمل على مهاراتي في PHP وMySQL، أصبحت جديدًا في إدراج البيانات في جداول متعددة دفعة واحدة.لقد قمت ببعض القراءة حول هذا الموضوع وأنا أقدر الأساسيات وأهمية البيانات المقيسة وما إلى ذلك، وبالتالي الحاجة إلى وضع المعلومات في جداول مختلفة.
لقد قمت بتجميع الكود أدناه معًا من بعض أعمالي السابقة بالإضافة إلى البرنامج التعليمي المقدم في http://www.desilva.biz/mysql/insertid.html .المشكلة التي أواجهها حاليًا هي أن البرنامج التعليمي الذي تعلمت منه الكود للإدخال في جداول مختلفة لم يكن يعتمد على مجموعة من البيانات، وبينما كنت قد بدأت العمل تقريبًا، لا يمكنني استخدام Fuelrecords_id الخاص بي لأنه حيث يجب علي استدعاؤه في ملفي الكود الحالي لم يتم تعريفه بعد.ولذلك، لكي يعمل الكود الخاص بي في الوقت الحالي، يجب علي فقط استخدام فاصلة للعمود.
أخيرًا، أود تحسين طريقة لجعل عبارات if تعمل بشكل صحيح مع بيانات المصفوفة، لذلك إذا تم إرسال 0 أو فارغ كجزء من المصفوفة، فلن يتم إدراج صف جديد بأصفار فقط في جداول قاعدة البيانات الخاصة بي لهذا الصف المعني من بيانات
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$con = mysql_connect("ip","username","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("jbsrint", $con);
//New Code
$row_data = array();
foreach($_POST['VEH_LIST_REG'] as $row=>$VEH_LIST_REG) {
$WEDATE=$wed_refor;
$VEH_LIST_REG=mysql_real_escape_string($VEH_LIST_REG);
$FR_DIE_L=mysql_real_escape_string($_POST['FR_DIE_L'][$row]);
$FR_DIE_C=mysql_real_escape_string($_POST['FR_DIE_C'][$row]);
$FR_PET_L=mysql_real_escape_string($_POST['FR_PET_L'][$row]);
$FR_PET_C=mysql_real_escape_string($_POST['FR_PET_C'][$row]);
$FR_OIL_L=mysql_real_escape_string($_POST['FR_OIL_L'][$row]);
$FR_OIL_C=mysql_real_escape_string($_POST['FR_OIL_C'][$row]);
$row_data[] = "(',', '$VEH_LIST_REG', '$WEDATE')";
$row_data1[] = "(',','$FR_DIE_L', '$FR_DIE_C', ',')";
$row_data2[] = "(',', '$FR_PET_L', '$FR_PET_C', ',')";
$row_data3[] = "(',', '$FR_OIL_L', '$FR_OIL_C', '$FR_OIL_C')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
#$result = mysql_query( $query);
# get fuelrecord id
$fuelrecords_ID = mysql_insert_id();
# if the user submitted diesel information
if( isset($FR_DIE_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_die(FRD_ID,FR_DIE_L,FR_DIE_C,fuelrecords_ID) VALUES ".implode(',', $row_data1);
$result = mysql_query( $sql);
}
# if the user submitted petrol information
if( isset($FR_PET_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_pet(FRP_ID,FR_PET_L,FR_PET_C,fuelrecords_ID) VALUES ".implode(',', $row_data2);
$result = mysql_query( $sql);
}
# if the user submitted oil information
if( isset($FR_OIL_L) )
{
# and insert the oil details
$sql = "INSERT INTO fuelrecords_oil(FRO_ID,FR_OIL_L,FR_OIL_C,fuelrecords_ID) VALUES ".implode(',', $row_data3);
$result = mysql_query( $sql);
}
if (mysql_query($query))
echo '<font color=\"FFFFFF\" size=\"3px\">Successful inserted</font>';
else
echo '<font color=\"FFFFFF\" size=\"3px\">Insert failed</font>';
}
?>
<?php
mysql_close($con)
?>
الجداول هي كما يلي:
fuelrecords
FR_ID (Auto increment)
VEH_LIST_REG
FR_WE
fuelrecords_die
FRD_ID (AUTO INCREMENT)
FR_DIE_L
FR_DIE_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_pet
FRP_ID (AUTO INCREMENT)
FR_PET_L
FR_PET_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_oil
FRO_ID (AUTO INCREMENT)
FR_OIL_L
FR_OIL_C
fuelrecords_ID (foreign ID from fuelrecords)
الغرض الأساسي هو تسجيل استخدام وقود السيارة وتكلفته.نظرًا لأنه لن تكون هناك دائمًا بيانات خاصة بالبنزين والديزل والنفط، فمن ثم يتم تسجيل الجداول المنفصلة، لذلك يتم تسجيل البيانات المطلوبة فقط.نأمل أن يوضح هذا
دائما كل المساعدة والمساعدة موضع تقدير كبير.
المحلول
إذا فهمت الكود الخاص بك بشكل صحيح لديك 4 جداول: fuelrecords
, fuelrecords_die
, fuelrecords_pet
, fuelrecords_oil
.
3 طاولات fuelrecords_die
, fuelrecords_pet
, fuelrecords_oil
لكل منها مفتاح خارجي fuelrecords_id
ل fuelrecords.fr_id
.
أنت الآن تريد إدراج صفوف متعددة في fuelrecords
وإذا تم توفير بيانات إضافية، فسيتم إضافة صفوف متعددة إلى الجداول الثلاثة الأخرى.أفترض fuelrecords.fr_id
العمود هو مفتاح أساسي متزايد تلقائيًا.
لإدراج صفوف متعددة في سجلات الوقود وجعل كل منها يحتوي على fr_id جديد، لا تقم بتمرير قيمة للعمود fr_id
.وهذا يعادل المرور NULL
كقيمة.سيقوم MySQL بعد ذلك تلقائيًا بإدراج أرقام متتالية فريدة لكل صف.
بعد ذلك يمكنك الاتصال mysql_insert_id()
للحصول على أولاً معرف المدرجة.استخدام mysql_affected_rows()
يمكنك الحصول على عدد الصفوف المدرجة.هذه معلومات كافية للحصول على المعرف لجميع الصفوف التي تم إدراجها أخيرًا.الأول هو mysql_insert_id()+0
والثاني هو mysql_insert_id()+1
, ،...، والأخير هو mysql_insert_id()+(mysql_affected_rows()-1)
.
في الخطوة التالية، تقوم بالتكرار على بيانات الإدخال الخاصة بك مرة أخرى وإدراج الملف fuelrecords_id
في كل من صفوف الجداول الثلاثة الأخرى، باستخدام الطريقة المذكورة أعلاه.لو $i
هو فهرس بيانات الإدخال الخاصة بك $_POST['FR_DIE_L'][$i]
(يبدأ من $i==0
)، ال fuelrecords_id
سوف يكون mysql_insert_id()+$i
.مسموح لك فقط بالتكرار mysql_insert_id()+mysql_affected_rows()-1
, ، ولكن من المحتمل أن يكون لديك نفس عدد بيانات POST على أي حال.
هناك طريقة أبسط بكثير ولكنها أقل كفاءة قليلاً وهي القيام بذلك فقط insert into fuelrecords
ثم قم بإدراج واحد في الجداول الثلاثة الأخرى لكل كائن بيانات POST واحد.لن تضطر إلى حساب fuelrecords_id
مثل mysql_insert_id()
سوف أعطيك المعرف الصحيح بعد كل إدراج.
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$row_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
$row_data[] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$first_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
$die_data = array();
$pet_data = array();
$oil_data = array();
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// calculate the right fuelrecords_id for this tuple
$fuelrecords_id = (int)($first_fuelrecords_id + $row);
// insert for fuelrecords_die
if (isset($_POST['FR_DIE_L'][$row]))
{
$die_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_DIE_L'][$row])."', '".esc($_POST['FR_DIE_C'][$row])."')";
}
// insert for fuelrecords_pet
if (isset($_POST['FR_PET_L'][$row]))
{
$pet_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_PET_L'][$row])."', '".esc($_POST['FR_PET_C'][$row])."')";
}
// insert for fuelrecords_oil
if (isset($_POST['FR_OIL_L'][$row]))
{
$oil_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_OIL_L'][$row])."', '".esc($_POST['FR_OIL_C'][$row])."')";
}
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>
إضافة صغيرة خارجة عن الموضوع:حاول عدم استخدام أسماء المتغيرات ذات الأحرف الكبيرة.عادةً ما يتم الاحتفاظ بمعرفات الأحرف الكبيرة للثوابت:
define("MY_SHORT_PI", 3.14159265);
define("MY_CONST", "foobar");
$my_variable = "bat";
echo "I am a constant ".MY_SHORT_PI;
echo "Me too ".MY_CONST;
echo "I am a variable ".$my_variable;
لن يكون لهذا أي تأثير على مترجم PHP.إنها مجرد تدوين شائع لجعل التعليمات البرمجية الخاصة بك قابلة للقراءة للآخرين.هناك العديد من أدلة الأسلوب هناك مثل واحد من الكمثرى.
المثال الثاني (انظر التعليقات)
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
// VALUES strings for fuelrecords
$row_data = array();
// temporary storage for just _L and _C values
$die_data_tmp = array();
$pet_data_tmp = array();
$oil_data_tmp = array();
// VALUES strings for the three tables
$die_data = array();
$pet_data = array();
$oil_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// check if diesel values are greater than 0
if (0 < (int)$_POST['FR_DIE_L'][$row] && 0 < (int)$_POST['FR_DIE_C'][$row])
$die_data_tmp[$row] = array($_POST['FR_DIE_L'][$row], $_POST['FR_DIE_C'][$row]);
// check if petrolium values are greater than 0
if (0 < (int)$_POST['FR_PET_L'][$row] && 0 < (int)$_POST['FR_PET_C'][$row])
$pet_data_tmp[$row] = array($_POST['FR_PET_L'][$row], $_POST['FR_PET_C'][$row]);
// check if oil values are greater than 0
if (0 < (int)$_POST['FR_OIL_L'][$row] && 0 < (int)$_POST['FR_OIL_C'][$row])
$oil_data_tmp[$row] = array($_POST['FR_OIL_L'][$row], $_POST['FR_OIL_C'][$row]);
// check if at least one of the 3 tables will get tuples. if not just continue
// with the next and don't assign this fuelrecord tuple to $row_data
if (! isset($die_data_tmp[$row]) && ! isset($pet_data_tmp[$row]) && ! isset($oil_data_tmp[$row]))
continue;
// all values are at least 1, so add this tuple to our inserts
$row_data[$row] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$current_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
foreach($row_data as $row => $VEH_LIST_REG) {
// insert for fuelrecords_die
if (isset($die_data_tmp[$row]))
{
$die_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($die_data_tmp[$row][0])."', '".esc($die_data_tmp[$row][1])."')";
}
// insert for fuelrecords_pet
if (isset($pet_data_tmp[$row]))
{
$pet_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($pet_data_tmp[$row][0])."', '".esc($pet_data_tmp[$row][1])."')";
}
// insert for fuelrecords_oil
if (isset($oil_data_tmp[$row]))
{
$oil_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($oil_data_tmp[$row][0])."', '".esc($oil_data_tmp[$row][1])."')";
}
// increment the fuelrecords_id for the next tuple.
++$current_fuelrecords_id;
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>