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

  1. #1
    Membre régulier
    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
    Points : 92
    Points
    92
    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 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    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 régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Bonjour MaitrePylos,
    Merci pour votre réponse. Je teste et reviens poster le résultat.
    Evelyne

  4. #4
    Membre régulier
    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
    Points : 92
    Points
    92
    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 régulier
    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
    Points : 92
    Points
    92
    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>

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Evelyne31 Voir le message
    Je suis sûre que mon erreur est stupide mais je ne vois pas ?
    "N'est stupide que la stupidité."
    film Forrest Gump
    En fait, je viens seulement de remarquer que la fonction ne se contente pas de créer le fichier csv.
    Elle l'affiche aussi (header....)

    Pour bien faire, il faudrait SÉPARER la "création" de l"affichage".

    1- Création du fichier 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
    <?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 create_export_data_to_csv($donnees,$filename='export_csv',$delimiter = ';',$enclosure = '"')
    {
        // 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);
    }
    ?>
    2- Affichage du lien pour téléchargement du fichier CSV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/export_csv.csv">Télécharger le Fichier (CSV)</a>
    3- On peut aussi afficher le fichier dans une page fichier_csv.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/fichier_csv.php?filename=<?php echo 'export_csv.csv'; ?>">Afficher / Télécharger le Fichier (CSV)</a>
    et fichier_csv.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $filename = $_GET['filename'];
    // 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");
     
    file_get_contents($filename);
    (pas testé..)
    Dernière modification par Invité ; 28/02/2020 à 09h39.

  8. #8
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Merci jreaux62, je progresse toujours grâce à tes explications mais je n'arrive toujours pas au résultat souhaité.
    Merci également pour la citation Forrest Gump, elle remonte le moral.
    J'ai repris méthodiquement.
    1 et 2.
    - Création du fichier CSV : j'ai remplacé le code du fichier "fonction.inc.php" par le tien.
    - Affichage du lien pour le téléchargement du fichier CSV : je l'ai intégré dans le fichier de traitement de la recherche qui affiche les résultats sous forme de liste.
    Résultat : message d'erreur "Not Found The requested URL /export_csv.csv was not found on this server."

    3.
    J'ai testé également l'affichage du fichier dans une autre page fichier_csv.php
    Même message d'erreur que précédemment.

    Résumé : j'ai à présent 2 liens sur mon fichier de traitement du formulaire de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <a href="/export_csv.csv">Télécharger le Fichier (CSV)</a>
    <a href="/export_csv.csv?filename=<?php echo 'export_csv.csv'; ?>">Voir le Fichier (CSV)</a>
    Les 2 renvoient le même message d'erreur. Je comprends que le fichier csv n'est pas créé ? Quelque chose bloque, mais quoi ?
    Merci par avance,
    Evelyne

  9. #9
    Invité
    Invité(e)
    Par défaut
    OK...
    On en reparle demain, OK ?
    Avec les idées plus claires...

    N.B. A voir : le chemin (relatif ou absolu) vers le fichier csv ?

  10. #10
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Merci pour cette réponse, je suis contente de faire une pause.
    Très bonne soirée,
    Evelyne

  11. #11
    Invité
    Invité(e)
    Par défaut
    Oups... C'est moi qui m'étais trompé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/fichier_csv.php?filename=<?php echo 'export_csv.csv'; ?>">Afficher / Télécharger le Fichier (CSV)</a>
    As-tu vérifié que le fichier csv existe physiquement ?
    Ensuite, il faut vérifier que le chemin est correct.

  12. #12
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Bonjour,
    Merci de te pencher à nouveau sur mon problème. C'est mieux, j'ai bien une fenêtre qui s'ouvre en me proposant de voir/télécharge le fichier. J'ai vérifié, il est bien créé dans mon dossier de téléchargement, il s'ouvre avec Excel, mais il est vide.
    J'ai essayé de modifier le code de la fonction : remplacer 3 fois $donnees par $donnees_all, sans succès.
    Par contre, je remarque une anomalie : lorsque s'affiche la liste des résultats, je n'ai plus le pied de page or, c'est juste avant que j'ai appelé la fonction ? Je pense que je ne l'ai pas mise au bon endroit ou mal appelée mais je ne vois pas. Je remets ci-dessous le code de cette fin de fichier.
    Je te remercie par avance si tu pouvais regarder ce qui coince.
    Très bonne journée,
    Evelyne

    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
    </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>

  13. #13
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Pour bien faire, il faudrait SÉPARER la "création" de l"affichage".
    Je veux pas paraître désagréable, mais c'est vers ça que je la dirigeais.


    On est bien d'accord, que cette ligne pointe sur un fichier , qui renvoie du vide, donc normal que le fichier Excel est vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="/fichier_csv.php?filename=<?php echo 'export_csv.csv'; ?>">Afficher / Télécharger le Fichier (CSV)</a>

  14. #14
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Bonjour MaitrePylos,
    Merci pour votre réponse. Je pense que j'ai mal compris vos explications ainsi que celles de jreaux62 car maintenant je n'ai plus qu'un fichier de traitement de la recherche par "corps".
    Le fichier fichier_csv.php n'existe pas. C'est sans doute pour cela que le fichier csv est vide ?
    Je me remets au travail, à savoir que je n'inclus plus la fonction dans le fichier de traitement mais dans fichier_csv.php que je vais créer à nouveau.
    Evelyne

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

    1- Si tu relis mon message #7, tu verras que j'ai changé le nom de la fonction : create_export_data_to_csv(...).

    Par contre, certaines choses ne vont pas. J'ai corrigé la fonction :
    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
    <?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     $datas      The table you want to export in CSV
     * @param string    $filename   The name of the file you want to export (WITH extension)
     * @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 create_export_data_to_csv($datas,$filename='export_csv',$delimiter = ';',$enclosure = '"')
    {
    	// Attention : $filename est ici indiqué SANS extension '.csv'
    	// répertoire où enregistrer le fichier
    	$csv_rep = 'csv/'; // Le dossier s'appelle ici "csv" (à toi de mettre le bon chemin)
     
    	// Ouverture du fichier
    	$fp = fopen($csv_rep.$filename.'.csv', 'w'); // on rajoute ici l'extension '.csv'
     
    	// Si le fichier a vocation a être importé dans Excel,
    	// pour corriger les problèmes d'affichage des caractères internationaux (les accents par exemple)
    	// Insert the UTF-8 BOM in the file
    	fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
     
    	// Ligne d'entête : titres des colonnes
    	fputcsv($fp,array_keys($datas[0]),$delimiter,$enclosure);
     
    	// Ajout ligne à ligne des données
    	foreach ($datas as $fields) {
    		fputcsv($fp, $fields,$delimiter,$enclosure);
    	}
     
    	// Fermeture du fichier
    	fclose($fp);
    }
    ?>
    2- Il faut donc mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php 
    //fermeture boucle foreach
    }
    // Création du fichier CSV
    $filename = 'export_csv'; // nom du fichier, SANS extension
    create_export_data_to_csv($donnees_all, $filename);
    Là, le fichier devrait se remplir.

    3- Ensuite, pour le lien, il faut indiquer le chemin correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $filename = 'export_csv'; // nom du fichier, SANS extension
    ?>
    <a href="/fichier_csv.php?filename=<?php echo urlencode($filename); ?>">Afficher / Télécharger le Fichier (CSV)</a>
    4- Puis affichage dans fichier_csv.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $filename = urldecode($_GET['filename']); // nom du fichier, SANS extension
    $csv_rep = 'csv/'; // Le dossier s'appelle ici "csv" (à toi de mettre le bon chemin)
     
    // 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");
     
    file_get_contents($csv_rep.$filename.'.csv');

  16. #16
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Super, merci jreaux62 pour ce nouveau message que j'ai suivi à la lettre.
    Juste une virgule oublié dans fichier_csv.php en ligne 10 entre les 2 variables $csv_rep,$filename. J'ai eu un message d'erreur et rectifié. Et j'ai remplacé dans le fichier de la fonction 3 fois $datas par $donnees.
    En cliquant sur le lien il m'est bien proposé :
    1 - d'ouvrir le fichier avec un choix d'application : je choisi Excel et obtiens une page blanche,
    2 - de le télécharger : j'obtiens bien un fichier nommé export_csv.csv dans mon dossier de téléchargement mais vide.
    Je n'ai aucun message d'erreur ? Je cale !
    Merci par avance pour ton aide.
    Evelyne

  17. #17
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Oubli : j'ai toujours cette anomalie d'absence du pied de page qui est inclus juste sous l'appel de la fonction ?

  18. #18
    Invité
    Invité(e)
    Par défaut
    0-
    Juste une virgule oublié dans fichier_csv.php en ligne 10 entre les 2 variables $csv_rep,$filename.
    Ce n'est pas une virgule, mais un point (concaténation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_get_contents($csv_rep.$filename.'.csv');
    j'ai remplacé dans le fichier de la fonction 3 fois $datas par $donnees.
    Ca ne sert à RIEN, puisqu'on est ici dans une fonction : les noms données aux variables sont internes à la fonction.

    j'obtiens bien un fichier nommé export_csv.csv dans mon dossier de téléchargement mais vide.
    C'est quoi, ton "dossier de téléchargement" ?

    1- Affiche les erreurs PHP (au tout début du fichier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php
    error_reporting(E_ALL); 	// en TEST !!
    2- Montre ton code.

  19. #19
    Membre régulier
    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
    Points : 92
    Points
    92
    Par défaut
    Merci encore.
    J'ai remplacé ma virgule par un point.
    J'ai remis 3 x $datas dans le code de la fonction.
    Le dossier de téléchargement : je travaille sur Mac et quand je télécharge des fichiers ils sont automatiquement enregistrés dans un dossier prévu d'origine, nommé "Téléchargements".
    J'avais déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error_reporting(E_ALL);
    en début de page du fichier de traitement de recherche.
    Je l'ai mis également en haut du nouveau fichier "fichier_csv.php".
    J'ai fait un nouvel essai : idem, page blanche sans message d'arreur.

    Le code de "traitement_recherche_corps.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
    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
    144
    145
    146
    147
    148
    149
    150
    151
     
    <?php
    if( empty(session_id()) ){ session_start(); }
    error_reporting(E_ALL);
     
    $base = include './include/connect.inc.php';
    include_once('./include/fonctions.inc.php');
     
    // on teste la déclaration de l'envoi du formulaire de recherche
    if (isset($_POST['r_corps']) ) 
    {
    $_SESSION['r_corps']=$_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 $_SESSION['r_corps']; ?></h3>
    	<h4>Exporter ce résultat en csv pour une utilisation dans un tableur : 
    <?php $filename = 'export_csv'; ?> <!-- nom du fichier, SANS extension -->
    <a href="/fichier_csv.php?filename=<?php echo urlencode($filename); ?>">Afficher / Télécharger le Fichier (CSV)</a>
    	</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` = "'.$_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>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>&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
    }
     
    create_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>

  20. #20
    Invité
    Invité(e)
    Par défaut
    Et fonctions.inc.php ?
    fichier_csv.php ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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