Importar archivos csv a Mysql con php

Estamos trabajando en un proyecto para una ONG, y la idea era importar archivo csv a mysql con php, toda la programación estaba echa en php así que era la mejor manera de realizarlo.

Compartimos esta información por que hay varios tutoriales en la red de como importar archivos csv a mysql con php pero nos daba error, hasta que no encontramos el porque.

Código para importar archivos csv a mysql con php

Tenemos dos formularios, uno que contiene un formulario, y el otro que ejecuta el envió de ese formulario, lo pueden hacer en uno solo, pero para este ejemplo lo realizaremos así:

formulario.php

<form action='cargar.php' method='post' enctype="multipart/form-data" class="form ">
<div class="form-group">
Importar Archivo : <input type='file' name='sel_file' size='20' >
</div>
<div class="form-group">
<input name="Envio" type="hidden" id="Envio" value="1" />
<button type="submit"  name="Grabar" id="Enviar" value="Grabar"class="btn btn-lg btn-primary btn-block">CARGAR ARCHIVO</button>
</div>
</form>

y en el cargar.php

if(isset($_POST[‘Grabar’]))
{
//Aquí es donde seleccionamos nuestro csv
$fname = $_FILES[‘sel_file’][‘name’];
echo ‘1. 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’];
$nombre_final_archivo=»cargado.csv»;
if (move_uploaded_file($_FILES[‘sel_file’][‘tmp_name’],$nombre_final_archivo)){
//unlink(‘base.txt’);
echo «Aviso: El archivo ha sido cargado correctamente.<br>»;
// numero del error para mostrar el paso
$error_estado=2;
}else{
echo «Error: Ocurrió algún error al subir el fichero. No pudo guardarse. Intentelo de nuevo <br>»;
}

echo ‘2. empezando cargue: ‘.$nombre_final_archivo.’ <br>’;

$sql1 = «LOAD DATA LOCAL INFILE ‘cargado.csv’
REPLACE INTO TABLE tablanombre
FIELDS TERMINATED BY ‘;’
LINES TERMINATED BY ‘\r\n’
IGNORE 1 LINES (columna1,columna2,columnan)»;
$db_host = ‘TU_HOST’;
$db_user = ‘TU_USER’;
$db_pass = ‘TU_PASS’;

$database = ‘TU_DB’;
$table = ‘TU_TABLA’;
if (!mysql_connect($db_host, $db_user, $db_pass))
die(«No se pudo establecer conexión a la base de datos»);
mysql_query($sql) or die(mysql_error());
echo ‘3. cargue completo <br>’;
}
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!»;
}
}

?>

y listo, con esto se carga el el csv a mysql, fácil y rápido.

Posibles errores.

  • Como les decía hay muchos tutoriales, en varios cargan el archivo csv temporalmente, el truco para que salga correctamente es guardarlo y saber donde esta, nosotros lo hicimos que cargara en la misma ubicación donde esta el código php, despues de muchas pruebas y pruebas, nos dimos cuenta que el load data local infile no tomara correctamente el tmp de la ubicación del archivo, se arreglo todo guardarlo en la misma ubicación.
  • Nosotros lo omitimos en este ejemplo, pero el cliente necesitaba que se eliminara los registros que se cargaron, es decir, que existiera un delete, antes, el cual este seria el código sql: «DELETE FROM nombredelatabla «.
  • Otro truco que fue vital, fueron las tildes, si que nos hizo sufrir, la cuestión es que el pc donde hacian la tabla csv tenia un excel configurado diferente y al exportarlo si aparecían las tildes, pero al cargarlo no, el truco es abrir el csv con el note y guardarlo como en codificación cambiarlo a utb8, y listo, ya con eso si lo pueden leer y cargar con caracteres especiales.

Suerte con los proyectos.

Leonardo Molano Beltrán

Profesional de marketing digital especialista en el uso de las tecnologías digitales para promocionar productos o servicios y alcanzar los objetivos de negocio. Utilizo una variedad de herramientas y técnicas, como el SEO, el SEM, el email marketing, las redes sociales y el marketing de contenidos, al igual que análisis profundos en el proceso.

Deja un comentario

Debes iniciar sesión para escribir un comentario.