Foros del Web » Programando para Internet » PHP »

Problemas para recorrer archivo validando campos.

Estas en el tema de Problemas para recorrer archivo validando campos. en el foro de PHP en Foros del Web. Buenas gente, estoy trabajando en un form donde se importa un archivo csv pero tengo que validar los campos importados para evitar basura en la ...
  #1 (permalink)  
Antiguo 14/05/2013, 12:13
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Problemas para recorrer archivo validando campos.

Buenas gente, estoy trabajando en un form donde se importa un archivo csv pero tengo que validar los campos importados para evitar basura en la DB.
Hasta ahora lo que hago es subir el archivo al servidor, separar los campos y validarlos. Hasta ahi funciona bien, el tema es que el archivo tiene un solo registro.
Código csv:
Ver original
  1. martinez,manuel,20231139290,2345.45,4000.21,1
Pero nose como hacer para que cuando el archivo tenga mas registros vaya leyendo cada linea y validando para luego insertarlo en la DB. Pueden ser archivos de cientos de registros..
Código csv:
Ver original
  1. martinez,manuel,20231139290,2345.45,4000.21,1
  2. martinez,manuel,20231139290,2345.45,4000.21,1
  3. martinez,manuel,20231139290,2345.45,4000.21,1
  4. martinez,manuel,20231139290,2345.45,4000.21,1
  5. martinez,manuel,20231139290,2345.45,4000.21,1
  6. martinez,manuel,20231139290,2345.45,4000.21,1
Aca va el codigo que estoy armando a los golpes! ja
Código PHP:
$status "";
if (
$_POST["action"] == "upload") {
   
// obtenemos los datos del archivo
   
$tamano $_FILES['archivo']['size'];
   
$tipo $_FILES['archivo']['type'];
   
$archivo $_FILES["archivo"]['name'];
   
//le antepongo 6 caracteres aleatorios para que no se sobreescriba con otro archivo de igual nombre
   
$prefijo substr(md5(uniqid(rand())),0,6);
     
             if (
$archivo != "") {
             
// guardamos el archivo a la carpeta files
                
$destino =  "files/".$prefijo."_".$archivo;
                  if (
copy($_FILES['archivo']['tmp_name'],$destino)) {
                     
$status "Archivo subido: <b>".$archivo."</b>";
                  }else
                  {
                     
$status "Error al subir el archivo";
                  }
             } 
                        else{
                            
$status "Error al subir archivo";
                            }
}


$file file_get_contents($destino);
$separador explode(",",$file);
$apellido $separador[0];
$nombre $separador[1];
$cuil $separador[2];
$basico $separador[3];
$bruto $separador[4];
$afili $separador[5];


    if(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$apellido))){
        echo 
"<script>
                    alert('El campo Apellido y Nombres debe ser alfabetico');
                    window.location.href='form.htm';
                </script>"
;
                
unlink($destino);//borro el archivo si tiene algun error
        
}
        elseif(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$nombre))){
            echo 
"<script>
                    alert('El campo Apellido y Nombres debe ser alfabetico');
                    window.location.href='form.htm';
                </script>"
;
                
unlink($destino);
        }
            elseif(! 
cuitValido($cuil)){
                echo
"<script>
                        alert ('Verifique la CUIL ingresada');
                        window.location.href='form.htm';
                    </script>"
;
                    
unlink($destino); 
                }
                elseif(!
is_numeric($basico)){
                    echo
"<script>
                            alert ('El campo Sueldo Basico debe ser numerico');
                            window.location.href='form.htm';
                        </script>"
;
                        
unlink($destino); 
                    }
                    elseif(!
is_numeric($bruto)){
                        echo
"<script>
                            alert ('El campo Sueldo Bruto debe ser numerico');
                            window.location.href='form.htm';
                            </script>"
;
                            
unlink($destino); 
                        }
                        elseif(
trim((string)$afili) !== "0" && trim((string)$afili) !== "1"){  
                            echo
"<script>
                                alert ('Debe indicar 1 para afiliados y 0 para NO afiliados');
                                window.location.href='form.htm';
                                </script>"
;
                                
unlink($destino);
                            }
                        else
                        {
                            echo 
"<script>
                                    alert('Archivo importado con exito');
                                    window.location.href='form.htm';
                                </script>"
;
                        } 
