El formato CSV es el formato más popular para almacenar datos tabulados en texto plano. Generalmente, los ficheros CSV se utilizan para importar y exportar información entre programas. La caracterÃstica de importar y exportar es muy utilizada en el desarrollo web, y el formato CSV suele ser el predilecto para este tipo de tareas.
En este tutorial te mostraré cómo exportar datos extraÃdos de una base de datos MySQL a un fichero CSV utilizando PHP. Además, también aprenderás a crear un fichero CSV en PHP y a almacenar información de MySQL en un fichero CSV en PHP.
Para ejemplificar todo esto, he creado un script de ejemplo en el que exportaremos los usuarios de una base de datos MySQL y los guardaremos en un fichero CSV mediante PHP.
Crear tabla en la base de datos MySQL
El siguiente SQL crea la tabla members la cual cuenta con campos muy básicos. La tabla members albergará la información de los usuarios que necesitamos exportar.
CREATE TABLE `members` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `phone` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Conectar a la base de datos MySQL
Para exportar la información de la base de datos, necesitamos conectarnos a ella. Utilizaremos el archivo dbconfig.php para conectar y seleccionar la base de datos que nos interesa mediante PHP y MySQL.
<?php //DB details $dbHost = 'localhost'; $dbUsername = 'root'; $dbPassword = '*****'; $dbName = 'programacionnet'; //Create connection and select DB $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName); if($db->connect_error){ die("Unable to connect database: " . $db->connect_error); }
Exportar a un fichero CSV mediante PHP
Los siguientes dos archivos los utilizaremos para exportar la información de la base de datos.
index.php
Utilizaremos la librerÃa Bootstrap para personalizar nuestra tabla HTML y enlace de exportar. Por supuesto, puedes omitir este paso si no quieres utilizar Bootstrap.
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
Extraemos la información de los usuarios de la tabla members que hemos creado anteriormente, y los listamos en la tabla. Pondremos el enlace de exportar en la parte superior de la tabla, el cual enlazará con el fichero exportData.php, que será el encargado de exportar la información.
<div class="container"> <div class="panel panel-default"> <div class="panel-heading"> Members list <a href="exportData.php" class="btn btn-success pull-right">Export Members</a> </div> <div class="panel-body"> <table class="table table-bordered"> <thead> <tr> <th>Name</th> <th>Email</th> <th>Phone</th> <th>Created</th> <th>Status</th> </tr> </thead> <tbody> <?php //include database configuration file include 'dbConfig.php'; //get records from database $query = $db->query("SELECT * FROM members ORDER BY id DESC"); if($query->num_rows > 0){ while($row = $query->fetch_assoc()){ ?> <tr> <td><?php echo $row['name']; ?></td> <td><?php echo $row['email']; ?></td> <td><?php echo $row['phone']; ?></td> <td><?php echo $row['created']; ?></td> <td><?php echo ($row['status'] == '1')?'Active':'Inactive'; ?></td> </tr> <?php } }else{ ?> <tr><td colspan="5">No member(s) found.....</td></tr> <?php } ?> </tbody> </table> </div> </div> </div>
exportData.php
En el fichero exportData.php, realizaremos las siguientes tareas:
- Extraer la información de la base de datos
- Crear el puntero al fichero con la función fopen()
- Definir las columnas de la cabecera y ponerlas dentro del fichero CSV
- Pintar cada uno de los registros de la tabla members en lÃneas separadas de nuestro CSV
- Establecer el Content-Type y el Content-Disposition para forzar al navegador a descargar el fichero en lugar de mostrarlo.
<?php //include database configuration file include 'dbConfig.php'; //get records from database $query = $db->query("SELECT * FROM members ORDER BY id DESC"); if($query->num_rows > 0){ $delimiter = ","; $filename = "members_" . date('Y-m-d') . ".csv"; //create a file pointer $f = fopen('php://memory', 'w'); //set column headers $fields = array('ID', 'Name', 'Email', 'Phone', 'Created', 'Status'); fputcsv($f, $fields, $delimiter); //output each row of the data, format line as csv and write to file pointer while($row = $query->fetch_assoc()){ $status = ($row['status'] == '1')?'Active':'Inactive'; $lineData = array($row['id'], $row['name'], $row['email'], $row['phone'], $row['created'], $status); fputcsv($f, $lineData, $delimiter); } //move back to beginning of file fseek($f, 0); //set headers to download file rather than displayed header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="' . $filename . '";'); //output all remaining data on a file pointer fpassthru($f); } exit; ?>
Fuente: codexworld.com