1

Sujet : Problème avec les header()

J'ai integrer l'album dans un site (que je n'ai pas fais, c'est le bordel) et j'ai un petit probleme.

Au moment du téléchargement des photos, lors des appels au fonction header() dans CreerArchive() le navigateur me met cette erreur:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web/phototheque.php:5) in /var/www/web/Phototheque/classes/panierdefichiers.class.php on line 197

Je ne vois pas comment résoudre ce problème.

Re : Problème avec les header()

Salut,

Cette erreur signifie que quelque chose à déjà été envoyé au navigateur avant l'appel de la méthode CreerArchive() (avec un echo() par exemple). Cette méthode envoie au navigateur client l'archive zip créée. Sauf que dans les cas d'une intégration dans un site, si ce dernier n'affiche pas son contenu une fois tous les traitements effectués, on se retrouve dans ton cas...

En l'occurence, ici, c'est le fichier phototheque.php qui semble envoyer un contenu au navigateur, à la ligne 5 précisément.

Une solution consisterait à créer un fichier dédié pour le téléchargement de l'archive et de modifier le lien du téléchargement pour qu'il appelle ce fichier dans une nouvelle page.

Voici ce que tu peux essayer de mettre dans un nouveau fichier download.php :

<?php
require_once( 'config.php' );
require_once( './classes/panierdefichiers.class.php' );

$oPanier = new PanierDeFichiers( $iFichiersMaxDansPanier );
$oPanier->CreerArchive( $sDossierPhotos.'Photos' );

exit();
?>

Ceci fait, ouvre explore.php et applique cette modification :

 // Ligne 97
case 'telecharger':    $oPanier->CreerArchive( $sDossierPhotos.'Photos' ); break;

// Remplacer par :
case 'telecharger':     header( 'Location: download.php' );

Attention : il faudra peut être que tu adaptes le chemin d'accès au fichier download.php selon l'intégration que tu as faite d'AlBulles dans la commande header().

Voilà, tente cette modif, je ne te garantie rien car je fais ça très rapidement sans tester. Quoi qu'il arrive, ce petit souci sera corrigé pour la prochaine version d'AlBulles afin de faciliter un peu plus l'intégration.

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

3

Re : Problème avec les header()

J'avais penser faire un truc comme ça mais le problème c'est qu'il y a toujours un appel à la fonction header(), j'ai donc toujours l'erreur.

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web/phototheque.php:5) in /var/www/web/Phototheque/explore.php on line 97

J'ai peur qu'il n'y ait pas de solution rapide...

Je pensais sinon faire un truc du genre créer le fichier .zip (je sais pas quand) et remplacer le lien de telechargement par un lien direct vers le fichier .zip, ce fichier serait stocké sur le serveur et ecrasé à chaque nouveau téléchargement. Mais quand est-ce que je pourrais créer le fichier (il serait stupide de le recréer dès qu'on rajoute ou enlève une photo au panier, il y aurait peut-être aussi un problème s'il y a plusieurs utilisateurs en même temps) ...

En tout je te félicite pour ce travail, c'est bien structuré et commenté. J'ai tout de suite compris comment ça marchait (ce qui n'est pas le cas de tout les scripts qui sont proposés sur le net).

Bravo !

Re : Problème avec les header()

Bon effectivement je t'ai donné cette solution un peu trop hativement...Je n'ai fait que déplacer le pb hmm

La solution du stockage sur le disque n'est pas viable (j'ai déjà tourné le pb sans pas mal de sens) et ce pour plusieurs raisons :

* générer toujours le même fichier au même endroit pose problème dès lors que deux personnes ou plus souhaitent télécharger leur archive. Il se produirait des accès concurrentiels sur le même fichier (en écriture lors de la création du fichier puis en lecture lors de son envoi au navigateur) qui sont ingérables...

* générer plusieurs fichiers serait une alternative mais qui trouve très vite ses limites : premièrement quand peut on savoir que le téléchargement à bien été effectué pour pouvoir supprimer l'archive ? Et deuxièmement, si un grand nombre d'utilisateurs se mettent à télécharger leur archive en même temps, cela risque de faire exploser la taille du disque ; chose qui est interdite pour des personnes qui sont chez un hébergeur et dont la taille du compte est limitée.

Tout ca pour dire que pour l'instant, je crache le fichier sur le disque, je le lis, j'envoie le contenu au navigateur et je le supprime. Et je ne vois pas d'autre alternative.

Donc pour résoudre le problème, il faut mettre un target="_blanck" dans le lien du téléchargement :

// Ligne 226
$sPanierLienArchive    = '<a href="'.$_SERVER['PHP_SELF'].'?rep='.rawurlencode(stripslashes( $sRep )).'&amp;page='.$iPage.'&amp;act=telecharger"><img src="./medias/images/albulles_download.jpg" alt="T&eacute;l&eacute;charger" />T&eacute;l&eacute;charger les images</a><br />';

// Remplacer par
$sPanierLienArchive    = '<a href="'.$_SERVER['PHP_SELF'].'?rep='.rawurlencode(stripslashes( $sRep )).'&amp;page='.$iPage.'&amp;act=telecharger" target="_blanck"><img src="./medias/images/albulles_download.jpg" alt="T&eacute;l&eacute;charger" />T&eacute;l&eacute;charger les images</a><br />';

Le soucis de cette solution, c'est que l'attribut target n'est pas valide en XHTML...Mais pour l'instant je n'ai pas d'autre solution. Il serait aussi possible d'utiliser du javascript pour ouvrir une popup mais je n'aime pas non plus.

Voilà tout ce que je peux te dire pour le moment. Il faut que je trouve une parade viable pour la prochaine version wink

PS : et merci pour le compliment wink

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

