إدراج بيانات المصفوفة باستخدام معرف إدراج MySQL وبيانات if

StackOverflow https://stackoverflow.com//questions/9654261

سؤال

حسنًا، بينما كنت أعمل على مهاراتي في 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);
    }
}

?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top