__________________
Nico...
  #2 (permalink)  
Antiguo 14/05/2013, 12:19
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Para procesar el CSV deberías usar las funciones que tiene PHP para ello, consulta el manual, no tienes que hacer trucos cuando existen las herramientas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 14/05/2013, 12:29
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Y si las supiese no estaria preguntando....
__________________
Nico...
  #4 (permalink)  
Antiguo 14/05/2013, 12:33
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

¿Conoces el manual?

http://php.net/manual/en/function.fgetcsv.php
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 14/05/2013, 12:40
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Asi estoy intentando recorrer el archivo
Código PHP:
$file fopen($destino"r");
while (
$datos fgetcsv ($file1000",")) {
echo 
$datos[0].$datos[1].$datos[2].$datos[3].$datos[4].$datos[5];
echo 
"<br />"
aca solo (estoy probando) imprimo todas las lineas del archivo, el problema lo tengo cuando intento validar todas las lineas, solo me valida la primer linea
__________________
Nico...
  #6 (permalink)  
Antiguo 14/05/2013, 12:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Bueno, esperas a que adivinemos cómo es tu código real para decirte lo que haces mal, ¿cierto?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 14/05/2013, 12:49
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Aca va el codigo
Código PHP:
$file fopen($destino"r");
while (
$datos fgetcsv ($file1000",")) {

$apellido $datos[0];
$nombre $datos[1];
$cuil $datos[2];
$basico $datos[3];
$bruto $datos[4];
$afili $datos[5];


    if(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$apellido))){
        echo 
"<script>
                    alert('El campo Apellido y Nombres debe ser alfabetico');
                    window.location.href='form.htm';
                </script>"
;
                
unlink($destino);
        }
        elseif(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$nombre))){
            echo 
"<script>
                    alert('El campo Apellido y Nombres debe ser alfabetico');
                    window.location.href='form.htm';
                </script>"
;
                
unlink($destino);
        }
            elseif(! 
cuitValido($cuil)){
                echo
"<script>
                        alert ('Verifique la CUIL ingresada');
                        window.location.href='form.htm';
                    </script>"
;
                    
unlink($destino); 
                }
                elseif(!
is_numeric($basico)){
                    echo
"<script>
                            alert ('El campo Sueldo Basico debe ser numerico');
                            window.location.href='form.htm';
                        </script>"
;
                        
unlink($destino); 
                    }
                    elseif(!
is_numeric($bruto)){
                        echo
"<script>
                            alert ('El campo Sueldo Bruto debe ser numerico');
                            window.location.href='form.htm';
                            </script>"
;
                            
unlink($destino); 
                        }
                        elseif(
trim((string)$afili) !== "0" && trim((string)$afili) !== "1"){  
                            echo
"<script>
                                alert ('Debe indicar 1 para afiliados y 0 para NO afiliados');
                                window.location.href='form.htm';
                                </script>"
;
                                
unlink($destino);
                            }
                        else
                        {
                            echo 
"<script>
                                    alert('Archivo importado con exito');
                                    window.location.href='form.htm';
                                </script>"
;
                        }
  } 
__________________
Nico...
  #8 (permalink)  
Antiguo 14/05/2013, 13:06
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Bien, ¿ahora puedes explicar con detalle lo que te ocurre?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 14/05/2013, 13:11
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

El primer problema que tengo es que no me valida todas las lineas del csv, solo me valida la primera y cuando tiene un error tira un alert y borra el archivo con el unlink (pero no me funciona el borrado), andaba sin el while. Y le agregue el while para recorrer y no borra el unlink.
__________________
Nico...
  #10 (permalink)  
