Comunidad de diseño web y desarrollo en internet online

Recorrer archivo csv con while

Citar            
MensajeEscrito el 18 Jun 2013 07:32 pm
Buenas gente, soy nuevo en este foro y en php
Estoy trabajando en importar un csv, previa validacion e insercion en Mysql.
El problema es que si el archivo csv no tiene ningun error me inserta solo el ultimo registro.
Si tiene errores va todo bien, me muestra los mensajes de error y demas.
Cuando el archivo esta bien no puedo hacer que lo inserte todo completo.
Este es el codigo a ver si me pueden dar una mano. Desde ya muchas gracias

$error = 0;
$file = fopen($destino, 'r');
while($datos = fgetcsv ($file, 1000, ","))
{
$num = count($datos);
$apellido = $datos[0];
$apellido = str_replace("'"," ",$apellido);
$nombre = $datos[1];
$nombre = str_replace("'"," ",$nombre);
$cuil = $datos[2];
$basico = $datos[3];
$bruto = $datos[4];
$afili = $datos[5];

if(!(preg_match("/^([a-z ñáéíóú ÑÁÉÍÓÚ ]{2,50})$/i",$apellido))){
$error = 1;
}elseif(!(preg_match("/^([a-z ñáéíóú ÑÁÉÍÓÚ ]{2,50})$/i",$nombre))){
$error = 2;
}elseif(!cuitValido($cuil)){
$error = 3;
}elseif(!is_numeric($basico)){
$error = 4;
}elseif(!is_numeric($bruto)){
$error = 5;
}elseif(trim((string)$afili) !== "0" && trim((string)$afili) !== "1"){
$error = 6;
}
$hasError = checkErrors($error, $datos, $nombre, $apellido, $destino);
if($hasError != false){
echo $hasError;
break;
}
}

if($error == 0){
if(!mysql_num_rows(mysql_query("SELECT cuil FROM ddjj WHERE cuil='$cuil'"))){
mysql_query("INSERT INTO ddjj VALUES ('null','$apellido','$nombre','$cuil','$basico','$bruto','$afili')");
}else{
mysql_query("UPDATE ddjj SET apellido='$apellido', nombre='$nombre', cuil='$cuil', basico='$basico', bruto='$bruto', afiliado='$afili' WHERE cuil='$cuil'");
}
unlink($destino);
echo "<script>
alert('Importacion exitosa');
window.location.href='form.htm';
</script>";
}
function checkErrors($error, $datos, $nombre, $apellido, $destino){
$mensaje = '';
if($error == 1){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo $apellido e importe el archivo nuevamente";
}
elseif($error == 2){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo $nombre e importe el archivo nuevamente";
}
elseif($error == 3){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo {$datos[2]} e importe el archivo nuevamente";
}
elseif($error == 4){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo {$datos[3]} e importe el archivo nuevamente";
}
elseif($error == 5){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo {$datos[4]} e importe el archivo nuevamente";
}
elseif($error == 6){
$mensaje = "La importacion se detuvo por el siguiente error <br />
Corrija el siguiente campo {$datos[5]} e importe el archivo nuevamente";
}

if($mensaje != ''){
unlink($destino);
return $mensaje;
}
return false;
}

Por nico0601

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Jun 2013 08:53 pm
El insert del MySQl debería estar dentro del ciclo while, como lo tienes ahora, se ejecuta después de terminar el while, por eso solo te inserta el último.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 18 Jun 2013 08:56 pm

DriverOp escribió:

El insert del MySQl debería estar dentro del ciclo while, como lo tienes ahora, se ejecuta después de terminar el while, por eso solo te inserta el último.

Si, lo puse dentro del while y me inserta todo pero no me valida los campos ni me tira mensajes de error

Por nico0601

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Jun 2013 12:23 pm
¿Y hay errores?.

Me parece que tendrás que replantearte la lógica de la importación que estás haciendo...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 19 Jun 2013 12:27 pm
Si, hay errores. Lo pruebo con errores para comprobar los mensajes de validacion y si valida bien.
Como sugeris que lo haga?

Por nico0601

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Jun 2013 12:47 pm
Pues por empezar, estás asumiendo muchas cosas acerca del archivo, como que contiene algo en primer lugar.

Esa parte debería hacer:

Código PHP :

$file = fopen($destino, 'r'); 
while($datos = fgetcsv ($file, 1000, ",")) { 
   if (count($datos) > 0) {
      // procesar línea aquí
   }
} // while

Asumes que el archivo siempre contiene 6 campos, lo cual puede no ser así:

Código PHP :

$file = fopen($destino, 'r'); 
while($datos = fgetcsv ($file, 1000, ",")) { 
   if (count($datos) > 0) {
       $apellido = @$datos[0]; 
      $nombre = @$datos[1]; 
      $cuil = @$datos[2]; 
      $basico = @$datos[3]; 
      $bruto = @$datos[4]; 
      $afili = @$datos[5]; 
   }
} // while

Después no me queda claro si primero validas todo el archivo para luego importarlo, haciendo que la importación ocurra si y solo si todo en el archivo está bien; o bien vas descartando registros que tienen errores pero importas los que están bien a medida que lees el archivo.

El código que valida los campos deberías sacarlo en una función aparte.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.