Cómo exportar datos a un fichero CSV mediante PHP y MySQL

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

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.