循环通过选择/插入每次都在增加

问题描述 投票:0回答:1

我有一个理论上很简单的脚本,我试图在开发DB2数据库上选择关系数据,然后插入到单独的生产db2服务器中(在此过程中,在生产端创建新的ID和关系)。

因此,在此脚本中,我:

  • 从dev ITEM表中选择
  • 存储原始主键
  • 将数据插入dev ITEM表中
  • 获取新插入的ID
  • 从具有原始ID的开发人员中选择SUBITEM
  • 对于每个子项目,我都将数据插入到具有新创建的ITEM ID作为关系的产品SUBITEM表中>
  • 问题是该脚本实际上已成功运行,但是随着它的运行,它只是增加了一个,因此即使它正确地插入了每个ITEM,它最终也只是在数据库中获得了每个子项并存储了原始(第一行)的ID。实例:

我的第一个ITEM选择返回ID1204。当我让它运行多个项目时,我的ITEM表显示了ID为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);
}

我有一个理论上很简单的脚本,在这里我试图在开发DB2数据库上选择关系数据,然后插入到单独的生产db2服务器中(创建新的ID ...

php odbc
1个回答
1
投票

问题是您没有在主循环的迭代之间清除$subItemRows。因此,每次您将新的子项目添加到先前迭代的子项目中。

© www.soinside.com 2019 - 2024. All rights reserved.