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

Langage PHP Discussion :

Recherche de solution concernant un export CSV [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut Recherche de solution concernant un export CSV
    Bonjour à tous,

    Je rencontre un souci sur un export CSV.
    J'utilise ma fonction sur de nombreux export et fonctionne dans tout les cas,
    sauf 1 seul, lorsque je dois exporter plus de 12000 lignes.

    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
     
     
    // On crée le fichier temp et on l'ouvre en écriture
    		$tmpFile = tempnam('/tmp', 'ExtractionAbonnement--');
    		$handle = fopen($tmpFile, "w");
     
    		// On récupère chaque ligne du résultat
    		$colonne = 0;
    		while($ligne = $sth->fetch(PDO::FETCH_ASSOC)){
    			// On écrit la ligne des colonnes
    			if($colonne == 0){
    				foreach($ligne as  $col => $val){
    					// On écrit une ligne de resultat
    					fwrite($handle, "$col;");
    				}
    				fwrite($handle, "\n");
    				$colonne = 1;
    			}
     
    			// On écrit une ligne de resultat
    			foreach($ligne as  $col => $val){	
    				$val = FormatExport($val);
    				fwrite($handle, "$val;");
    			}
    			fwrite($handle, "\n");
    		}
     
    		//echo $handle;
     
    		// On transfère le contenu du fichier dans un tableau
    		$tabFile = file($handle);
                    //$tabFile = fgets($handle,16384);
    		//$tabFile = fgets($tmpFile);
    		// On parcours le tableau
    		 $i=0;
    		while($i < count($tabFile)){
    			echo $tabFile[$i];
    			$i++;
    		} 
    		//copy($tmpFile,"/tmp/exportAbo.csv");
    		// On ferme et détruit le fichier
    		fclose($handle);
    		unlink($tmpFile);
    Le fichier est correctement créé et rempli dans le dossier /tmp, mais ne s'ouvre pas, contrairement aux autres cas d'utilisation.
    Cette même fonction fonctionne lorsque je réduis le nombre de valeur utilisée en dessous de 12000 lignes.

    J’espère avoir été clair dans mon explication.

    Nheil

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut ajout code
    pourquoi t'utilises pas fputcsv ?
    utilise aussi direct tmpfile


    juste ca suffis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $handle = tmpfile();
     
    while($ligne = $sth->fetch(PDO::FETCH_ASSOC))
    {
        fputcsv($handle, $ligne, ';');
    }

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    utilise aussi direct tmpfile
    Comment veux tu que j'utilise directement tmpfile?
    Je suis bien obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $handle = fopen($tmpFile, "w");
    pour pouvoir écrire dans le fichier.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Nheil Voir le message
    Comment veux tu que j'utilise directement tmpfile?
    Je suis bien obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $handle = fopen($tmpFile, "w");
    pour pouvoir écrire dans le fichier.

    non tmpfile te revoie direct la ressource, lis bien la doc

    tmpfile ca reviens a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function tmpfile() {
        $tmp = tempnam(sys_get_temp_dir());
        $handle = fopen($tmp, 'w+');
        return $handle;
    }

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    Mais comment expliques tu que l'ensemble de mon code fonctionne, sauf dans le cas ou je retourne plus de 12000 lignes ?

    Comme expliqué précédemment le fichier est bien créé dans /tmp, même avec 12000 lignes, mais l'ouverture ne fonctionne pas, 'la page n'a pas été trouvé'

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Nheil Voir le message
    Mais comment expliques tu que l'ensemble de mon code fonctionne, sauf dans le cas ou je retourne plus de 12000 lignes ?

    Comme expliqué précédemment le fichier est bien créé dans /tmp, même avec 12000 lignes, mais l'ouverture ne fonctionne pas, 'la page n'a pas été trouvé'
    peu etre pas asser de memoire, commence a ecrire ton code en plus simple et plus propre, par exemple a quoi sert ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tabFile = file($handle);
    //$tabFile = fgets($handle,16384);
    //$tabFile = fgets($tmpFile);
    // On parcours le tableau
    $i=0;
    while($i < count($tabFile)){
        echo $tabFile[$i];
        $i++;
    }
    tu creer un fichier, tu le ferme et tu le reouvre pour allé prendre les meme information que t'as insérer plus haut ???

    EDIT : de plus tu fait file($handle) alors que file attendre le nom du fichier et pas une ressource ? t'es sur d'avoir les erreurs d'active sur ton PHP ?

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    Le fichier csv est généré en live dans le fichier.
    J'appelle mon exportCSV.php d'une autre page, avec des paramètres.
    J'appelle une procédure stockée qui me retourne des informations et je les écris dans le fichier via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($i < count($tabFile)){
        echo $tabFile[$i];
        $i++;
    }
    Le fichier étant renommé en entête par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    header("Content-Type: application/csv-tab-delimited-table");
    header("Content-disposition: filename=export.csv");

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    donc a quoi sert on fichier temporaire ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    Je récupère toute les informations dans mon $handle

    ensuite via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tabFile = file($handle); $i=0;
    		while($i < count($tabFile)){
    			echo $tabFile[$i];
    			$i++;
    		}
    J'affiche l'ensemble des lignes dans mon fichier.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est bien ce que je dis tu fais les choses plusieurs fois, ton but c'est juste d'envoyer un fichier au navigateur ? ou tu veux aussi l'enregistrer dans un dossier ?

    ton en tete n'est pas bonne aussi : application/csv-tab-delimited-table, il est pas limiter par des tabulation mais par un point virgule

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    Le but c'est que le fichier soit proposer en enregistrement dans le navigateur.
    Si le fichier n'est pas présent dans le serveur ce n'est pas un souci.


    Concernant l'en-tête, ça fonctionne bien pourtant, j'avais récupéré ça sur le net.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Nheil Voir le message
    Le but c'est que le fichier soit proposer en enregistrement dans le navigateur.
    Si le fichier n'est pas présent dans le serveur ce n'est pas un souci.


    Concernant l'en-tête, ça fonctionne bien pourtant, j'avais récupéré ça sur le net.
    montre ton code complet, y'a plein de truc a supprimer la

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    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
    <?php 
     
    include ('../../include.php');
     
    // Vérification de l'existance d'une session
    VerifSession();
     
    // Récupération des paramètres
    $module = $_GET['module'];
    $req 	= '';
     
    // Vérification des droits de l'utilisateur
    VerifDroit($module);
     
    header("Content-Type: application/csv-tab-delimited-table");
    header("Content-disposition: filename=export.csv");
     
    // Connexion à la base de donnée
    $dbh = ConnectDB();
     
    // Récupération des paramètres selon l'export
    switch($module){
    	case 'ABONNEMENT':
    		$dept	 		= addquote($_GET['dept']);
    		$fai 			= addquote($_GET['fai']);
    		$rechAbo		= addquote($_GET['rechAbo']);
    		$rechCommune	= addquote($_GET['rechCommune']);
    		$rechSiteClient	= addquote($_GET['rechSiteClient']);
    		$rechCLS		= addquote($_GET['rechCLS']);
    		$rechRefExterne	= addquote($_GET['rechRefExterne']);
    		$rechPOP		= addquote($_GET['rechPOP']);
    		$sort			= addquote($_GET['sort']);
    		$dir			= addquote($_GET['dir']);
    		$req 			= "EXEC sp_Extranet_GetListeAbonnements '$dept', '$fai', '$rechAbo', '$rechCommune', '$rechSiteClient', '$rechCLS', '$rechRefExterne', '$rechPOP', NULL, 10000, '$sort', '$dir', 1";
     
    		// Execution de la requête
    		$sth = $dbh->query($req);
     
    		// On crée le fichier temp et on l'ouvre en écriture
    		$tmpFile = tempnam('/tmp', 'extractTESTCSV');
    		$handle = fopen($tmpFile, "w");
     
    		// On récupère chaque ligne du résultat
    		$colonne = 0;
    		while($ligne = $sth->fetch(PDO::FETCH_ASSOC)){
    			// On écrit la ligne des colonnes
    			if($colonne == 0){
    				foreach($ligne as  $col => $val){
    					// On écrit une ligne de resultat
    					fwrite($handle, "$col;");
    				}
    				fwrite($handle, "\n");
    				$colonne = 1;
    			}
     
    			// On écrit une ligne de resultat
    			foreach($ligne as  $col => $val){	
    				$val = FormatExport($val);
    				fwrite($handle, "$val;");
    			}
    			fwrite($handle, "\n");
    		}
     
    		// On transfère le contenu du fichier dans un tableau
    		$tabFile = file($handle);
    		$tabFile = file($tmpFile);
    		// On parcours le tableau
    		$i=0;
    		while($i < count($tabFile)){
    			echo $tabFile[$i];
    			$i++;
    		}
     
    		// On ferme et détruit le fichier
    		fclose($handle);
    		unlink($tmpFile);
    	break;
    }
     
    ?>
    J'ai d'autres Case dans ma page, mais ca ne correspond pas à mon souci actuel.
    Cette page est appelée de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    window.location = 	'data/commun/exportCSV2.php?module=ABONNEMENT&dept=' + dept + '&fai=' + fai + '&rechAbo=' + rechAbo + 
    													'&rechCommune=' + rechCommune + '&rechSiteClient=' + rechSiteClient + '&rechCLS=' + rechCLS + 
    													'&rechRefExterne=' + rechRefExterne + '&rechPOP=' + rechPOP + '&sort=' + sort + '&dir=' + dir;

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    montre aussi a quelle niveau tu fais on header

  15. #15
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    montre aussi a quelle niveau tu fais on header
    Je n'ai pas compris ce que tu voulais ?

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    suivant ce que t'as fais ca donne juste ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $handle = tmpfile();
     
    while($ligne = $sth->fetch(PDO::FETCH_ASSOC))
    {
        fputcsv($handle, $ligne, ';');
    }		
     
    header("Content-Type: application/csv-tab-delimited-table");
    header("Content-disposition: filename=export.csv");
    rewind($handle);
    fpassthru($handle);

  17. #17
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    Ca fonctionne ! tu saurais me dire si je risque de rencontrer à nouveau le problème ?

    En gros est-ce qu'il existe une limite à ce type d'export?

    Par contre de ce fait la, je perd les noms des colonnes dans mon csv

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Nheil Voir le message
    Ca fonctionne ! tu saurais me dire si je risque de rencontrer à nouveau le problème ?

    En gros est-ce qu'il existe une limite à ce type d'export?
    normalement non la seul limiter serai le temps d'exécution, je te conseil aussi de mettre la tailler du fichier dans ton header, tu peux la récupérer comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $infos = stream_get_meta_data($handle);
    $size = filesize($infos['uri']);
     
    header("Content-Type: application/csv-tab-delimited-table");
    header("Content-Disposition: filename=export.csv");
    header("Content-Length: " . $size);
     
    rewind($handle);
    fpassthru($handle);

  19. #19
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 105
    Par défaut
    J'avais fait un petit edit, je ne sais pas si tu l'as vu.
    Je me permet de quote mon post précédent.

    Par contre de ce fait la, je perd les noms des colonnes dans mon csv

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Nheil Voir le message
    J'avais fait un petit edit, je ne sais pas si tu l'as vu.
    Je me permet de quote mon post précédent.

    voila :
    a la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while($ligne = $sth->fetch(PDO::FETCH_ASSOC))
    {
        fputcsv($handle, $ligne, ';');
    }
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $ligne = $sth->fetch(PDO::FETCH_ASSOC)
     
    fputcsv($handle, array_keys($ligne), ';');
     
    do
    {
        fputcsv($handle, $ligne, ';');
    }
    while($ligne = $sth->fetch(PDO::FETCH_ASSOC));

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2006, 08h06
  2. Export CSV
    Par LeCaméléon dans le forum XMLRAD
    Réponses: 3
    Dernier message: 18/04/2006, 15h32
  3. [EXPORT] CSV
    Par sleepy2002 dans le forum Oracle
    Réponses: 2
    Dernier message: 03/04/2006, 11h14
  4. Export CSV
    Par lapartdombre dans le forum Documents
    Réponses: 12
    Dernier message: 17/10/2005, 15h46
  5. Export CSV de champs qui contiennent des ";"
    Par boteha dans le forum Outils
    Réponses: 4
    Dernier message: 19/09/2005, 20h05

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