problème assez pointu entre writeexcel et session_start()

problème assez pointu entre writeexcel et session_start() - PHP - Programmation

Marsh Posté le 16-04-2008 à 12:59:46    

Bonjour tous le monde,
Voici mon problème :
J'utilise une bibliothèque nommée WriteExcel qui permet de générer avec php des fichiers Excel. Mon code marche bien et en localhost je crée mes fichiers que ce soit sous ie ou firefox. Mais dès que je passe tout ça sur un serveur, un problème apparait : l'export se fait sans problème sous firefox mais ça fait popo sous ie : génération d'un message d'erreur : 'internet explorer n'a pas pu ouvrir ce site...'
j'ai donc chercher d'où pouvait venir l'erreur et j'ai fini pas trouver avec certitude que ça vient de la ligne de code : session_star(); que je place en début de fichier. Cette ligne me sert à récupérer mes variables donc je ne peux m'en passer. Quelqu'un aurait-il un idée de pourquoi ie lors de la génération du fichier excel ne tolère pas session_start();?
Merci d'avance!

Reply

Marsh Posté le 16-04-2008 à 12:59:46   

Reply

Marsh Posté le 16-04-2008 à 13:14:46    

personne n'a d'idée ?

Reply

Marsh Posté le 16-04-2008 à 14:31:37    

youhou...

Reply

Marsh Posté le 16-04-2008 à 14:42:07    

Salut,
 
Déjà, tu es sur un forum, donc ne t'attends pas avoir une réponse dans l'heure ou dans la journée, 24 me semble un bon délai avant de relancer :).
 
Ensuite il nous faudrait quelques détails supplémentaires que le simple message 'internet explorer n'a pas pu ouvrir ce site...' :
- Utilise des débugs pour savoir ou cela plante exactement.
- Si tu as accès aux logs du serveur, cela peut aider aussi.
- Voir le code aussi, même si on a pas besoin de toute la page.
 
De plus, je rappelle que PHP est un language serveur, donc si cela marche sur Firefox et non sur IE, je ne pense pas que cela vienne de là...


Message édité par Melendril le 16-04-2008 à 14:42:40
Reply

Marsh Posté le 16-04-2008 à 14:50:32    

poyolele a écrit :

Bonjour tous le monde,
Voici mon problème :
J'utilise une bibliothèque nommée WriteExcel qui permet de générer avec php des fichiers Excel. Mon code marche bien et en localhost je crée mes fichiers que ce soit sous ie ou firefox. Mais dès que je passe tout ça sur un serveur, un problème apparait : l'export se fait sans problème sous firefox mais ça fait popo sous ie : génération d'un message d'erreur : 'internet explorer n'a pas pu ouvrir ce site...'
j'ai donc chercher d'où pouvait venir l'erreur et j'ai fini pas trouver avec certitude que ça vient de la ligne de code : session_star(); que je place en début de fichier. Cette ligne me sert à récupérer mes variables donc je ne peux m'en passer. Quelqu'un aurait-il un idée de pourquoi ie lors de la génération du fichier excel ne tolère pas session_start();?
Merci d'avance!


cf réponse de melendril, ça n'a pas de sens, ce que tu racontes. Donne des détails.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-04-2008 à 16:49:52    

Tes cookies sur IE ne sont pas desactivés par hasard ?

Reply

Marsh Posté le 16-04-2008 à 17:26:43    


 
bah ça a rien à voir avec le session_start() [:dawa]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-04-2008 à 17:56:51    

Je connais pas WriteExcel mais si elle génére un fichier, elle utilise surement les fonctions de bufferisations php (ob_start() & co), il me semble que IE et FF ne réagisse pas toujours de la même façon avec ca et j'ai déja eu des soucis avec cette fonctionalité sur certain hébergeur.
 
Un exemple tout bête je l'avais utiliser pour le zlib et histoire de faire ca bien, je termine avec ob_end_clean(); mais cétait sans compter les hebergeurs qui inclus leur banniére de pub via le serveur. Le résultat cétait une belle page blanche purement et simplement sans aucun message d'erreur...
 
Bref, cétait juste pour la possible explication, pour la solution si tu est sur que ca viens de session_start(), tu peut surement t'en passer. tu n'as qu'a créer une page php indépendante du reste de ton script juste pour générer ton fichier.
 


Message édité par masterpsx le 16-04-2008 à 17:57:39
Reply

Marsh Posté le 16-04-2008 à 19:28:11    

voici la code, simplifier au max pour limiter les possibilités d'ereur :
 
<?php
 
error_reporting(E_ALL ^ E_NOTICE);
session_start();
set_time_limit(10);
 
require_once "writeexcel/class.writeexcel_workbook.inc.php";
require_once "writeexcel/class.writeexcel_worksheet.inc.php";
 
$fname = tempnam("/tmp", "demo.xls" );
$workbook =& new writeexcel_workbook($fname);
$worksheet =& $workbook->addworksheet('Demo');
 
 
 
 
$workbook->close();
 
header("Content-Type: application/vnd.ms-excel; name=\"example-demo.xls\"" );
header("Content-Disposition: inline; filename=\"example-demo.xls\"" );
$fh=fopen($fname, "r" );
fpassthru($fh);
unlink($fname);
 
