OVH Cloud OVH Cloud

Creation de fichier xls

12 réponses
Avatar
foulon.cecile
Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c:\ de
l'utilisateur (donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:\\comptage_naissance.txt", "w");

J'obtient le message d'erreur suivant :
"Warning: fopen(c:\comptage_naissance.txt): failed to open stream:
Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"

Est-ce que quelqu'un a une idée parce que là je sature !!!

Merci d'avance,
Cilou

10 réponses

1 2
Avatar
Olivier Miakinen

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).
^^^^^^^^^^^^^

Même si PHP s'exécutait sur la machine de l'utilisateur au lieu de
s'exécuter sur le serveur, rien ne dit que ledit utilisateur aura
toujours un disque nommé « c: », ni que les chemins sur sa machine
s'écrivent avec des « », et encore moins qu'il a le droit d'écriture
là où tu veux écrire quelque chose.

Mais bon, de toute façon la question ne se pose pas puisque le script
PHP s'exécute sur le serveur. C'est donc toi qui peux savoir si un tel
chemin signifie quelque chose sur le serveur où se trouve ton script.

Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"


Bah, à tous les coups le serveur est un Unix, et il a essayé de
créer un fichier nommé c:comptage_naissance.txt sous le répertoire
/home/3181265985/www/web/jc2/export/, c'est-à-dire un fichier
nommé /home/3181265985/www/web/jc2/export/c:comptage_naissance.txt !

Est-ce que quelqu'un a une idée parce que là je sature !!!


Ben oui. Reviens aux bases, rappelle-toi comment fonctionne PHP, et cela
devrait aller mieux.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
venerzen
Hello,

Ben tu ne peux pas ouvir un fichier comme ça sur le poste d'un client à
partir d'un script en php. Là il te fait une erreur parceque tu veux ouvrir
un fichier à la racine du disque c de ton serveur.

Si tu veux que ton client télécharges le fichier que tu génères via php,
il te faut plutôt avoir recour à ce genre de pratiques :
http://www.lephpfacile.com/tips/index.php?p.

VenerZen

a écrit dans le message de news:

Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:comptage_naissance.txt", "w");

J'obtient le message d'erreur suivant :
"Warning: fopen(c:comptage_naissance.txt): failed to open stream:
Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"

Est-ce que quelqu'un a une idée parce que là je sature !!!

Merci d'avance,
Cilou


Avatar
Bruno Desthuilliers
wrote:
Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur


Sur quoi ? Y pas de "disque c:", sur aucune de mes machines
(PC/Gnu-linux et Mac/OS-X).


(donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:comptage_naissance.txt", "w");


Tu réalises *bien sûr* que le code PHP s'exécute sur le *serveur*, pas
sur le *client* ???

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Denis Beauregard
Le 26 Jun 2006 13:12:18 GMT, écrivait dans
fr.comp.lang.php:

Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:comptage_naissance.txt", "w");

J'obtient le message d'erreur suivant :
"Warning: fopen(c:comptage_naissance.txt): failed to open stream:
Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"

Est-ce que quelqu'un a une idée parce que là je sature !!!


Une fois résolu la partie 1 (fopen("comptage_naissance.txt", "w");),
il restera la 2e partie du problème à résoudre, soit de s'assurer
qu'on a le droit d'écrire à cet endroit. La solution est alors de
trouver le répertoire temporaire du serveur et d'y écrire le fichier
avec la syntaxe appropriée, par exemple fopen("/tmp/81jh324.txt"...
Mais j'aurais une préférence pour écrire directement dans une page
web...


Denis

Avatar
Bruno Desthuilliers
Denis Beauregard wrote:
Le 26 Jun 2006 13:12:18 GMT, écrivait dans
fr.comp.lang.php:

(snip)

je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).



(snip)

il restera la 2e partie du problème à résoudre, soit de s'assurer
qu'on a le droit d'écrire à cet endroit.


(snip)

Denis, je crains que quelque chose ne t'ai échappé : l'OP espère écrire
directement sur le disque du client !-)


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
didier
Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:comptage_naissance.txt", "w");

J'obtient le message d'erreur suivant :
"Warning: fopen(c:comptage_naissance.txt): failed to open stream:
Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"

Est-ce que quelqu'un a une idée parce que là je sature !!!

