Вставка данных массива с использованием MySQL вставьте идентификатор и операторы if - PullRequest
0 голосов
/ 11 марта 2012

Хорошо, пока я работаю над своими навыками PHP и MySQL, я новичок в том, чтобы вставлять данные в несколько таблиц за один раз. Я немного изучил эту тему, и я ценю основы и важность нормализованных данных и т. Д., А также необходимость помещать информацию в различные таблицы.

Я собрал приведенный ниже код вместе с некоторыми из моих предыдущих работ, а также из учебника, предложенного на http://www.desilva.biz/mysql/insertid.html. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что учебник, из которого я узнал код для ввода в различные таблицы, не был основан на массиве данных, и, хотя у меня это почти заработало, я не могу использовать свой fuelrecords_id, потому что там, где я должен вызывать его в моем Текущий код еще не определен. Поэтому, чтобы заставить мой код работать в настоящее время, я просто должен использовать запятую для столбца.

Наконец, я хотел бы усовершенствовать способ, чтобы операторы if работали правильно с данными массива, поэтому, если 0 или пустое поле представлены как часть массива, новая строка не вставляется с 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) 

В основном цель состоит в том, чтобы регистрировать потребление топлива и стоимость автомобиля. Поскольку не всегда будут данные для бензина, дизельного топлива и масла, отсюда и отдельные таблицы, поэтому регистрируются только необходимые данные. Надеюсь, что это проясняет

Всегда вся помощь и помощь очень ценятся.

1 Ответ

1 голос
/ 11 марта 2012

Если я правильно понимаю ваш код, у вас есть 4 таблицы: fuelrecords, fuelrecords_die, fuelrecords_pet, fuelrecords_oil.

3 таблицы fuelrecords_die, fuelrecords_pet, fuelrecords_oil имеют внешние ключи от fuelrecords_id до fuelrecords.fr_id.

Теперь вы хотите вставить несколько кортежей в fuelrecords и, если предоставляются дополнительные данные, несколько кортежей в другие 3 таблицы. Я предполагаю, что столбец 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 в каждый из кортежей для 3 других таблиц, используя вышеупомянутый метод. Если $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, а затем одну вставку в другие 3 таблицы для каждого отдельного объекта 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. Это просто обычное обозначение, чтобы сделать ваш код читаемым для других. Существует множество руководств по стилю, например, от PEAR .

Второй пример (см. Комментарии)

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

?>
...