Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Usar correctamente de transacciones al importar registros a una Tabla

Estas en el tema de Usar correctamente de transacciones al importar registros a una Tabla en el foro de PHP en Foros del Web. Buen día a todos, Mi consulta es la siguiente: Tengo un proceso en la cual el usuario selecciona un archivo a importar (.CSV,.TXT Y .BACKUP). ...
  #1 (permalink)  
Antiguo 08/09/2015, 11:14
 
Fecha de Ingreso: marzo-2015
Mensajes: 183
Antigüedad: 9 años
Puntos: 8
Usar correctamente de transacciones al importar registros a una Tabla

Buen día a todos,
Mi consulta es la siguiente:
Tengo un proceso en la cual el usuario selecciona un archivo a importar (.CSV,.TXT Y .BACKUP). Cada fila usa un delimitador "|" para diferencias el valor de un campo de otro. Mi problema es que no sé si estoy usando bien las transacciones (BEGIN, ROLLBACK Y COMMIT). Ya que si bien no se registran las operaciones que están mal,
el auto_increment de mi tabla sigue aumentando por sí solo, como si en realidad registrase algo, pero no es así
Mi código es extenso, pero igual dejo una gran parte de ello.
Código PHP:
Ver original
  1. $dblink=fConectar("estadisticas");
  2. $sEstructuraDet="INSERT INTO movement_of_vessel_det(cod_movement_of_vessel,nitem,qtty,
  3. cod_cargo,cod_port_orig,cod_port_dest,cod_shipper,cod_receiver,cod_tracing)VALUES";
  4. $aInsertCamposDet=array();
  5. while(!feof($file)){
  6.     $linea=fgets($file);
  7.     if($nFilaCont>=$nFilaDefaultIni){//INICIO DE IMPORTACION
  8.         $aDatos=split("[".$cmbDelimitador_vImportAJAX."]",$linea);
  9.         //ID|VESSEL|GRT|OPERATION|COUNTRY (ORIG)|PORT (ORIG)|COUNTRY (DEST)|PORT    
  10.         //(DEST)|ARRIVED|BERTHED|COMPLETED|AGENT|OWNER|CHARTERER|CARGO_TYPE|CARGO|QTTY|SHIPPER|RECEIVER|REMARKS
  11.         if(count($aDatos)==20){//and strlen($aDatos[0])>0
  12.             $nIDOperacion=trim($aDatos[0]);
  13.             $sVessel=trim($aDatos[1]);$fGRT=(strlen($aDatos[2])>0?str_replace(",","",$aDatos[2]):0);$sOperation=trim($aDatos[3]);
  14.             $sPortOrig=trim($aDatos[5]);$sPortDest=trim($aDatos[7]);
  15.             $sArrived=trim($aDatos[8]);$sBerthed=trim($aDatos[9]);$sCompleted=trim($aDatos[10]);
  16.             $sAgent=trim($aDatos[11]);$sOwner=trim($aDatos[12]);$sCharterer=trim($aDatos[13]);
  17.             $sCargo=trim($aDatos[15]);$fQtty=(strlen($aDatos[16])>0?str_replace(",","",$aDatos[16]):0);
  18.             $sShipper=trim($aDatos[17]);$sReceiver=trim($aDatos[18]);$sRemarks=trim($aDatos[19]);
  19.        
  20.             if(!is_numeric(array_search($nIDOperacion,$aIDOperacion))){//NUEVAS OPERACIONES
  21.                 if(count($aInsertCamposDet)==0)
  22.                     mysql_query("BEGIN",$dblink);
  23.                 else if(count($aInsertCamposDet)>0){
  24.                     $sQueryInsertDET=$sEstructuraDet.join(",",$aInsertCamposDet);
  25.                     @$respInsertDET=mysql_query($sQueryInsertDET,$dblink);
  26.                     if(!$respInsertDET){
  27.                         mysql_query("ROLLBACK",$dblink);   
  28.                     }else{
  29.                         mysql_query("COMMIT",$dblink);
  30.                         $nTotRegValid++;   
  31.                     }
  32.                 }
  33.                 $aIDOperacion[]=$nIDOperacion;$nNumItem=1;$aInsertCamposDet=array();
  34.                 $sQueryIDOpetation="SHOW TABLE STATUS LIKE 'movement_of_vessel'";
  35.                 $aIDOperation=faResultQuery_vImport($sQueryIDOpetation,$dblink);
  36.                 $cod_movement_of_vessel=($aIDOperation['error']==true?0:$aIDOperation['Auto_increment']);
  37.                 $aIDTbl[$nIDOperacion]=$cod_movement_of_vessel;//GUARDA TEMPORALMENTE EL ID AUTO EN UN ARRAY
  38.                
  39.                 $cod_vessel="";
  40.                 if($sVessel!="-" and strlen($sVessel)>0){
  41.                     $sQueryVessel="SELECT cod_vessel,dsc_vessel FROM vessel WHERE TRIM(dsc_vessel)='".trim($sVessel)."'";
  42.                     $aVessel=faResultQuery_vImport($sQueryVessel,$dblink);
  43.                     $cod_vessel=($aVessel['error']==true?0:$aVessel['cod_vessel']);//echo $sVessel."->".$cod_vessel."\n";
  44.                
  45.                 }
  46.            
  47.                 $cod_operation="";
  48.                 if($sOperation!="-" and strlen($sOperation)>0){
  49.                     $sQueryOperation="SELECT cod_operation,dsc_operation FROM operation WHERE TRIM(dsc_operation)='".trim($sOperation)."'";
  50.                     $aOperation=faResultQuery_vImport($sQueryOperation,$dblink);
  51.                     $cod_operation=($aOperation['error']==true?0:$aOperation['cod_operation']);
  52.                    
  53.                 }
  54.                
  55.                 $xsArrived=fsChangeFormartDate($sArrived,"d/m/y","y-m-d");
  56.                 //strlen($sArrived)>0 and
  57.                 if (!preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$xsArrived)){
  58.                     $aErr[$nContErr]['id']=$nIDOperacion;
  59.                     $aErr[$nContErr]['fila']=$nFilaCont;
  60.                     $aErr[$nContErr]['columna']=9;
  61.                     $aErr[$nContErr]['descripcion']="(ARRIVED) El dato ingresado no es de tipo fecha";
  62.                     $nContErr++;
  63.                 }
  64.                
  65.                 $cod_agent="";
  66.                 if($sAgent!="-" and strlen($sAgent)>0){
  67.                     $sQueryAgent="SELECT cod_agent,dsc_agent FROM agent WHERE TRIM(dsc_agent)='".trim($sAgent)."'";
  68.                     $aAgent=faResultQuery_vImport($sQueryAgent,$dblink);
  69.                     $cod_agent=($aAgent['error']==true?0:$aAgent['cod_agent']);
  70.                 }
  71.                
  72.                 $cod_owner="";
  73.                 if($sOwner!="-" and strlen($sOwner)>0){
  74.                     $sQueryOwner="SELECT cod_owner,dsc_owner FROM owner WHERE TRIM(dsc_owner)='".trim($sOwner)."'";
  75.                     $aOwner=faResultQuery_vImport($sQueryOwner,$dblink);
  76.                     $cod_owner=($aOwner['error']==true?0:$aOwner['cod_owner']);
  77.                    
  78.                 }
  79.                
  80.                 $cod_charterer="";
  81.                 if($sCharterer!="-" and strlen($sCharterer)>0){
  82.                     $sQueryCharterer="SELECT cod_charterer,dsc_charterer FROM charterer WHERE TRIM(dsc_charterer)='".trim($sCharterer)."'";
  83.                     $aCharterer=faResultQuery_vImport($sQueryCharterer,$dblink);
  84.                     $cod_charterer=($aCharterer['error']==true?0:$aCharterer['cod_charterer']);
  85.                 }
  86.                
  87.                 $cod_movement_of_vessel=(isset($aIDTbl[$nIDOperacion])?$aIDTbl[$nIDOperacion]:0);
  88.                
  89.                 $sQueryInsertCAB="INSERT INTO movement_of_vessel(cod_movement_of_vessel,cod_vessel,cod_operation,arrived,
  90.                 berthed,completed,cod_agent,cod_owner,cod_charterer,remarks,record_date,record_cod_user,
  91.                 active)VALUES("
  92.                 .(strlen($cod_movement_of_vessel)>0?$cod_movement_of_vessel:"NULL").","
  93.                 .(strlen($cod_vessel)>0?$cod_vessel:$cod_vessel).","
  94.                 .(strlen($cod_operation)>0?$cod_operation:"NULL").",";
  95.                
  96.                 if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$xsArrived))
  97.                     $sQueryInsertCAB.=(strlen($sArrived)>0?"'".$xsArrived."'":"'".$xsArrived."'").",";
  98.                    
  99.                 if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$xsBerthed))
  100.                     $sQueryInsertCAB.=(strlen($sBerthed)>0?"'".$xsBerthed."'":"NULL").",";
  101.                 else if($sBerthed=="-" or $sBerthed=="")   
  102.                     $sQueryInsertCAB.="0000-00-00,";
  103.                    
  104.                 if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$xsCompleted))
  105.                     $sQueryInsertCAB.=(strlen($sCompleted)>0?"'".$xsCompleted."'":"NULL").",";
  106.                 else if($sCompleted=="-" or $sCompleted=="")   
  107.                     $sQueryInsertCAB.="0000-00-00,";
  108.                    
  109.                 $sQueryInsertCAB.=(strlen($cod_agent)>0?$cod_agent:"NULL").","
  110.                 .(strlen($cod_owner)>0?$cod_owner:"NULL").","
  111.                 .(strlen($cod_charterer)>0?$cod_charterer:"NULL").","
  112.                 .(strlen($sRemarks)>0?"'".$sRemarks."'":"NULL").","
  113.                 ."CURRENT_DATE(),".$arrayDatosUser[0].",1)";
  114.                
  115.                 @$respInsertCAB=mysql_query($sQueryInsertCAB,$dblink);
  116.                 if(!$respInsertCAB ){
  117.                     //echo $sQueryInsertCAB."\n".mysql_error($dblink); 
  118.                     mysql_query("ROLLBACK",$dblink);
  119.                     if(strlen(strpos(strtoupper(mysql_error($dblink)),"DUPLICATE ENTRY"))>0){
  120.                             $aErr[$nContErr]['id']=$nIDOperacion;
  121.                             $aErr[$nContErr]['fila']=$nFilaCont;
  122.                             $aErr[$nContErr]['columna']="ALL";
  123.                             $aErr[$nContErr]['descripcion']="Los datos de importación ya han sido registrados.<br/>
  124.                             Ref: Los campos VESSEL, ARRIVED Y OPERATION no pueden duplicarse.";
  125.                             $nContErr++;
  126.                     }
  127.                 }
  128.                
  129.             }//FIN CAB OPERACIONES
  130.             $cod_cargo="";
  131.             if($sCargo!="-" and strlen($sCargo)>0){
  132.                 $sQueryCargo="SELECT cod_cargo,dsc_cargo FROM cargo WHERE TRIM(dsc_cargo)='".trim($sCargo)."'";
  133.                 $aCargo=faResultQuery_vImport($sQueryCargo,$dblink);
  134.                 $cod_cargo=($aCargo['error']==true?0:$aCargo['cod_cargo']);
  135.  
  136.             }
  137.                
  138.             $cod_port_orig="";
  139.             if($sPortOrig!="-" and strlen($sPortOrig)>0){
  140.                 $sQueryPort="SELECT cod_port,dsc_port FROM port WHERE TRIM(dsc_port)='".trim($sPortOrig)."'";
  141.                 $aPortOrig=faResultQuery_vImport($sQueryPort,$dblink);
  142.                 $cod_port_orig=($aPortOrig['error']==true?0:$aPortOrig['cod_port']);
  143.  
  144.             }
  145.             $cod_port_dest="";
  146.             if($sPortDest!="-" and strlen($sPortDest)>0){
  147.                 $sQueryPort="SELECT cod_port,dsc_port FROM port WHERE TRIM(dsc_port)='".trim($sPortDest)."'";
  148.                 $aPortDest=faResultQuery_vImport($sQueryPort,$dblink);
  149.                 $cod_port_dest=($aPortDest['error']==true?0:$aPortDest['cod_port']);
  150.             }
  151.             $cod_shipper="";
  152.             if($sShipper!="-" and strlen($sShipper)>0){
  153.                 $sQueryShipper="SELECT cod_shipper,dsc_shipper FROM shipper WHERE TRIM(dsc_shipper)='".trim($sShipper)."'";
  154.                 $aShipper=faResultQuery_vImport($sQueryShipper,$dblink);
  155.                 $cod_shipper=($aShipper['error']==true?0:$aShipper['cod_shipper']);
  156.             }
  157.             $cod_receiver="";
  158.             if($sReceiver!="-" and strlen($sReceiver)>0){
  159.                 $sQueryReceiver="SELECT cod_receiver,dsc_receiver FROM receiver WHERE TRIM(dsc_receiver)='".trim($sReceiver)."'";
  160.                 $aReceiver=faResultQuery_vImport($sQueryReceiver,$dblink);
  161.                 $cod_receiver=($aReceiver['error']==true?0:$aReceiver['cod_receiver']);
  162.             }
  163.             $cod_movement_of_vessel=(isset($aIDTbl[$nIDOperacion])?$aIDTbl[$nIDOperacion]:0);
  164.             //INSERT DETALLE
  165.             $aInsertCamposDet[]="(
  166.             ".(strlen($cod_movement_of_vessel)>0?$cod_movement_of_vessel:"NULL").","
  167.             ."".$nNumItem.",".$fQtty.","
  168.             .(strlen($cod_cargo)>0?$cod_cargo:"NULL").","
  169.             .(strlen($cod_port_orig)>0?$cod_port_orig:"NULL").","
  170.             .(strlen($cod_port_dest)>0?$cod_port_dest:"NULL").","
  171.             .(strlen($cod_shipper)>0?$cod_shipper:"NULL").","
  172.             .(strlen($cod_receiver)>0?$cod_receiver:"NULL").",NULL)";  
  173.             $nNumItem++;
  174.         }else{
  175.             $aErr[$nContErr]['id']=$nIDOperacion;
  176.             $aErr[$nContErr]['fila']=$nFilaCont;
  177.             $aErr[$nContErr]['columna']="ALL";
  178.             $aErr[$nContErr]['descripcion']="La fila debe de contar con 20 Columnas para la importación<BR>REF:Asegúrese que en los
  179.             valores de las celdas no usen como primer carácter \" o '";
  180.             $nContErr++;   
  181.         }
  182.     }
  183.     $nFilaCont++;
  184. }
  185. if(count($aInsertCamposDet)>0){
  186.     $sQueryInsertDET=$sEstructuraDet.join(",",$aInsertCamposDet);
  187.     @$respInsertDET=mysql_query($sQueryInsertDET,$dblink);
  188.     if(!$respInsertDET){
  189.         mysql_query("ROLLBACK",$dblink);   
  190.     }else{
  191.         mysql_query("COMMIT",$dblink);
  192.         $nTotRegValid++;
  193.     }
  194. }      
  195. mysql_close($dblink);
De antemano gracias por darle una chequeadita.
IMPORTANTE: La importación se realiza en 2 tablas movement_of_vessel (CABECERA) y movement_of_vessel_det (DETALLE),si un registro del detalle esta mal debe de cancelarse sólo esa operación no de las demás.Con esta variable diferencio una operación de otra $nIDOperacion=trim($aDatos[0]);
Saludos

Última edición por oggy_15_3; 08/09/2015 a las 11:35
  #2 (permalink)  
Antiguo 08/09/2015, 15:18
 
Fecha de Ingreso: marzo-2015
Mensajes: 183
Antigüedad: 9 años
Puntos: 8
Respuesta: Usar correctamente de transacciones al importar registros a una Tabla

Al parecer este tema ya lo habían posteado, http://www.forosdelweb.com/f86/funci...llback-953520/
así que me quedo con esa respuesta.
Es decir, el auto_increment trabaja de manera independiente y secuencial, a esta no le importa como trabajan las transacciones.

Etiquetas: correctamente, fecha, mysql, registros, select, sql, tabla, transacciones, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:15.