l oop увеличивается каждый раз через выбор / вставку - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть довольно простой теоретический сценарий, в котором я пытаюсь выбрать реляционные данные в базе данных DB2 для разработки и вставить в отдельный производственный сервер db2 (создание новых идентификаторов и связей на производственной стороне в процесс).

Итак, в этом сценарии I:

  • Выберите из таблицы ITEM dev
  • Сохраните исходный первичный ключ
  • вставьте данные в таблицу Dev ITEM
  • Получить идентификатор недавно вставленного
  • выбрать SUBITEM из dev с исходным идентификатором
  • для каждого подпункта, в который я вставляю данные в продукт Таблица SUBITEM с недавно созданным ИДЕНТИФИКАТОРОМ в качестве отношения

Проблема заключается в том, что скрипт на самом деле успешно выполняется, но при этом он просто увеличивается на единицу, поэтому, даже если он правильно вставляет каждый пункт, он завершается просто получить КАЖДЫЙ подэлемент в базе данных и сохранить исходный (1-й ряд) ID. Для экземпляра:

Мой первый выбор ITEM возвращает ID 1204. Когда я запускаю несколько элементов, в моей таблице ITEM отображаются записи с идентификаторами: 1204, 1205, 1206 и 1207

Это верно, но когда я смотрю на таблицу subITEMS, у меня есть 10 записей subITEM, все с itemID 1204. Таким образом, он получил правильный подпункт для каждой итерации ITEMS, но только когда-либо вставил самую первую переменную newID.

Что я сделал не так здесь:

if($DB2connDEV && $DB2connPROD){

    $getDevItems = "
                SELECT 
                    itemt_ID,
                    DESCRIPTION
                FROM itemt 
            ";

    $stmt = odbc_exec($DB2connDEV, $getDevItems);

    while($gettingDevItems = odbc_fetch_array($stmt)){
        $rows[] = $gettingDevItems;
    }

    foreach($rows as $row){
        $prepInsert = odbc_prepare($DB2connPROD, "INSERT INTO itemt (itemt_id, description) VALUES(?,?)");

        $originalID = $row['itemt_ID'];
        $description = $row['DESCRIPTION'];

        $insertTable = odbc_execute($prepInsert, array($description));

        //Get newly created ID       
        $getIdentity = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";

        $stmt = odbc_exec($DB2connPROD, $getIdentity);
        $row = odbc_fetch_array($stmt);
        $newID = $row['LASTID'];

        if($newID) {
            echo "Last Insert ID is : " . $newID . "\n";
        } else {
            echo "No Last insert ID.\n";
        }

        //Get subItems and insert 
        $getSubItems = "SELECT NAME, DESCRIPTION
                FROM SUBITEMT
                WHERE itemt_ID = $originalID";

        $selectSubItems = odbc_exec($DB2connDEV, $getSubItems);

        while($gettingSubItems = odbc_fetch_array($selectSubItems)){
            $subItemRows[] = $gettingSubItems;
        }

        foreach($subItemRows as $subItemRow){
            $subItemPrepInsert = odbc_prepare($DB2connPROD, "INSERT INTO subitemt (itemt_id, NAME, DESCRIPTION) VALUES(?,?,?)");
            $subItemName = $subItemRow['NAME'];
            $subItemDescription = $subItemRow['DESCRIPTION'];

            $subtaskInsertExec = odbc_execute($subtaskPrepInsert, array($newID, $subItemName, $subItemDescription));

            //get newly created ID for subitem
            $getsubtaskID = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";

            $subtaskIDSTMT = odbc_exec($DB2connPROD, $getsubtaskID);

            $newsubItemRow = odbc_fetch_array($subtaskIDSTMT);
            $newSubItemID = $newsubItemRow['LASTID'];

            if($newSubItemID) {
                echo "Last Insert subItem ID is : " . $newSubItemID . "\n";
            } else {
                echo "No Last insert subItem ID.\n";
            }
        }
    }

    odbc_close($DB2connPROD);
    odbc_close($DB2connDEV);
}

1 Ответ

1 голос
/ 19 февраля 2020

Проблема в том, что вы не очищаете $subItemRows между итерациями основного l oop. Поэтому каждый раз, когда вы добавляете новые подэлементы к подэлементам из предыдущих итераций.

Поставьте

$subItemRows = array();

перед l oop:

while($gettingSubItems = odbc_fetch_array($selectSubItems)){
    $subItemRows[] = $gettingSubItems;
}
...