0

Realizo un formulario de importación masiva de excel.CSV, me importa todos los registros pero cuando termina el proceso me muestra este error:

Notice: Undefined offset: 1 in C:\xampp\htdocs\importacion_excel.php on line 27

Notice: Undefined offset: 2 in C:\xampp\htdocs\importacion_excel.php on line 27

Anexo el codigo.

Gracias / Saludos.

<?php

if (isset($_POST["enviar"])) {//nos permite recepcionar una variable que si exista y que no sea null
 require_once("conexion_excel.php");
 require_once("functions.php");

 $archivo = $_FILES["archivo"]["name"];
 $archivo_copiado= $_FILES["archivo"]["tmp_name"];
 $archivo_guardado = "copia_".$archivo;

 //echo $archivo."esta en la ruta temporal: " .$archivo_copiado;

 if (copy($archivo_copiado ,$archivo_guardado )) {
  //echo "se copeo correctamente el archivo temporal a nuestra carpeta de trabajo <br/>";
 }else{
  //echo "hubo un error <br/>";
 }
    
    if (file_exists($archivo_guardado)) {
      
      $fp = fopen($archivo_guardado,"r");//abrir un archivo
         $rows = 0;
         while ($datos = fgetcsv($fp , 1000 , ";")) {
             $rows ++;
            // echo $datos[0] ." ".$datos[1] ." ".$datos[2]." ".$datos[3] ."<br/>";
          if ($rows > 1) {
           $resultado = insertar_datos($datos[0],$datos[1],$datos[2]);
              if($resultado){
             //echo "se inserto los datos correctamente<br/>";
                 } else {
              //echo "no se inserto <br/>";
                 }
          }
         }

    } else {
     echo "No existe el archivo copiado <br/>";
    }

}


?>
ffflabs
  • 21,223
  • 25
  • 48
Carlos
  • 411
  • 2
  • 14
  • 1
    `Undefined offset` ocurre cuando intentas acceder a un array numérico que no existe ([ver aquí](https://es.stackoverflow.com/q/79165/29967)). Si dices que eso ocurre al final, puede que la última línea de tu CSV (o cualquier otra), no esté completa, por ejemplo, que le falte el valor `$datos[2]` o algo así. – A. Cedano Mar 15 '18 at 11:08

2 Answers2

1

El problema parece ser acá:

$datos[0],$datos[1],$datos[2]

Si alguno de estos sub-indices no están iniciados sale este Notice.

Soluciones hay varias pero depende de la versión de php que uses:

para 5.x y anteriores: hay que pregunta si esta creado el indice y si no lo esta pasar un valor por defecto.

isset($datos[0])?$datos[0]:'dato por defecto'

para 7.x puedes usar el ?? (Null Coalesce Operator).

$datos[0] ?? 'valor por defecto'

Con esto te quitas el NOTICE.

Sergio Susa
  • 600
  • 3
  • 5
0

Otra solución puede ser que desactives solo las notificaciones de errores tipo E_NOTICE con ésta línea al inicio de tu código.

<?php

error_reporting(E_ALL ^ E_NOTICE);
Diego Dam
  • 421
  • 2
  • 2
  • Es un poco peligroso silenciar los mensajes de error, que tal que esa variable llegue a ser importante en algún momento, lo mejor es corregirlos en vez de callarlos –  Mar 16 '18 at 03:13