Antiguo 14/05/2013, 13:13
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Deberías depurar cada iteración que haces, de otra forma no se puede adivinar por qué se detiene la validación.

¿Será acaso que después de la alerta hace la redirección y por eso no procesa las demás lineas?

Eso es bastante obvio en tu código, no entiendo por qué no te das cuenta.

Además si unlink() no funciona al menos deberías recibir un error.

¿Tienes activado el reporte de errores?

Pon atención a lo que haces.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 14/05/2013, 13:26
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

mensaje del unlink
Warning: unlink(files/9f8a23_archivo.csv) [function.unlink]: Permission denied in C:\xampp\htdocs\
Claro, saque la redireccion y chequea todas las lineas pero me tira los alert por cada linea...
Como hago para corregir eso? Q no tire los alert por linea sino una vez hecho todo
__________________
Nico...
  #12 (permalink)  
Antiguo 14/05/2013, 13:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Puedes asignar una variable de $error dentro de tu while(), y al finalizar verificar dicho valor para mostrar las alertas.

¿No se te había ocurrido algo tan simple?

Lo del unlink() es aún más claro, el error dice que no tienes permisos, pon atención ahí.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 14/05/2013, 13:41
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

La verdad que no, ando hace poco por todo esto y me estoy cagando a golpes...pasando en limpio...

Código PHP:
$file fopen($destino"r");
while (
$datos fgetcsv ($file1000",")) {

$apellido $datos[0];
$nombre $datos[1];
$cuil $datos[2];
$basico $datos[3];
$bruto $datos[4];
$afili $datos[5];

    if(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$apellido))){
        }
        elseif(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$nombre))){
        }
            elseif(! 
cuitValido($cuil)){
                }
                elseif(!
is_numeric($basico)){
                    }
                    elseif(!
is_numeric($bruto)){
                        }
                        elseif(
trim((string)$afili) !== "0" && trim((string)$afili) !== "1"){  
                            }
                        else
                        {
                            echo 
"<script>
                                    alert('Archivo importado con exito');
                                </script>"
;
                        }
  } 
No entendi bien lo del $error
__________________
Nico...
  #14 (permalink)  
Antiguo 14/05/2013, 14:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Mas o menos así:
Código PHP:
Ver original
  1. $error = 0;
  2.  
  3. while (/* ... */) {
  4.  
  5.   if (algo_sale_mal()) {
  6.     $error = 1;
  7.   }
  8.  
  9. }
  10.  
  11.  
  12. if ($error) {
  13.   // algo salió mal
  14. }
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 14/05/2013, 14:54
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Y tendria que poner un $error para cada mensaje?
Algo como
Código PHP:
Ver original
  1. if (algo_sale_mal()) {
  2.     $error = 1;//para apellido
  3.   }
  4. if (algo_sale_mal()) {
  5.     $error = 2;//para nombre
  6.   }
  7. if (algo_sale_mal()) {
  8.     $error = 3;//para cuil
  9.   }
  10. etc...
Asi seria?
__________________
Nico...
  #16 (permalink)  
Antiguo 14/05/2013, 15:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas para recorrer archivo validando campos.