Re : Problème avec les header()

Je reposte le message de Becks, il était posté en double. Sauf que je l'ai supprimé et que les deux messages du doublons sont partis sad Il semblerait qu'il y ait un léger souci avec la suppression des messages et notamment quand ces messages sont rédigés pas des invités...Je vais me renseigner.

Toujours est-il que je te prie de m'excuser Becks, je remets ton post ici (ce coup ci j'ai fait un copier avant la suppression big_smile) :

===============

L'idée d'ouvrir une nouvelle page est la bonne !

Bon j'ai du pas mal magouillé mais c'est bon ça marche ...

J'ai finalement déplacé le fichier phototheque.php au même endroit que explore.php et changer le lien de téléchargement :

$sPanierLienArchive    = '<a href="explore.php?rep='.rawurlencode(stripslashes( $sRep )).'&amp;page='.$iPage.'&amp;act=telecharger" target="_blank">T&eacute;l&eacute;charger les images du panier</a><br />';

(blank sans c ;-))

Du coup il n'affiche que explore.php et plus phototheque.php dans la nouvelle fenêtre, et donc plus de problème de header().

Il va falloir que je change tous les liens vers la photothèque de ce site de merde ;-), un petit 'remplacer tout' fera l'affaire en espérant que ça ne fasse pas n'importe quoi.

Merci beaucoup de ton aide !

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

Re : Problème avec les header()

Je t'en prie. Heureux que tu es pu intégrer AlBulles.

Il m'est venu une idée assez bête : as tu essayé de faire un fichier comme je l'ai dit la haut (download.php) et de changer ce même lien ($sPanierLienArchive) pour qu'il pointe directement sur download.php, sans repasser par explore.php.

Ca donnerait un truc de ce style là:

$sPanierLienArchive = '<a href="download.php">T&eacute;l&eacute;charger les images du panier</a><br />';

Il est à vérifier si le target="_blank" (sans 'c' wink je me trompe tout le tps) est toujours nécessaire ou pas.

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

7

Re : Problème avec les header()

Effectivement, le target = "_blank" n'est pas nécessaire, ça marche nickel maintenant.

Le site n'est pas en ligne actuellement, il est juste en test sur un nom de domaine gratuit (vive les pubs).

Si tu veux le voir : http://www.grandluminy.fr.st/ (lien Phototheque en bas à gauche).

J'ai enlever le copyright (:-P), si tu veux que je le rajoute je le remets.

Merci pour tout (encore une fois).

Re : Problème avec les header()

Bien alors je crois que cette méthode sera adoptée pour la prochaine version wink Merci à toi car c'est grâce au retour que j'ai de l'utilisation du script que je peux l'améliorer !

Je suis allé voir. Effectivement y'a de la pub wink. Les textes s'affichent mal chez moi (FireFox sur Mac OS X) ; ils sont trop petits. Mais bon c'est vite galère d'arriver à faire une feuille de style qui permette un affichage à peu près uniforme quelle que soit la plateforme qui visite le site.

Quant au copyright, ca serait plus sympa que tu le laisses. Cela peut me permettre de me faire connaître un peu plus. J'ai déjà abordé le sujet dans ce post (post que je vais d'ailleur passer en annonce wink).

Quand tu auras fini ton intégration, tu peux si tu le souhaites aller mettre le lien vers le site dans le post dédié à cet effet (il est epinglé dans ce même forum).

++ smile

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

9

Re : Problème avec les header()

Voilà j'ai remis le copyright ( une création aussi bien faite se doit d'être promue ).

Je suis content d'avoir contribuer à améliorer ton script.

Sinon pour le site web, c'est pas moi qui l'est fait. Pour l'histoire, je suis en stage et je m'occupe de migrer toutes les bases de données Access vers MySQL. Il a donc fallu pour les bases liées au site web, modifier de l'ASP. C'est là que j'ai découvert ce site web (c'est un de ces bordels !!!!). J'ai donc tout converti en php sans me faire chier à l'améliorer (manque de temps et de volonté). Concernant la photothèque, c'est là qu'intervient ton script qui remplace l'ancien script ASP.

Donc si il y a des problèmes d'affichage, cela vient surement des css qui il y a un peu partout...

Si tu as le temps va voir sur http://www.grandluminy.com où le site en ASP est toujours en ligne, et dis moi si tu as les mêmes problèmes d'affichage. Merci.

Re : Problème avec les header()

Merci pour le copyright smile.

Aucun pb d'affichage pour le site actuel. Je pense que pour l'intégration du script dans ta page, il faudra simplement que tu retouches les tailles des textes. Comme AlBulles possède sa propre feuille de style, il se produit des effets cumulatifs avec les styles déjà définis pour le site dans lequel tu l'intégres. Il suffit simplement de réajuster là où c'est nécessaire dans la feuille de style d'AlBulles. Enfin bref, rien d'insurmontable je pense wink

Bon courage pour ta migration alors !

-------------------------------
"Keyboard not detected, press a key to continue..."

WWW

11

Re : Problème avec les header()

Juste une petite question, ça sert à quoi les ===, quelle différence avec == ?

Re : Problème avec les header()

Le '===' permet de vérifier que les deux valeurs comparées sont bien du même type de donnée, ce qui n'est pas le cas avec '=='.

Doc PHP :
$a == $b renvoie true si $a est égal à $b.
$a === $b renvoie true si $a est égal à $b et qu'ils sont de même type.

Par exemple :

echo ( '0' == 0 ) ? 'Vrai' : 'Faux';
// affiche : Vrai

echo ( '0' === 0 ) ? 'Vrai' : 'Faux';
// affiche : Faux
-------------------------------
"Keyboard not detected, press a key to continue..."

WWW