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. #21
    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
    Désolée, voici les codes ci-dessous.
    Autre chose, peut-être une piste : je n'avais pas accès au fichier error.log, j'ai résolu le problème. J'ai refait des essais je vois 3 erreurs :

    [Fri Feb 28 14:13:04.594018 2020] [proxy_fcgi:error] [pid 5518] [client 78.203.140.190:53770] AH01071: Got error 'PHP message: PHP Warning: include_once(./include/fonctions.inc.php): failed to open stream: No such file or directory in /public_html/trait_rech_corps.php on line 6PHP message: PHP Warning: include_once(): Failed opening './include/fonctions.inc.php' for inclusion (include_path='.:/usr/share/php') in /public_html/trait_rech_corps.php on line 6', referer: ...

    [Fri Feb 28 14:13:04.594794 2020] [proxy_fcgi:error] [pid 5518] [client 78.203.140.190:53770] AH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function create_export_data_to_csv() in /public_html/trait_rech_corps.php:139\nStack trace:\n#0 {main}\n thrown in /public_html/trait_rech_corps.php on line 139', referer: ...

    [Fri Feb 28 14:13:09.052035 2020] [proxy_fcgi:error] [pid 5466] [client 78.203.140.190:53777] AH01071: Got error 'PHP message: PHP Warning: file_get_contents(csv/export_csv.csv): failed to open stream: No such file or directory in /public_html/fichier_csv.php on line 12', referer: ...
    Pour la 1ère : je ne comprends pas, j'ai tout vérifié et ne vois pas d'anomalie ?
    Pour la 2ème : ligne 139 c'est la ligne d'appel de la fonction : create_export_data_to_csv($donnees_all); ?
    Pour la 3ème : ?

    Un grand merci de prendre le temps de regarder mes codes.
    Evelyne

    fonction_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
    <?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);
    }
    ?>
    fichier_csv.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    error_reporting(E_ALL); 	// en TEST !!
     
    $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');
    ?>

  2. #22
    Invité
    Invité(e)
    Par défaut
    Le 1er message d'erreur dit qu'il ne trouve pas le fichier à l'endroit indiqué.
    Les suivants en découlent.

    1- Dis-nous quel est l'arborescence de tes dossiers/fichiers.

    2- dans fichier_csv.php, on peut utiliser file_exists() pour vérifier l'existence du fichier.
    Là aussi, il faut bien définir le chemin.
    Dernière modification par Invité ; 28/02/2020 à 14h45.

  3. #23
    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
    J'ai vérifié le chemin d'accès pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once('./include/fonctions.inc.php');
    . Il me semble correct car c'est le même que celui du fichier de connexion à la bdd, la ligne du dessus.

    Dans le fichier "fichier_csv.php", j'ai mis les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (file_exists($filename)) {
        echo "Le fichier $filename existe.";
    } else {
        echo "Le fichier $filename n'existe pas.";
    }
    et après un nouvel essai j'ai le message d'erreur suivant en 1ère ligne du fichier Excel : "Le fichier export_csv n'existe pas."

    Mon arborescence : tous mes fichiers sont à la racine du site dans le dossier /public_html
    Les fichiers de fonctions, connexion, css, menus, head et footer... sont dans un sous-dossier nommé include. Chemin d'accès : /public_html/include
    Merci pour ton aide.
    Evelyne

  4. #24
    Invité
    Invité(e)
    Par défaut
    LOL... Tu parles de tous les fichiers... SAUF CEUX qui nous intéressent !
    Sérieusement, si tu ne donnes que des demi-informations, on ne peut pas t'aider : on ne sait pas lire dans le marc de café !

    Le fichier fonctions.inc.php est censé être dans le dossier "include" aussi.
    • Est-ce le cas ?
    • As-tu aussi vérifié les majuscules/minuscules ?
    • ... ?

    Et :
    • fichier_csv.php, il est où ??
    • le "dossier de téléchargement" ?
    • ... ?

  5. #25
    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
    Je ne comprends pas, je pensais avoir joint tout ce qu'il fallait. S'il manque des choses c'est juste que j'ai peur d'encombrer inutilement.
    Voici une capture d'écran de mon arborescence en espérant que cela convienne.
    Nom : arborescence.png