Pues ahí es donde entra tu creatividad y necesidades, sólo tu sabes lo que necesitas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 15/05/2013, 08:31
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Hola Patetrueke,
Asi me quedo el codigo funcionando
Código PHP:
$error 0;
$file fopen($destino"r");
while (
$datos fgetcsv ($file1000",")) {
$apellido $datos[0];
$nombre $datos[1];
$cuil $datos[2];
$basico $datos[3];
$bruto $datos[4];
$afili $datos[5];


    if(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$apellido))){
        
$error 1;
    }
        elseif(!(
preg_match("|^[a-zA-Z]+[ ]*$|",$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;
                        }
}
                            if(
$error == 1){
                                echo 
"<script>
                                        alert('Campo apellido debe ser alfabetico');
                                     </script>"
;
                                     
unlink($destino);
                            }
                                elseif(
$error == 2){
                                    echo 
"<script>
                                            alert('Campo nombre debe ser alfabetico');
                                        </script>"
;
                                        
unlink($destino);
                                }
                                    elseif(
$error == 3){
                                       echo 
"<script>
                                                alert('Verifique la CUIL ingresada');
                                             </script>"
;
                                             
unlink($destino);
                                    }
                                        elseif(
$error == 4){
                                           echo 
"<script>
                                                    alert('Campo basico debe ser numerico');
                                                </script>"
;
                                                
unlink($destino);
                                        }
                                            elseif(
$error == 5){
                                               echo 
"<script>
                                                        alert('Campo bruto debe ser numerico');
                                                    </script>"
;
                                                    
unlink($destino);
                                            }
                                                elseif(
$error == 6){
                                                   echo 
"<script>
                                                            alert('Ingresar 1 para afiliados y 0 para No afiliados');
                                                        </script>"
;
                                                        
unlink($destino);
                                                }
                                                    elseif(
$error == 0){
                                                        echo 
"<script>
                                                                alert('Importacion exitosa');
                                                             </script>"
;
                                                    } 
Gracias por todo...
__________________
Nico...
  #18 (permalink)  
Antiguo 16/05/2013, 12:47
Avatar de Nico0601  
Fecha de Ingreso: diciembre-2012
Ubicación: Buenos Aires, Zona Sur
Mensajes: 134
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Problemas para recorrer archivo validando campos.

Hola Pateketrueke, tengo otra duda, estuve agregandole unas cosas al codigo y me surge la siguiente duda. Este es el codigo
Código PHP:
$error 0;
$file fopen($destino"r");
while (
$datos fgetcsv ($file1000",")) 
{
    
$num count($datos);
    
$apellido $datos[0];
    
$nombre $datos[1];
    
$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;
                            }
    if((
$error 6) || ($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'"
); 
            }
    }
}          
                            if(
$error == 1){
                                echo 
"<script>
                                        alert('Campo apellido debe ser alfabetico');
                                        window.location.href='form.htm';
                                     </script>"
;
                                     
unlink($destino);
                            }
                                elseif(
$error == 2){
                                    echo 
"<script>
                                            alert('Campo nombre debe ser alfabetico');
                                            window.location.href='form.htm';
                                        </script>"
;
                                        
unlink($destino);
                                }
                                    elseif(
$error == 3){
                                       echo 
"<script>
                                                alert('Verifique la CUIL ingresada');
                                                window.location.href='form.htm';
                                             </script>"
;
                                             
unlink($destino);
                                    }
                                        elseif(
$error == 4){
                                           echo 
"<script>
                                                    alert('Campo basico debe ser numerico');
                                                    window.location.href='form.htm';
                                                </script>"
;
                                                
unlink($destino);
                                        }
                                            elseif(
$error == 5){
                                               echo 
"<script>
                                                        alert('Campo bruto debe ser numerico');
                                                        window.location.href='form.htm';
                                                    </script>"
;
                                                    
unlink($destino);
                                            }
                                                elseif(
$error == 6){
                                                   echo 
"<script>
                                                            alert('Ingresar 1 para afiliados y 0 para No afiliados');
                                                            window.location.href='form.htm';
                                                        </script>"
;
                                                        
unlink($destino);
                                                }
                                                    elseif(
$error == 0){
                                                        echo 
"<script>
                                                                alert('Importacion exitosa');
                                                                window.location.href='form.htm';
                                                             </script>"
;
                                                             
unlink($destino);
                                                    } 
El tema es que si hay algun error en el csv me avisa, pero me inserta o actualiza las demas lineas. Como hago para que si hay algun error no me actualice ninguna linea?
Código PHP:
if(($error 6) || ($error == 0)) 
Esa linea creo q hay q modificar pero nose como decirle que si hay algun error no haga nada.
Espero puedas ayudarme....
Gracias
__________________
Nico...

Etiquetas: registro
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 14:32.