En este tutorial estaremos creando un PHP Script para exportar datos de manera rápida y sencilla. Estaremos exportando la información a un arhivo .txt ya que resulta más fácil de manipular y generalmente no ocupan un gran tamaño.
Antes de comenzar a crear código, debemos tener en cuenta un par de conceptos los cuales nos ayudarán a entender cómo realizar una exportación dependiendo de nuesto servidor y nuestras necesidades. En este caso, podemos crear 2 tipos de exportaciones: La primera es guardar el archivo .txt a exportar en nuestro servidor para que luego el usuario lo descarge. La segunda es crear en archivo .txt de manera directa sin guardarlo en nuestro servidor para que el usuario lo descarge. El primer método se utiliza generalmente para archivos relativamente grandes y se debe tener en cuenta de tener los permisos necesarios habilitados en el servidor para poder crear archivos desde PHP, además de contar con espacio suficiente para ir almacenando los archivos que el usuario quiera descargar. El segundo método es utilizado para archivos ligeros pues al crearse de manera directa el archivo, si es que este es muy grande, el navegador podría dar algún error en la conexión o simplemente podría bloquearse la página antes de que el usuario pueda descargar el archivo.
Vamos a utilizar el primer método en este ejemplo pues resulta ser el más utilizado. La información que iremos a exportar la sacaremos de una base de datos MySQL desde PHP. En caso ustedes tengan su propia base de datos pueden utilizarla para probar, no obstante, podrán descargar la base de datos en un vínculo al final del tutorial.
Lo primero que haremos será crear un archivo PHP en blanco para la conexión a la base de datos. Dicho archivo debe contener lo siguiente (estaremos utilizando mysqli para la conexión):
<?php define("HOST_IP", "localhost"); //poner el servidor define("HOST_DB_USER","root"); //poner el usuario de la bd define("HOST_DB_PASSWORD", ""); // poner la clave de la bd define("HOST_DB_NAME", "base_ejemplo"); //poner el nombre de la bd define("HOST_DB_PORT", 3306); function getConnection() { $mysqli = new mysqli(HOST_IP, HOST_DB_USER, HOST_DB_PASSWORD, HOST_DB_NAME, HOST_DB_PORT); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; return null; } else { //mysqli_set_charset($mysqli, "utf8"); return $mysqli; } } ?>
Debemos cambiar los parámetros de conexión para que se adecuen a nuestra base de datos, es decir: el servidor, el usuario, password y el nombre de la base de datos. Cambiada esta configuración, ahora podemos empezar a programar el código que recuperará los datos de la base de datos y nos permitirá exportarlos a un archivo .txt en el formato que nosotros queramos.
Crearemos un nuevo archivo PHP con el nombre que queramos en el cual haremos referencia al archivo anterior de conexión a la base de datos. Debemos realizar una consulta a la tabla -tabla- para poder sacar la información. Luego de realizar dicha consulta iremos a guardar los resultados dentro de un arreglo PHP para su posterior uso. El código necesario es el siguiente:
require_once('cnx.php'); $cnx = getConnection(); $sql = "SELECT * FROM city"; //hago la consulta a la base de datos $query = $cnx->query($sql) or die($cnx->error); $info = array(); //los datos se guardaran en este arreglo while($result = $query->fetch_assoc()) { $info[] = $result; //guardo cada resultado en este arreglo }
Ahora que ya tenemos la información dentro de un arreglo PHP, empezaremos con la exportación. Para poder realizar la exportación debemos hacer uso de la función file_put_contents la cual nos permitirá guardar el contenido de un arreglo dentro de un archivo. El primer parámetro hará referencia al archivo y el segundo a la información a guardar. Es importante tener en cuenta la forma en que queremos que la información se exporta (por ejemplo, separarla por comas o por espacio). En este caso, vamos a probar separando por comas la información y cada ciudad separada por saltos de línea. El código es el siguiente:
$file = "archivo_exportado.txt"; //le doy un nombre al archivo file_put_contents($file, ""); //creamos el archivo for($i = 0; $i < count($info); $i++) { file_put_contents($file, implode(",", $info[$i]), FILE_APPEND); //escribo en el archivo separando el arreglo con comas file_put_contents($file, PHP_EOL, FILE_APPEND); //agrego un salto de linea }
Luego debemos modificar las cabeceras con PHP para que el archivo se pueda descargar de manera automática. Estas cabeceras a modificar son las siguientes:
if (file_exists($file)) { //verifico que el archivo haya sido creado header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); } else { //en caso no se haya creado el archivo, muestro un mensaje echo "Hubo un error al momento de crear el archivo, verifique los permisos de las carpetas del servidor."; }
Además, debemos notar que al poder elegir el formato en que la información será exportada, podemos convertir un simple archivo .txt en un archivo .csv para poder abrirlo con cualquier versión de Excel. En este ejemplo, únicamente faltaría agregarle una cabecera al arreglo para que pueda ser leido como un archivo .csv desde Excel. En caso quieran probar, lo primero que debemos hacer es agregar una cabecera al arreglo de la siguiente manera a modo que sirva como la cabecera del CSV:
$file = "archivo_exportado.txt"; //le doy un nombre al archivo file_put_contents($file, "ID, Name, CountryCode, District, Population" . PHP_EOL); //creamos el archivo for($i = 0; $i < count($info); $i++) { file_put_contents($file, implode(",", $info[$i]), FILE_APPEND); //escribo en el archivo separando el arreglo con comas file_put_contents($file, PHP_EOL, FILE_APPEND); //agrego un salto de linea }
Luego al momento de exportar debemos cambiar la extensión del archivo para que sea “.csv” en lugar de “.txt” de la siguiente manera:
$file = "archivo_exportado.csv"; //le doy un nombre al archivo
Por último, el código resultante e integrado lo pueden obtener a continuación:
<?php require_once('cnx.php'); $cnx = getConnection(); $sql = "SELECT * FROM city"; //hago la consulta a la base de datos $query = $cnx->query($sql) or die($cnx->error); $info = array(); //los datos se guardaran en este arreglo while($result = $query->fetch_assoc()) { $info[] = $result; //guardo cada resultado en este arreglo } $file = "archivo_exportado.csv"; //le doy un nombre al archivo file_put_contents($file, "ID, Name, CountryCode, District, Population" . PHP_EOL); //creamos el archivo for($i = 0; $i < count($info); $i++) { file_put_contents($file, implode(",", $info[$i]), FILE_APPEND); //escribo en el archivo separando el arreglo con comas file_put_contents($file, PHP_EOL, FILE_APPEND); //agrego un salto de linea } if (file_exists($file)) { //verifico que el archivo haya sido creado header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); } else { //en caso no se haya creado el archivo, muestro un mensaje echo "Hubo un error al momento de crear el archivo, verifique los permisos de las carpetas del servidor."; } ?>