IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

export csv par une fonction php


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut export csv par une fonction php
    Bonsoir,
    Après 2 jours perdus sur des forums, des tutos... je fais appel à ce forum.
    J'ai un formulaire de recherche qui récupère les membres qui appartiennent à un "corps" donné et affiche les résultats sous forme d'une liste.
    Jusqu'ici tout va bien.
    Mais je souhaite en plus, donner la possibilité à l'utilisateur de faire un export csv de ces résultats s'il le souhaite, pour une utilisation avec Excel.

    Pour ce soir, j'ai testé une fonction enregistrée dans un fichier "fonctions.inc.php" mais je ne sais pas très bien où l'appeler ? Il m'est difficile de faire cohabiter les 2 possibilités (affichage sous forme de liste et/ou export csv) avec une seule requête ?

    Je vous remercie par avance pour votre aide.
    Evelyne 31

    code de traitement de mon formulaire de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    <?php
    if( empty(session_id()) ){ session_start(); }
    //error_reporting(E_ALL);
     
    $base = include './include/connect.inc.php';
    include('./include/fonctions.inc.php');
     
    // on teste la déclaration de l'envoi du formulaire de recherche
    if (isset($_POST['r_corps']) ) 
    {
     
    ?>
     
    <!DOCTYPE html>
    <html lang="fr">
     
    	<head>
    		<link rel="shortcut icon" type="image/x-icon" href="./favicon.ico">
    		<title>Recherche par corps</title>
     
    		<?php include("./include/head.php"); ?>
     
    		<link href="./include/chosen.css" rel="stylesheet" type="text/css">
    		<link href="./include/styles.css" rel="stylesheet" type="text/css">
     
    		<script type="text/javascript" src="./scripts/jquery-latest.js"></script>
     
    		  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    		  <link rel="stylesheet" href="/resources/demos/style.css">
    		  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    		  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
     
            <meta name="viewport" content="width=device-width, initial-scale=1">
     
            <meta charset="utf-8" />
     
    	</head>
     
    	<body>
     
    	<div id="page">
     
    <?php include ("./include/menu.php"); ?>			
     
    			<div id="main" class="container text-left corps-de-page">
    			  	<div class="row content">
     
    <!-- début fil d'ariane -->
    <div class="container">
    <div class='row'> 
    	<div class="col-lg-12 col-md-12 col-sm-12">
    	<div class="ariane text-left">
    		<span><font color="#993333"><span class="glyphicon glyphicon-home"></font></span><a href="index.php">&nbsp;Accueil&nbsp;</a><font color="#993333"><span class="glyphicon glyphicon-chevron-right"></font></span><a href="bdd.php">&nbsp;menu base de données&nbsp;</a><font color="#993333"><span class="glyphicon glyphicon-chevron-right"></font></span><a href="formulaire_recherche.php">&nbsp;formulaire de recherche&nbsp;</a></span>
     
    	</div>
    	</div>
    </div>
    </div>
    <!-- fin fil d'ariane -->
     
    <?php include("./include/menu_intranet.php"); ?>
     
    <div class='row'> 
    <div class="col-lg-12 col-md-12 col-sm-12">     
    	<center>
    	<h4>Résultat de votre recherche par corps pour : </h4><h3><?php echo $_POST['r_corps']; ?></h3>
    	</center>
    </div>
    </div>
     
    <!--barre horizontale-->
    <br><hr width='75%' color='maroon'><br>
     
    <?php
    $resultat = $base->query('
    SELECT 
        m.`nom`, 
        m.`prenom`,  
        s.`corps`,
        i.`nom_institut`     
    FROM 
        MEMBRE m 
        INNER JOIN STATUT s ON s.`ID_statut` = m.`ID_statut`
        INNER JOIN INSTITUT i ON i.`ID_institut` = s.`ID_institut`
    WHERE
        s.`corps` = "'.$_POST['r_corps'].'"
    ORDER BY
        m.`nom`		
    ') or die($mysqli->error.__LINE__);
     
    	while($donnees = $resultat->fetch()) {	
     
    	$nom = $donnees['nom'];
    	$prenom = $donnees['prenom'];
    	$corps = $donnees['corps'];
    	$institut = $donnees['nom_institut'];
     
    //echo 'var_dump variable donnees : <br>';
    //var_dump($donnees);
    //function export_data_to_csv();	
    ?>
     
    <div class="container">
    <div class="row">
    <div class="col-lg-12 col-md-12 col-sm-12">
     
    <div class="table-responsive">
    <table class="table">
    	<tr class="tab1">
            <td class="tab1">Données enregistrées :
     
            <br>nom, prénom&nbsp;: <font color="#993333"><?php echo $nom; ?> <?php echo $prenom; ?></font>
            <br>corps&nbsp;: <font color="#993333"><?php echo $corps; ?></font>
            <br>institut&nbsp;: <font color="#993333"><?php echo $institut; ?></font>
            </td>   
     
            <td class="tab2">
            <br>
    		<a href="page_membre.php?
            nom=<?php echo $nom; ?>&prenom=<?php echo $prenom; ?>&corps=<?php echo $corps; ?>&institut=<?php echo $institut; ?> ">
            <span class ="bouton_voir">Voir la page&nbsp;&nbsp;<span class="glyphicon glyphicon-eye-open"></span></a>
            </td>
    	</tr>
    </table>
     
    </div> 
    <hr width='75%' color='maroon'>
     
    <br>
    </div></div></div></div></div></div></div>
     
    <?php 
    }
    }
     
    $resultat->closeCursor(); // Termine le traitement de la requête	
     
    include('./include/footer.php');
    ?>
    </body>
     
    </html>
    code de la fonction enregistrée dans le fichier "fonctions.inc.php" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    /**
     *
     * Exports an associative array into a CSV file using PHP.
     *
     * @see https://stackoverflow.com/questions/21988581/write-utf-8-characters-to-file-with-fputcsv-in-php
     *
     * @param array     $data       The table you want to export in CSV
     * @param string    $filename   The name of the file you want to export
     * @param string    $delimiter  The CSV delimiter you wish to use. The default ";" is used for a compatibility with microsoft excel
     * @param string    $enclosure  The type of enclosure used in the CSV file, by default it will be a quote "
     */
     
    function export_data_to_csv($donnees,$filename='export_csv',$delimiter = ';',$enclosure = '"')
    {
     
        // Tells to the browser that a file is returned, with its name : $filename.csv
        header("Content-disposition: attachment; filename=$filename.csv");
        // Tells to the browser that the content is a csv file
        header("Content-Type: text/csv");
     
        // I open PHP memory as a file
        $fp = fopen("php://output", 'w');
     
        // Insert the UTF-8 BOM in the file
        fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
     
        // I add the array keys as CSV headers
        fputcsv($fp,array_keys($donnees[0]),$delimiter,$enclosure);
     
        // Add all the data in the file
        foreach ($donnees as $fields) {
            fputcsv($fp, $fields,$delimiter,$enclosure);
        }
     
        // Close the file
        fclose($fp);
     
        // Stop the script
        die();
    }
    ?>

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Bonjour,

    Vous devez prendre conscience qu'on doit séparer les choses afin de mieux les organiser.

    Dans un premier temps vous devez faire en sorte de pouvoir envoyer le résultat de votre requête dans votre function export_data_to_csv()
    la façon la plus simple est de recommencé votre requête sql une deuxième fois (une fois pour l'affichage et une fois pour le csv).
    Comme votre fonciton csv renvoie vers un php:output , le fichier que vous pourriez appelé ne sera pas affiché, mais vous aurez à la place la possibilité d'ouvir le fichier csv créer.

    En d'autre terme :

    1 : créer un lien dans votre page ou vous lister visuellement avec en paramettre de ce lien : $_POST['r_corps']
    2. créer un fichier qui va refaire la requête
    3. inclure dans ce nouveau fichier votre fonction csv
    4. passer en premier paramètre le résultat de votre requête sql dans la fonction csv
    5. normalement un fichier à l’ouverture vous sera proposé.

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut
    Bonjour MaitrePylos,
    Merci pour votre réponse. Je teste et reviens poster le résultat.
    Evelyne

  4. #4
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut
    re bonjour,
    Je reviens vers vous car je n'arrive toujours pas au résultat souhaité après des heures d'effort.
    Ce que j'ai fait en suivant les conseils de MaitrePylos :
    Dans mon 1er fichier (code posté tout à l'heure) :
    - j'ai transformé ma variable $_POST['r_corps'] en $_SESSION['r_corps'] pour pouvoir l'utiliser sur une autre page
    - j'ai mis un lien vers un nouveau fichier "trait_rech_corps_export_csv"
    C'est OK de ce côté là.

    Dans le nouveau fichier :
    j'ai dupliqué la requête sql et recopié la fonction en lui donnant en 1er paramètre le résultat de ma requête ($donnees)
    - un var_dump de $donnees me donne bien les résultats attendus
    - mais rien d'autre, pas trace d'un fichier csv. Si j'enlève le var_dump j'obtiens une page blanche
    - avec le message d'ereur suivant :
    AH01071: Got error 'PHP message: PHP Fatal error: Cannot redeclare export_data_to_csv() (previously declared in /public_html/trait_rech_corps_export_csv.php:34) in /public_html/trait_rech_corps_export_csv.php on line 34', referer: https://traces-membres.univ-tlse2.fr...rech_corps.php
    La ligne 34 c'est la ligne d'appel de ma fonction et je ne vois pas où elle aurait été déclarée avant. J'ai vérifié sur le 1er fichier. Ci-dessous le code complet de ce 2ème fichier.

    Auriez vous une piste SVP ? Merci par avance.
    Evelyne

    trait_rech_corps_export_csv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
    if( empty(session_id()) ){ session_start(); }
    error_reporting(E_ALL);
     
    $base = include './include/connect.inc.php';
    //include('./include/fonctions.inc.php');
     
    // on teste la déclaration de l'envoi du formulaire de recherche
    //if (isset($_SESSION['r_corps']) ) 
    //{
     
    $resultat = $base->query('
    SELECT 
        m.`nom`, 
        m.`prenom`,  
        s.`corps`,
        i.`nom_institut`     
    FROM 
        MEMBRE m 
        INNER JOIN STATUT s ON s.`ID_statut` = m.`ID_statut`
        INNER JOIN INSTITUT i ON i.`ID_institut` = s.`ID_institut`
    WHERE
        s.`corps` = "'.$_SESSION['r_corps'].'"
    ORDER BY
        m.`nom`		
    ') or die($mysqli->error.__LINE__);
     
    while($donnees = $resultat->fetch()) {	
     
    //echo 'var_dump variable donnees : <br>';
    //var_dump($donnees);
    //}
     
    function export_data_to_csv($donnees,$filename='export_corps__csv',$delimiter = ';',$enclosure = '"')
    {
     
        // Tells to the browser that a file is returned, with its name : $filename.csv
        header("Content-disposition: attachment; filename=$filename.csv");
        // Tells to the browser that the content is a csv file
        header("Content-Type: text/csv");
     
        // I open PHP memory as a file
        $fp = fopen("php://output", 'w');
     
        // Insert the UTF-8 BOM in the file
        fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
     
        // I add the array keys as CSV headers
        fputcsv($fp,array_keys($donnees[0]),$delimiter,$enclosure);
     
        // Add all the data in the file
        foreach ($donnees as $fields) {
            fputcsv($fp, $fields,$delimiter,$enclosure);
        }
     
        // Close the file
        fclose($fp);
     
        // Stop the script
        die();
    //fermeture fonction export
    }
     
    //fermeture isset haut de page
    //} 
    $resultat->closeCursor(); // Termine le traitement de la requête	
     
    ?>

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Évelyne,

    on ne peut pas déclarer une fonction dans une boucle (while).

    Si on reprends tes 1ers codes (1er message), il n'y a pas grand chose à changer.

    1- Pour être sûr d'inclure UNE SEULE FOIS les fonctions, on utilise include_once (ou require_once) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once('./include/fonctions.inc.php');
    2- La fonction export_data_to_csv() attend un array contenant TOUTES les données.
    On va simplement remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	while($donnees = $resultat->fetch()) {
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $donnees_all = $resultat->fetchAll(); // TOUTES les lignes de données
    	foreach( $donnees_all as $donnees ) {
    3- On peut alors utiliser cet array $donnees_all dans la fonction.
    Après la boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export_data_to_csv($donnees_all);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export_data_to_csv($donnees_all, 'export_csv'); // on peut ici (re)définir le nom du fichier csv

  6. #6
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Par défaut
    Bonsoir jreaux62,
    Merci beaucoup pour ces corrections bien expliquées. J'ai testé et ça avance.
    SI, j'ai bien compris : j'ai abandonné la solution de MaitrePylos : un lien du 1er vers un 2nd fichier qui contenait juste une seconde fois la requête et la fonction.
    Je suis revenue à un seul fichier de traitement du formulaire de recherche (code de mon 1er message) et un fichier qui contient la fonction.
    Dans le code de la fonction, j'ai juste remplacé 3 fois $donnees par $donnees_all.
    Dans le fichier de traitement j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once('./include/fonctions.inc.php');
    en début de code.
    J'ai fait la requête sql et la boucle foreach pour afficher les résultats sous forme de liste sur une page. C'est OK.
    Après fermeture de cette boucle, j'ai appelé la fonction. Toutes les données s'affichent en double sous la liste à la suite sans organisation, séparées par des ";" et encadrées par des " ".
    Je suis sûre que mon erreur est stupide mais je ne vois pas ?
    Merci par avance pour une piste.
    Evelyne

    Nouveau code, seulement à partir de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
    $resultat = $base->query('
    SELECT 
        m.`nom`, 
        m.`prenom`,  
        s.`corps`,
        i.`nom_institut`     
    FROM 
        MEMBRE m 
        INNER JOIN STATUT s ON s.`ID_statut` = m.`ID_statut`
        INNER JOIN INSTITUT i ON i.`ID_institut` = s.`ID_institut`
    WHERE
        s.`corps` = "'.$_SESSION['r_corps'].'"
    ORDER BY
        m.`nom`		
    ') or die($mysqli->error.__LINE__);
     
    	$donnees_all = $resultat->fetchAll(); // TOUTES les lignes de données
    	foreach( $donnees_all as $donnees ) {	
     
    	$nom = $donnees['nom'];
    	$prenom = $donnees['prenom'];
    	$corps = $donnees['corps'];
    	$institut = $donnees['nom_institut'];
     
    //echo 'var_dump variable donnees : <br>';
    //var_dump($donnees);	
    ?>
     
    <div class="container">
    <div class="row">
    <div class="col-lg-12 col-md-12 col-sm-12">
     
    <div class="table-responsive">
    <table class="table">
    	<tr class="tab1">
            <td class="tab1">Données enregistrées :
     
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nom, prénom&nbsp;: <font color="#993333"><?php echo $nom; ?> <?php echo $prenom; ?></font>
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;corps&nbsp;: <font color="#993333"><?php echo $corps; ?></font>
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;institut&nbsp;: <font color="#993333"><?php echo $institut; ?></font>
            </td>   
     
            <td class="tab2">
            <br>
    		<a href="page_membre.php?
            nom=<?php echo $nom; ?>&prenom=<?php echo $prenom; ?>&corps=<?php echo $corps; ?>&institut=<?php echo $institut; ?> ">
            <span class ="bouton_voir">Voir la page&nbsp;&nbsp;<span class="glyphicon glyphicon-eye-open"></span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            </td>
    	</tr>
    </table>
     
    </div> 
    <hr width='75%' color='maroon'>
     
    <br>
    </div></div></div></div></div></div></div>
     
    <?php 
    //fermeture boucle foreach
    }
     
    export_data_to_csv($donnees_all);
     
    //fermeture isset du début
    }
     
    $resultat->closeCursor(); // Termine le traitement de la requête	
     
    include('./include/footer.php');
    ?>
    </body>
     
    </html>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Gestion de requête par une fonction php
    Par nicerico dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/03/2008, 11h29
  2. Réponses: 6
    Dernier message: 07/06/2007, 14h27
  3. [PHP-JS] Affichage par une fonction js
    Par Mathieu72 dans le forum Langage
    Réponses: 6
    Dernier message: 20/01/2007, 16h50
  4. Réponses: 7
    Dernier message: 31/08/2006, 09h41
  5. [SQL] php et recuperation d'une valeur renvoyée par une fonction sql
    Par highman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2006, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo