Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 13h38   #1
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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 :
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
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h43   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Par défaut ajout code

pourquoi t'utilises pas fputcsv ?
utilise aussi direct tmpfile


juste ca suffis

Code :
1
2
3
4
5
6
$handle = tmpfile();
 
while($ligne = $sth->fetch(PDO::FETCH_ASSOC))
{
    fputcsv($handle, $ligne, ';');
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h51   #3
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
Citation:
utilise aussi direct tmpfile
Comment veux tu que j'utilise directement tmpfile?
Je suis bien obligé de faire
Code :
$handle = fopen($tmpFile, "w");
pour pouvoir écrire dans le fichier.
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h55   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par Nheil Voir le message
Comment veux tu que j'utilise directement tmpfile?
Je suis bien obligé de faire
Code :
$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 :
1
2
3
4
5
function tmpfile() {
    $tmp = tempnam(sys_get_temp_dir());
    $handle = fopen($tmp, 'w+');
    return $handle;
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h59   #5
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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é'
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h02   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h11   #7
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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 :
1
2
3
4
while($i < count($tabFile)){
    echo $tabFile[$i];
    $i++;
}
Le fichier étant renommé en entête par

Code :
1
2
3
 
header("Content-Type: application/csv-tab-delimited-table");
header("Content-disposition: filename=export.csv");
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h17   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
donc a quoi sert on fichier temporaire ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h21   #9
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
Je récupère toute les informations dans mon $handle

ensuite via
Code :
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.
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h24   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h36   #11
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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.
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h38   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h40   #13
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
Code :
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 :
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;
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h42   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
montre aussi a quelle niveau tu fais on header
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h46   #15
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
Citation:
montre aussi a quelle niveau tu fais on header
Je n'ai pas compris ce que tu voulais ?
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 14h46   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
suivant ce que t'as fais ca donne juste ca :

Code :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 15h00   #17
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 15h10   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 15h13   #19
Futur Membre du Club
 
Inscription : mars 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2010
Messages : 105
Points : 18
Points : 18
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.

Citation:
Par contre de ce fait la, je perd les noms des colonnes dans mon csv
Nheil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 15h19   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
1
2
3
4
while($ligne = $sth->fetch(PDO::FETCH_ASSOC))
{
    fputcsv($handle, $ligne, ';');
}
tu fais
Code :
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));
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h30.


 
 
 
 
Partenaires

Hébergement Web