PHP : générer un fichier csv à partir d'une base de données MySQL

Nous allons voir dans ce tutoriel comment générer simplement un fichier CSV à partir d'une base de données MySQL. Commençons par créer notre table, celle qui va nous servir d'exemple dans ce tutoriel. Vous pouvez le créer visuellement si vous avez par exemple un gestionnaire de base de données comme PhpMyAdmin.

Nous allons considérer que notre base s'appelle tuto et contient une table eleves avec pour colonnes idnomprenom, moyenne. Voilà un petit code sql pour créer cette table : 

CREATE TABLE eleves (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    nom VARCHAR(100),
    prenom VARCHAR(100),
    moyenne FLOAT
) ENGINE=INNODB;

Insérons ces enregistrements : 

Nom Prénom Moyenne
Balo Ziétin 13.5
Sossou Gérard 15
Agbo Ali 14.75
Tossa Urbain 16

Le code sql pour créer ces enregistrements : 

INSERT INTO `eleves` (`id`, `nom`, `prenom`, `moyenne`) VALUES (NULL, 'Balo', 'Ziétin', '13.50'), (NULL, 'Sossou', 'Gérard', '15'), (NULL, 'Agbo', 'Ali', '14.75'), (NULL, 'Tossa', 'Urbain', '16');

Maintenant que nous avons ces enregistrements dans notre table, nous allons les extraire et avec ces informations, générer un fichier CSV.

Commençons par nous connecter à notre base de données. Utilisez vos propres identifiants le cas échéant :

<?php
    // connexion à la base de données. Renseignez vos propres idetifiants
    $bd = new PDO("mysql:host=localhot;dbname=tuto", "root", "");
?>

Nous allons maintenant créer un tableau qui va recevoir la structure de notre fichier CSV : 

<?php
    /* Pour les anciennes versions à PHP 7, utilisez plutôt $tabeleves = array(); pour la déclaration du tableau */
    $tabeleves = [];
    $tabeleves[] = array('NOM', 'PRENOMS', 'MOYENNE');
    $tabeleves[] = array('', '', '');
?>

La deuxième ligne constitue les libellés des colonnes de notre fichier. La troisième ligne permet juste d'espacer les libellés des enregistrements.

Récupérons tous nos enregistrements : 

<?php
    $r = $bd->query('SELECT * FROM eleves');
?>

Parcourons ces enregistrements et insérons les dans notre tableau.

<?php
    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
        $tabeleves[] = array($rs['nom'], $rs['prenom'], $rs['moyenne']);
    }
?>

On prépare notre fichier CSV pour la lecture et l'écriture : 

<?php
    $fichier_csv = fopen("eleves.csv", "w+");
?>

Le premier paramètre de fopen définit le chemin du fichier csv et le deuxième paramère définit le mode d'accès. Vous avez la documentation ici

Gérons le BOM du fichier ou en résumé disons l'encodage du fichier. Choisissez un en fonction de votre version de PHP :

<?php
    // Pour PHP >= 7
    fputs($fichier_csv, "u{FEFF}");

    // Pour PHP < 7
    fputs($fichier_csv, "xEFxBBxBF");
?>

Parcourons notre tableau et écrivons dans le fichier CSV avec la fonction fputcsv: 

<?php
    foreach($tabeleves as $ligne){
        fputcsv($fichier_csv, $ligne, ";");
    }
?>

Le dernier paramètre de la fonction représente le délimiteur qui est généralament un ";" pour les fichiers CSV.

Fermons maintenant notre fichier : 

<?php
    fclose($fichier_csv);
?>

Et voilà le code complet : 

<?php
    $bd = new PDO("mysql:host=localhost;dbname=tuto", "root", "");
    $r = $bd->query('SELECT * FROM eleves');

    $tabeleves = [];
    $tabeleves[] = array('NOM', 'PRENOMS', 'MOYENNE');
    $tabeleves[] = array('', '', '');

    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
        $tabeleves[] = array($rs['nom'], $rs['prenom'], $rs['moyenne']);
    }
    
    $fichier_csv = fopen("eleves.csv", "w+");
    fputs($fichier_csv, "u{FEFF}");
    foreach($tabeleves as $ligne){
        fputcsv($fichier_csv, $ligne, ";");
    }
    fclose($fichier_csv);
?>

 

Pour une version PHP 5 >= 5.4.0, le code peut devenir ceci en utilisant la class .SplFileObject et sa méthode fputcsv. Alors, le code peut devenir : 

<?php
    $bd = new PDO("mysql:host=localhost;dbname=tuto", "root", "");
    $r = $bd->query('SELECT * FROM eleves');

    $tabeleves = [];
    $tabeleves[] = array('NOM', 'PRENOMS', 'MOYENNE');
    $tabeleves[] = array('', '', '');

    while($rs = $r->fetch(PDO::FETCH_ASSOC)){
        $tabeleves[] = array($rs['nom'], $rs['prenom'], $rs['moyenne']);
    }
    
    $fichier_csv = new SplFileObject('eleves.csv', 'w');
    foreach($tabeleves as $ligne){
        $fichier_csv->fputcsv($ligne, ';');
    }
?>

 

Partager :
comments powered by Disqus

Suivez-moi sur Twitter

Copyright © 2010-2019 Lookman Design, tous droits réservés .