importar archivos csv

Subir archivos CSV a MySql con PHP

Esta entrada la destinaré a una de las utilidades más usadas a la hora de importar datos. Es muy probable que los clientes nos den ficheros con los datos que deben subirse, procesarse e insertarse en una base de datos mediante MySQL. Por eso, el objetivo aquí es aprender a subir archivos CSV a MySQL con PHP.

1.- Conexión:

// conexión
$mysqli = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

2.- Conocer el archivo / extensión:

Debemos conocer el nombre del archivo y la extensión del mismo. El archivo se recoge mediante un formulario por su input de ficheros.

Existe una clase en PHP que nos da información de los archivos que subimos, la clase SplFileInfo tiene un método llamado pathinfo al que le podemos pasar el atribujo PATHINFO_EXTENSION.

$filename=$_FILES["file"]["name"];
$info = new SplFileInfo($filename);
$extension = pathinfo($info->getFilename(), PATHINFO_EXTENSION);

3.- Leer y guardar los datos:

El ejemplo escogido será la importación de usuarios con sus correos electrónicos. Debemos suponer que tenemos preparada una tabla en nuestra base de datos que reciba tal información porque la vamos a procesar mediante consultas SQL.

Pero antes de nada debemos recorrer el archivo. Normalmente los ficheros CSV separan los datos con «,». Por lo tanto nuestro manejador irá saltando de dato en dato cada vez que encuentre una coma.

$filename = $_FILES['file']['tmp_name'];
$handle = fopen($filename, "r");

while( ($data = fgetcsv($handle, 1000, ";") ) !== FALSE )
{
  $q = "INSERT INTO importacion (nombre, apellido, correo) VALUES (
	'$data[0]', 
	'$data[1]',
	'$data[2]'
)";

//....

Conforme vamos recorriendo el fichero generamos una consulta con INSERT para que se vayan rellenando las filas al lanzar la consulta.

Si todo ha ido bien y hemos terminado de recorrerlo (cambiar la longitud del manejador dependiendo del tamaño que tenga), cerramos el archivo que hemos leído con el método fclose($handle).

4.- Formulario de recogida:

Este apartado es sencillo, tan solo generamos nuestro formulario con el detalle siempre de que vamos a subir ficheros, lo que quiere decir que vamos a necesitar el atributo enctype

<form enctype="multipart/form-data" method="post" action="">
    CSV File:<input type="file" name="file" id="file">
    <input type="submit" value="Enviar" name="enviar">
</form>

El resultado final del fichero funcional sería este…

<?php 

// conexión
$mysqli = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

if (isset($_POST['enviar']))
{
	
  $filename=$_FILES["file"]["name"];
  $info = new SplFileInfo($filename);
  $extension = pathinfo($info->getFilename(), PATHINFO_EXTENSION);

   if($extension == 'csv')
   {
	$filename = $_FILES['file']['tmp_name'];
	$handle = fopen($filename, "r");

	while( ($data = fgetcsv($handle, 1000, ";") ) !== FALSE )
	{
	   $q = "INSERT INTO importacion (nombre, apellido, correo) VALUES (
		'$data[0]', 
		'$data[1]',
		'$data[2]'
	)";

	$mysqli->query($q);
   }

      fclose($handle);
   }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Importación</title>
</head>
<body>
	
<form enctype="multipart/form-data" method="post" action="">
   CSV File:<input type="file" name="file" id="file">
   <input type="submit" value="Enviar" name="enviar">
</form>

</body>
</html>

Hasta aquí el tutorial de cómo subir archivos CSV a MySQL con ayuda de PHP, un script mejorado del artículo de Miguel Ángel en su web.

1 comentario en “Subir archivos CSV a MySql con PHP”

Deja un comentario