Merci d'avance,
Cilou
Réponse de débutant à une débutante (supposée) (les autres sont trop

forts pour moi).
Comme PHP s'éxécute sur le serveur il ne peut pas écrire sur le disque
du client.
Il faut donc que tu écrives ton fichier sur le serveur, ensuite que tu
fasses une page web avec un lien a href ... vers ce fichier.
Quand l'utilisateur cliquera sur ce lien, son système d'exploitation lui
proposera d'ouvrir ou d'enregistrer ce fichier; il pourra choisir de
l'enregistrer là où il veut, et ensuite de l'ouvrir avec un tableur pour
tracer des graphiques, etc ...
Est-ce que c'est clair ? Parce que j'ai un peu galéré avant de trouver
tout ce chemin, et je comprends que cela ne soit pas évident.
A suivre ...
Didier.

Avatar
Denis Beauregard
Le 26 Jun 2006 17:28:01 GMT, Bruno Desthuilliers
écrivait dans fr.comp.lang.php:

Denis Beauregard wrote:
Le 26 Jun 2006 13:12:18 GMT, écrivait dans
fr.comp.lang.php:

(snip)

je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).



(snip)

il restera la 2e partie du problème à résoudre, soit de s'assurer
qu'on a le droit d'écrire à cet endroit.


(snip)

Denis, je crains que quelque chose ne t'ai échappé : l'OP espère écrire
directement sur le disque du client !-)


Ça, j'avais vu (si, si). Mais comme on sait tous (et d'autres l'ont
rappelé dans leur message que je n'ai pas voulu répéter), c'est
impossible d'écrire directement sur le fichier du client, du moins
avec un fopen.

J'ai voulu proposer une solution réalisable par la personne qui a
posé la question au lieu de seulement dire que ce n'était pas
faisable comme envisagé initialement. J'ai essayé aussi de prévoir
le première piège, soit d'écrire sur le serveur à un endroit où ce
serait interdit.


Denis



Avatar
1 connue
Si tu veux enregistrer un fichier sur le poste client, il faut executer du
code sur le client donc c'est pas du PHP mais eventuellement une applet Java
Pierre
a écrit dans le message de news:

Bonjour,

J'ai un site qui fait des comptages sur des bases de données.
J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).

Ainsi, voici ma première ligne de code qui ne fonctionne pas (après
ce sont celles d'écriture, logik :D) :
$mon_fichier = fopen("c:comptage_naissance.txt", "w");

J'obtient le message d'erreur suivant :
"Warning: fopen(c:comptage_naissance.txt): failed to open stream:
Permission denied in
/home/3181265985/www/web/jc2/export/export_naissance.php on line 147"

Est-ce que quelqu'un a une idée parce que là je sature !!!

Merci d'avance,
Cilou


Avatar
Bruno Desthuilliers
didier wrote:

(snip)

J'obtient un résultat sous la forme d'un tableau que je voudrais
exporter sous Excel en l'enregistrant sur le disque c: de
l'utilisateur (donc le fichier n'existe pas au préalable).



(snip)

Comme PHP s'éxécute sur le serveur il ne peut pas écrire sur le disque
du client.
Il faut donc que tu écrives ton fichier sur le serveur, ensuite que tu
fasses une page web avec un lien a href ... vers ce fichier.


Ou plus simplement écrire directement ce tableau dans la réponse HTTP.

$results = LaFonctionQuiRetourneLesStats();
$lines = '';

$linebreak = "rn";
$sep = ";"

foreach($results as $parts) {
$lines .= implode($sep, $parts) . $linebreak;
}

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Length: ' . strlen($lines));
header("Content-Disposition: attachment; filename="stats.csv"");
echo $lines;
exit();

NB : préciser le header Content-Type permet au client, le cas échéant,
d'ouvrir directement le contenu avec l'appli appropriée.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Bruno Desthuilliers
1 connue wrote:
Si tu veux enregistrer un fichier sur le poste client, il faut executer du
code sur le client donc c'est pas du PHP mais eventuellement une applet Java


ou : pourquoi se compliquer la vie à faire simple alors qu'il est si
simple de faire compliqué. D'autant que même une applet java ne peut pas
accéder comme ça au filesystem du poste client (encore heureux...).

Et un candidat pour le DailyWTF, un !

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

1 2