Affichages : 515
Taille : 95,7 Ko

    Oui, le fichier "fonctions.inc.php" est bien dans le dossier "include".
    J'ai bien sûr vérifié les majuscules/minuscules et je ne vois pas d'erreur mais à force d'avoir le nez dessus ...

    Le fichier "fichier_csv.php" est à la racine du site avec tous les fichiers courants.

    Le dossier "Téléchargement" est un dossier Mac présent sur l'ordi. lors de l'achat, comme "Documents", "Images" ou "Applications"... Tous les fichiers que je télécharge vont systématiquement dedans.

    Merci par avance.
    Evelyne
    Images attachées Images attachées  

  6. #26
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Evelyne31 Voir le message
    ...Tous les fichiers que je télécharge vont systématiquement dedans...
    Euhhh. Là, je crois que tu n'as pas tout compris....

    On parle ici du dossier dans lequel on va CRÉER le fichier CSV.
    Pas le télécharger...

    Donc :
    • crée un dossier "csv" dans le dossier /public_html

    C'est dans ce dossier que le fichier csv sera créé.
    Et c'est là qu'il faut vérifier s'il est bien là, et ce qu'il contient.

  7. #27
    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
    C'était évident que j'avais râté quelque chose !
    J'ai donc créé le dossier "csv" (en minuscules) à la racine du site.
    Nouveaux essais. Quand je clique sur le lien "Afficher / Télécharger le Fichier (CSV)" une fenêtre s'ouvre me proposant d'ouvrir ou de télécharger le fichier "export_csv.csv".
    Si je clique sur "télécharger", le dossier de Téléchargements/Mac s'ouvre aussitôt. Un fichier "export_csv.csv" s'y trouve et est toujours vide.
    Si je clique sur "ouvrir" je choisis Excel, le fichier "export_csv.csv" s'ouvre bien mais est vide.
    Quand au dossier "csv" il reste vide.
    J'ai vérifié le fichier "error.log" : pas d'erreur signalée.
    ???
    Merci pour votre aide.
    Evelyne

  8. #28
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Evelyne31 Voir le message
    Quand au dossier "csv" il reste vide.
    Laors le fichier n'est pas créé, ou le chemin n'est pas le bon.

    Essaie en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = 'csv/'; // Le dossier
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = './csv/'; // Le dossier
    Sinon... à toi de faire les essais nécessaires.

  9. #29
    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
    Au moins 1000 mercis jreaux62. C'était bien ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = './csv/'; // Le dossier
    A présent j'ai bien un fichier "export_csv.csv" créé dans le dossier "csv" c'est merveilleux !

    Il me reste 2 soucis à régler :
    - toutes les données sont en double.
    Les en-têtes de colonnes sont uniques, c'est OK. Puis dessous, pour chaque en-tête, il y a 2 colonnes qui se répètent avec les mêmes données.
    - le problème habituel des accents. Pourtant j'ai vérifié, le fichier est bien en UTF-8. Je l'ai importé (pas ouvert) dans Excel pour avoir des options, rien à faire.

    Mais là je pense pouvoir m'en sortir. Je reviens dès que c'est réglé pour mettre en résolu j'espère.

    "Sinon... à toi de faire les essais nécessaires." : je ne fais que ça depuis des mois pour ce site !

    Encore merci, sincèrement. Très bonne fin de journée,
    Evelyne

  10. #30
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Sinon... à toi de faire les essais nécessaires.
    Ce que j'ai voulu dire, c'est qu'il faut faire un débogage de BASE, pour éliminer les causes possibles les unes après les autres :

    • mettre des echo / var_dump() pour afficher les données, et voir ce qu'elles contiennent
    • mettre des try catch() autour des requêtes, pour intercepter/afficher les erreurs SQL
    • vérifier les noms des variables, fichiers,... (parfois, c'est juste une majuscule ou une faute de frappe !)
    • vérifier l'arborescence
    • ...


    Citation Envoyé par Evelyne31 Voir le message
    - toutes les données sont en double.
    Je sais pourquoi...

    Que ce soit avec fetch() ou fetchAll(), le "fetch_style" est par défaut PDO::FETCH_BOTH.
    Ca explique pourquoi "toutes les données sont en double" :
    PDO::FETCH_BOTH (défaut): retourne un tableau indexé par les noms de colonnes et aussi par les numéros de colonnes, commençant à l'index 0, comme retournés dans le jeu de résultats
    PDO::FETCH_ASSOC: retourne un tableau indexé par le nom de la colonne comme retourné dans le jeu de résultats
    Toi, tu dois utiliser ici PDO::FETCH_ASSOC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $donnees_all = $resultat->fetchAll(PDO::FETCH_ASSOC); // TOUTES les lignes de données
    	foreach( $donnees_all as $donnees ) {
    Important : pour ne pas être obligé de le mettre à chaque fois, tu peux CONFIGURER/modifier cette valeur "par défaut" dans le fichier de connexion SQL.
    Comme dans cet exemple.

    Ou en ajoutant cette ligne, juste après $base = include './include/connect.inc.php'; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Set the case in which to return column_names.
    $base->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    Dernière modification par Invité ; 28/02/2020 à 18h38.

  11. #31
    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
    SUPER ! merci à nouveau. Il faut savoir ce genre de chose ! Bravo, on voit les pros.
    Je connais le débogage, je suis tes conseils depuis quelques temps !
    Je me demandais bien d'où venait ces entêtes 0, 1 ...

    Il me reste à régler :
    - les accents. Pourtant UTF-8 et BOM sont bien présents dans la fonction.
    - pour obtenir le fichier "export_csv.csv" il faut que je clique sur le lien " Afficher / Télécharger le Fichier (CSV)". Je télécharge alors un fichier vide sur mon ordi. Je jette ce fichier qui ne sert à rien.
    Et je vais chercher le fichier correctement rempli qui s'est créé dans le dossier "csv" du site.
    Ce n'est pas possible pour l'utilisateur, il faut que j'améliore cela. Je vais cogiter.
    - si je recommence l'opération, le téléchargement sur mon ordi me demande de remplacer le précédent. Mais rien n'est créé à nouveau dans le dossier "csv" du site. C'est pas gagné, mais je vais tenter de faire une numérotation.
    Encore merci et bonne soirée,
    Evelyne

  12. #32
    Invité
    Invité(e)
    Par défaut
    As-tu AUSSI fait cette correction Le fichier "fichier_csv.php" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = './csv/'; // Le dossier

  13. #33
    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
    Oui, je viens de re-vérifier, c'est fait.

  14. #34
    Invité
    Invité(e)
    Par défaut
    OK.
    Allons au plus simple.

    1- On OUBLIE le fichier fichier_csv.php.
    Il ne sert à rien (car on ne peut pas afficher de fichiers CSV dans le navigateur, comme on peut le faire pour certains avec des fichiers PDF).

    2- Et on remplace le lien par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $csv_rep = './csv/'; // Le dossier s'appelle ici "csv" (à toi de mettre le bon chemin)
    $filename = 'export_csv'; // nom du fichier, SANS extension
    if( file_exists($csv_rep.$filename.'.csv') ){
    ?>
    	<a href="<?php echo $csv_rep.$filename.'.csv'; ?>">Télécharger le Fichier (CSV)</a>
    <?php } ?>
    Et là, normalement, c'est bon.

  15. #35
    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
    merci, je teste...

  16. #36
    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
    Je reviens après plusieurs essais infructueux.
    Le lien ne s'affiche pas car le fichier n'est pas créé.
    De ton nouveau code de lien, j'ai juste enlevé le point avant csv car le dossier est au même niveau que le fichier dans lequel est le lien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = '/csv/'; // Le dossier s'appelle ici "csv" (à toi de mettre le bon chemin)
    Bien sûr je n'avais pas enlevé le point lors du 1er essai : même résultat.

    Merci,
    Evelyne

  17. #37
    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
    Encore quelques essais et par miracle le fichier .csv est créé et s'ouvre bien dans Excel (importer en csv).
    Quel bonheur ! Je n'y croyais plus.
    Toujours le problème des accents mais ça je vais trouver.
    Maintenant, je vais tester pour le dernier souci : si je recommence est-ce qu'un nouveau fichier est créé, ou pas, est-ce qu'il écrase l'ancien... ?
    A suivre.
    Merci beaucoup jreaux62. Très bonne soirée,
    Evelyne

  18. #38
    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
    SUPER ! Je viens de tester à nouveau, c'est magique. J'ai fait une nouvelle recherche, j'ai cliqué sur le lien apparent qui apparaît maintenant, et à présent on ne passe plus par le dossier "csv" sur le site mais on télécharge directement sur l'ordi.
    Donc à chaque fois il est proposé d'écraser le fichier précédent du même nom.
    C'est juste GENIAL.
    Par contre, contrairement à ce que je pensais, j'ai du remettre le point pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $csv_rep = './csv/'; // Le dossier s'appelle ici "csv" (à toi de mettre le bon chemin)
    Je ne sais plus comment te dire merci jreaux62 alors MERCI.
    Demain je me consacre au règlement du problème des accents et espère bien poster résolu au plus vite.
    A nouveau très bonne soirée,
    Evelyne

  19. #39
    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,
    Avant de enfin mettre ce sujet en résolu, je tiens à remercier sincèrement jreaux62, sans oublier MaitrePylos, pour leur aide.
    Le fichier csv s'ouvre sans problème d'accentuation avec LibreOffice. Cela me convient. Le problème semble venir d'Excel sur Mac.
    Bonne continuation,
    Evelyne

  20. #40
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    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 506
    Par défaut
    Quand tu seras un cran plus loin, avec du composer et tout ça, il y a une superbe lib, qui régle la plupart des soucis https://phpspreadsheet.readthedocs.io/en/latest/

    Sinon, pour les soucis d'accent, possible d'ouvrir le fichier en UTF8 ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 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