Como importar información desde archivo e insertar en base de datos

Como importar información desde archivo e insertar en base de datos

Para el método de nuestro controlador que renderiza la vista, este es el código, no es necesario, solo es lo que va a mostrar el formulario en el front end.

// Dentro de tutorialesController.php
function importar_csv()
  {
    $data =
    [
      'title' => 'Importar desde CSV'
    ];

    View::render('importar_csv', $data);
  }

El siguiente método es el que se encarga de toda la funcionalidad real y es el más importante, es el que procesa y genera la importación de nuestra información.

// Dentro de tutorialesController.php
function post_importar_csv()
  {
    try {
      if (!check_posted_data(['csrf'], $_POST) || !Csrf::validate($_POST["csrf"])) {
        throw new Exception("Acceso no autoritzado.");
      }

      // Incializamos variables
      $rows     = [];
      $total    = 0;
      $inserted = 0;
      $errors   = 0;

      // Validación de que haya archivos llegando a la ruta
      if (!isset($_FILES["archivo"])) {
        throw new Exception("Selecciona un archivo CSV válido.");
      }

      // Información del archivo CSV
      $file     = $_FILES["archivo"];
      $tmp      = $file["tmp_name"];
      $filename = $file["name"];
      $size     = $file["size"];
			$ext      = pathinfo($filename, PATHINFO_EXTENSION);

      // Validar la extensión de archivo en backend
      if (!in_array($ext, ['csv','CSV'])) {
        throw new Exception("Selecciona un archivo válido por favor.");
      }

      // Validar el tamaño válido del archivo
      if ($size < 0) {
        throw new Exception("Selecciona un archivo válido por favor.");
      }

      // Inicializamos la lectura del archivo
      $handle = fopen($tmp, "r");

      // Leemos cada fila y la agregamos a un array
      while (($data = fgetcsv($handle)) !== false) {
        $rows[] = $data;
      }

      // se eliminan las cabeceras y contamos el total de filas
      unset($rows[0]); 
      $total = count($rows);
      
      // Si no hay filas no importamos nada
      if ($total <= 0) {
        throw new Exception("El archivo proporcionado está vacio.");
      }

      // Insertando información
      foreach ($rows as $r) {
        $data =
        [
          'titulo'      => $r[0],
          'contenido'   => $r[1],
          'creado'      => now(),
          'actualizado' => now()
        ];

        // Se agrega el registro a la base de datos
        if (Model::add('posts', $data) === false) {
          $errors++;
          continue;
        }

        $inserted++;
      }

      // Notificación de elementos insertados en db
      Flasher::new(sprintf('Se han insertado <b>%s</b> de <b>%s</b> registros con éxito.', $inserted, $total), 'success');

      // Si hubo 1 o más errores
      if ($errors > 0) {
        Flasher::new(sprintf('Tuvimos problemas al importar <b>%s</b> registros.', $errors), 'danger');
      }

      // Redirección
      Redirect::back();

    } catch (Exception $e) {
      Flasher::new($e->getMessage(), 'danger');
      Redirect::back();
    }
  }

¿Quieres desarrollar sistemas profesionales?

Si nos sigues desde hace tiempo o eres nuevo en la Academia y quieres apoyar nuestro trabajo, te invitamos a nuestro Pack Full Stack, contiene todos nuestros cursos avanzados y premium.

¿Nos ayudas compartiendo?

Considera suscribirte para más

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Ya nos sigues?

Más Populares

Recibe Todo en Tu Inbox

Suscríbete a nuestro boletín

Sin spam, solo notificaciones de nuevos cursos y contenido de la Academia.

Destacados para ti

Relacionados