?>
 
 
voila...
Comme je vous l'expliquait, lorsque j'enlève le "session_start" au début, l'export se passe bien, mais dès qu'il y est et bien voici le message :
"Microsoft office escel ne peut acceder au fichier "https://88.168......../excel.php".  
 
Ce que est étrange c'est que tout fonctionne en localhost par contre...

Reply

Marsh Posté le 16-04-2008 à 20:21:00    

A quoi il te sert le session_start() dans cette page ?
A mon avis il ne fait pas bon menage avec les header(), si il est vraiment indispensable, met session_write_close(); juste avant.

Reply

Marsh Posté le 16-04-2008 à 20:21:00   

Reply

Marsh Posté le 16-04-2008 à 20:36:47    

yop,
 
tu pourrais préciser les problèmes qu'il pourrait y avoir entre session_start() et les header() ? :)


---------------
oui oui
Reply

Marsh Posté le 16-04-2008 à 21:17:34    

Les 2 doivent être envoyé avant tout autre contenue, essayes un setcookie avec un session_start, tu auras probablement un problème du même genre.

Reply

Marsh Posté le 16-04-2008 à 23:42:36    

pour info, le session_start() me sert à récupérer des variables assez complexes venant d'autres pages...

Reply

Marsh Posté le 17-04-2008 à 00:01:09    

poyolele a écrit :

pour info, le session_start() me sert à récupérer des variables assez complexes venant d'autres pages...


Dans ton code y a aucune variable de session mais c'est peut être une version allégé, essaye session_write_close() alors, sinon il faudra que tu crée une page php spécifique sans rien d'autres et juste pour générer tes fichiers.

Reply

Marsh Posté le 17-04-2008 à 00:29:02    

masterpsx a écrit :

A quoi il te sert le session_start() dans cette page ?
A mon avis il ne fait pas bon menage avec les header(), si il est vraiment indispensable, met session_write_close(); juste avant.


n'importe-quoi.
il faut juste que session_start() soit appelé avant tout envoi de header, et là c'est le cas dans son exemple.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-04-2008 à 01:08:04    

En effet je n'ai pas mis de variables ici dans mon code "exemple" mais dans la vraie page je les utilise bien...

Reply

Marsh Posté le 17-04-2008 à 01:08:47    

sinon j'ai essayé le session_write_close(); à la place du session_start(); mais du coup j'ai perdu mes variables...

Reply

Marsh Posté le 17-04-2008 à 07:17:07    

poyolele a écrit :

En effet je n'ai pas mis de variables ici dans mon code "exemple" mais dans la vraie page je les utilise bien...


 
Donne le code qui manque...
 

poyolele a écrit :

sinon j'ai essayé le session_write_close(); à la place du session_start(); mais du coup j'ai perdu mes variables...


 
ça n'a pas de sens de faire ça.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 17-04-2008 à 09:44:15    

concernant le code qui manque il n'est pas nécessaire pour info c'est juste une variable se session : un tableau multidimensionnel, le genre de truc que je peux pas faire passer par l'url quoi...

Reply

Marsh Posté le 17-04-2008 à 11:20:56    

skeye a écrit :


n'importe-quoi.
il faut juste que session_start() soit appelé avant tout envoi de header, et là c'est le cas dans son exemple.


header() lui aussi ne doit avoir aucun envoie au navigateur avant, hors si les session utilises les cookies c'est forcement le cas, un exemple ou la persone a un problème similaire sur php.net : http://fr2.php.net/manual/fr/funct [...] .php#80882
 
Pour poyolele, il ne faut pas remplacer session_start() par session_write_close() mais le rajouter après l'utilisation de tes variables de session et juste avant que tu n'utilises header() apparement.

Code :
  1. session_start();
  2. Ton code qui concerne les sessions
  3. session_write_close();
  4. writeexcel

Reply

Marsh Posté le 17-04-2008 à 11:57:21    

Le problème est que le code qui concerne les variables de session doit se trouver après les headers, puis que j'affiche leur contenu avec les commande offerte par la bibliothèe writeexcel.  
Encore plus bizarre, tout fonctionne à merveille en localhost...

Reply

Marsh Posté le 17-04-2008 à 12:04:20    

Alors fait 2 pages séparées, une toute simple sans session qui génére le fichier et l'autre qui contient le code dont tu as besoin.

Reply

Marsh Posté le 17-04-2008 à 16:09:15    

je ne peux pas...je t'explique : la page en question est un fichier php. Une fois interprété il génère un fichier excel qui s'ouvre logiquement dans le navigateur, mais le contenu de ce fichier excel est fournit par les variable de sessions...il faut que je puisse avoir accès à ces variables pour remplir mon fichier...

Reply

Marsh Posté le 17-04-2008 à 16:25:56    

Et alors, je vois pas le problème, la génération du fichier se fait toujours en dernier a moins que ta class soit une exeption, tu crée le contenue de ta page exel à l'aide de tes variables puis tu l'envois a un fichier php indépendant qui ne fait que générer le fichier exel dans une nouvelle page. Au pire tu utilise la 1er page juste pour recupérer tes variables de sessions et les renvoyer par une autre méthode a l'autre page qui fera tous le reste.
 
C'est soit ca, soit tu devras surement passer tes variables autrement que par $_SESSION, a toi de voir :)


Message édité par masterpsx le 17-04-2008 à 16:45:13
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed