Importar una tabla CSV a MySQL con PHP

Nota: esta entrada esta obsoleta, la dejo por que puede resultar de guía para muchos que empiezan, pero hay que tener en cuenta que la escribí hace muchos años (2015) cuando daba mis primeros pasos en este trabajo. Todos empezamos en algun momento y creo que puede servir de guía a muchos que estan iniciandose, teniendo en cuenta que las conexiones a las BBDD desde PHP ha cambiado en sus ultimas versiones y que naturalmente no lo haría hoy en día así, pero si eres de esos «pros» que ni siquiera miran la fecha de publicación del artículo y que parece que naciste sabiendo, tienes dos caminos, entender las fechas y el contexto temporal (como en filosofía, si es que fuiste al instituto) o bien, como dice Conan, pudrirte en el infierno… que por cierto ¿si eres tan «pro»?¿qué haces buscando como subir un csv a MySql?

Esto es algo que realmente puede traer de cabeza a muchos, y de hecho a mi me ha tenido un poco loco durante un tiempo en el que acosado por proyectos tenía que llevar a cabo un script el cual subiera por medio de un formulario un archivo csv con una tabla a mysql con unas 6000 filas, trabajo que no iba a hacer a mano… Aparte de que mi script debía de hacer más cosas que ya os contare, la primera parte del problema era esa, subir el archivo.

Tras mucho investigar y de surcar las olas de google, encontré varias opciones y me he quedado con esta, que seguro que os puede venir muy bien y que paso a contar.

Primero debemos de hacer un archivo con nuestro formulario html, no tiene gran complicación es solo un formulario que cargará un archivo y que apunta al propio script:

<!DOCTYPE html>
  <body>
  <h1>Importando archivo CSV</h1>
  <form action='control.php' method='post' enctype="multipart/form-data">
   Importar Archivo : <input type='file' name='sel_file' size='20'>
   <input type='submit' name='submit' value='submit'>
  </form>
 </body>
</html>

Algo realmente sencillo, ahora es cuando viene nuestro código php, que yo he puesto en un archivo llamado control.php, pero que puede cambiar el nombre si lo modificáis en el atributo action del formulario anterior.

<?php

//conexiones, conexiones everywhere
ini_set('display_errors', 1);
error_reporting(E_ALL);
$db_host = 'HOST DONDE ESTA LA BBDD';
$db_user = 'USUARIO DE LA BBDD';
$db_pass = 'CLAVE DEL USUARIO DE LA BBDD';

$database = 'NOMBRE DE LA BBDD';
$table = 'TABLA QUE VAMOS A INTRODUCIR';
if (!@mysql_connect($db_host, $db_user, $db_pass))
    die("No se pudo establecer conexión a la base de datos");

if (!@mysql_select_db($database))
    die("base de datos no existe");
    if(isset($_POST['submit']))
    {
        //Aquí es donde seleccionamos nuestro csv
         $fname = $_FILES['sel_file']['name'];
         echo 'Cargando nombre del archivo: '.$fname.' <br>';
         $chk_ext = explode(".",$fname);

         if(strtolower(end($chk_ext)) == "csv")
         {
             //si es correcto, entonces damos permisos de lectura para subir
             $filename = $_FILES['sel_file']['tmp_name'];
             $handle = fopen($filename, "r");

             while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
             {
               //Insertamos los datos con los valores...
                $sql = "INSERT into TABLA(CAMPOS SEPARADOS POR COMAS) values('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]',...)";
                mysql_query($sql) or die('Error: '.mysql_error());
             }
             //cerramos la lectura del archivo "abrir archivo" con un "cerrar archivo"
             fclose($handle);
             echo "Importación exitosa!";
         }
         else
         {
            //si aparece esto es posible que el archivo no tenga el formato adecuado, inclusive cuando es cvs, revisarlo para             
//ver si esta separado por " , "
             echo "Archivo invalido!";
         }
    }

?>

Donde se encuentran las variables:

$db_host = 'HOST DONDE ESTA LA BBDD';
$db_user = 'USUARIO DE LA BBDD';
$db_pass = 'CLAVE DEL USUARIO DE LA BBDD';

$database = 'NOMBRE DE LA BBDD';
$table = 'TABLA QUE VAMOS A INTRODUCIR';

Debemos de introducir los datos de nuestra aplicación, y debemos de adaptar la consulta $sql para nuestro sistema introduciendo los datos de la tabla que necesitamos.

Este script es realmente sencillo y estoy seguro que podréis controlarlo muy rápidamente introduciéndole los cambios que necesitáis para vuestra aplicación.