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 :

[Système] GD Image - Header Problème


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut [Système] GD Image - Header Problème
    Bonjour,

    Bien qu'il y ait déja des tonnes de post traitant sur le problème des headers je n'ai pas réussi à trouver un qui répondais au mien.

    Voici l'arborescence de mon site :
    common.php : inclut qques fichiers contenant des fonctions, ...
    form.php : est une class de formulaire

    Voici le problème :
    - J'inclut dans mon form.php le fichier common.php pour inclure toutes les fonctions dont j'ai besoin (et ceci avant toute chose)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    include 'common.php;
    
    // ma class
    ?>
    - un peu plus loin dans ma classe j'ai une fonction randomLetterImg() qui crée un suite de lettre en image/png (j'ai beaucoup simplifié le code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
       include 'common.php;
       
       class Form {
          function randomLetterImg() {
             // Création du texte
             imagestring($img, $fontSize, 0, 0, $letters, $textColor);
    		
             // Affichage de l'img
             header('Content-Type: image/png');
             imagepng($img);
          }
       }
    Quand j'écécute la fonction, on me met l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Cannot modify header information - headers already sent by
    Existerait-il un moyen pour éviter cette erreur ?!
    Je sais bien que normalement les 'header()' doivent être mise avant toute autre ligne de code.

  2. #2
    Membre éclairé Avatar de fallais
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2006
    Messages : 858
    Points : 783
    Points
    783
    Par défaut
    Citation Envoyé par omura
    Je sais bien que normalement les 'header()' doivent être mise avant toute autre ligne de code.
    Justement je crois que c'est le probleme ...

  3. #3
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    J'avais déja testé et mis le 'header()' au tout debut de mon code mais ca ne amrche pas mieux. J'ai droit a cette erreur la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'image “http://127.0.0.1/form/” ne peut être affichée car elle contient des erreurs.
    L'image testée sur un fichier distinct marche avec les mêmes lignes de code donc aucune erreur ne vient du script GD Img

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Tu n'as pas donné l'erreur complète "header already sent by script.php on line truc". Regarde bien cette ligne et les lignes précédentes/suivantes, car un warning est probablement issu à ce niveau.

  5. #5
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Vocii l'erreur complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Cannot modify header information - headers already sent by (output started at d:\program files\easyphp1-8\www\form\functions.php:101) in d:\program files\easyphp1-8\www\form\form.php on line 81
    Mon fichier function.php s'arrete a la ligne 99 lol (il est inclut dans common.php)
    Il n'y a aucun 'header()' dans ce fichier

    Et le code plus haut que je n'ai pas donné c'est juste le code pour remplir les variable.

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Lis bien l'erreur : qu'y a-t-il à form.php on line 81 ? Si c'est une erreur de syntaxe, rappelle-toi que l'erreur peut être située en amont de cette ligne précise. C'est du débogage simple, merci d'y mettre du tien car nous ne pouvons pas deviner ce qu'il se passe dans ton script.

  7. #7
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Voici ma fonction qui génére le code :
    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
    <?php
    function letter($fontSize = 5) {
    	$tinyLetter = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
    	$capLetter = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    	
    	$nbLetter = 6;
    	
    	$string = '';
    	
    	
    	for ($i = 0; $i < $nbLetter; $i++) {
    		
    		$letterStyle = rand (0, 1);
    		$letterStyle = $letterStyle ? $tinyLetter : $capLetter;
    		
    		
    		$nb = rand(0, 23);
    		
    		
    		if (!empty($string)) { 
    			$string = $string.' '.$letterStyle[$nb];
    		} else {
    			$string = $letterStyle[$nb];
    		}
    	}
    
    	
    	$fontWidth = array(1 => 5,
    					   2 => 6,
    					   3 => 7,
    					   4 => 8,
    					   5 => 9,
    	);
    	
    	$fontHeight = array(1 => 7,
    					    2 => 9,
    					    3 => 14,
    					    4 => 16,
    					    5 => 16,
    	);
    	
    	
    	$imgWidth = $fontWidth[$fontSize] * strlen($string);
    	$imgHeight = $fontHeight[$fontSize];
    	
    	
    	$img = @imagecreatetruecolor($imgWidth, $imgHeight) or die('GD is inactive.');
    	
    	$bgColor = imagecolorallocate($img, 255, 255, 255);
    	$textColor = imagecolorallocate($img, 0, 0, 0);
    	
    	
    	imagefilledrectangle($img, 0, 0, $imgWidth, $imgHeight, $bgColor);
    	
    	imagestring($img, $fontSize, 0, 0, $string, $textColor);
    	
    	
    	header('Content-Type: image/png');
    	imagepng($img);
    	
    	imagedestroy($img);	
    }
    
    letter();
    
    
    ?>

    Quand je la teste toute seule ca amrche nikel. Par conrte si je la met dans ma class et que je l'apelle ca me met l'erreur.

    La ligne 81 correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: image/png');
    Donc il n'y a aucune erreur de code j'en suis sur et certain. Il doit y avoir un truc avec la fonction header pour ne pas avoir l'erreur car la placer betement au debut ca ne marche pas.

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Écoute, c'est simple... Si PHP t'affiche une erreur, c'est qu'il y en a une. Si tu viens ici, c'est que tu ne sais pas la résoudre. Si je te réponds, c'est que je suis en mesure de t'aider.
    Maintenant, si tu ne suis pas mes recommandations, on aura du mal à régler ton souci.

    L'erreur que tu m'as donnée indique que ton script form.php envoie quelque chose au navigateur à la ligne 81, ce qui fait que ton appel à header() ne réagit pas comme tu le souhaites.
    Donc regarde le script indiqué à la ligne indiquée et reviens nous voir ensuite.

  9. #9
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Il y a quoi de faux à cette ligne la ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Content-Type: image/png');
    Voila j'ai regardé ma ligne 81 et je vois pas d'erreur ...

    Et franchement si c'etait une bete erreur sur une ligne je l'aurias déja trouvée ... ne croit pas que j'ai pas chercher avant de poster ici

    J'ai une question pour toi : t'a déja essayer de faire un 'anti-robots' ?

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ooops, au temps pour moi, c'est bien la ligne 101 que tu as déjà indiquée comme inexistante.
    Les vacances, ça affecte :/

    Bref.

    Si PHP dit que la sortie a commencé, alors elle a commencé. Il s'agit simplement de savoir où et pourquoi. Cela peut être un simple espace ou un saut de ligne, voire un caractère invisible. Normalement, la sortie en question est affichée en même temps que le message d'avertissement que tu nous as reproduit ici.

    Si tu veux, joins ton fichier functions.php et je regarderai.

  11. #11
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Voila mon fichier fonction.php qui sert a créer quelques input, textarea, ... les champ de base pour un formulaire.

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ton fichier comporte deux lignes vides après la ligne 99, ce qui fait une ligne 100 et une ligne 101 envoyant deux passages à la ligne au navigateur. Voilà ton erreur.

  13. #13
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    ca résout cette erreur mais j'en ai une du même genre un peu plus loin encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Cannot modify header information - headers already sent by (output started at d:\program files\easyphp1-8\www\form\form.php:93) in d:\program files\easyphp1-8\www\form\form.php on line 81
    Voila le bloc de code ou il y a l'erreur. Je ne vois toujours pas ce qu'il pourrais y avoir comme erreur la dedans. Je pense pas qu'il y ait des espaces en trop.
    la ligne 93 étant celle colorée en rouge :

    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
    	function printForm() {
    		echo '<form enctype="multipart/form-data" action="'.$_SERVER['PHP_SELF'].'" method="post"><table>';
    		// Parcours le tableau
    		foreach ($this->form as $label => $field) {
    			foreach ($field as $id => $info) {
    				// Affiche les boutons
    				echo '<tr><td>'.ucfirst($label).'</td><td>'.$info.'</td></tr>';
    			}
    		}
    		if ($this->antiRobots) {
    			echo "<tr><td>".$this->randomLetterImg(5, 6)."</td><td>".textfield('antiRobots')."</td></tr>";
    		}
    		echo "<tr><td>&nbsp;</td><td>".button('submit', $this->submit)."</td></tr>";
    		echo '</table></form>';
    	}
    Et merci pour l'aide deja apportée

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    C'est pourtant simple : tu appelles header() après avoir appelé echo(). C'est la mauvaise méthode. Comme tu l'as dit toi-même, tu ne peux pas appeler header() après avoir affiché quelque chose, il faut le faire avant.

  15. #15
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Oui effectivement j'essaye de trouver un moyen pour le mettre avant le echo() mais je n'arrive pas.

    Si je place le header() avant le echo() j'ai cette erreur qui s'affiche à la place de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'image “http://127.0.0.1/form/” ne peut être affichée car elle contient des erreurs.
    J'aurais penser à faire qq chose avec ob_start et ob_end_flush mais c'est sans succes

  16. #16
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    C'est un problème de fond, j'aurais dû le voir plus tôt.

    Tu essaies d'afficher du HTML et une image dans la même exécution de script, ce qui est impossible (car illogique).

    Un script PHP n'a qu'une sortie (un seul produit fini), dont le type est défini à l'aide des en-têtes HTTP. Si tu n'envoies pas d'en-tête, ce sera du texte par défaut (donc éventuellement du HTML contenant un formulaire) ; si tu spécifies un header particulier (c'est le cas ici), alors tu dois t'y conformer dans tout le script et dans tous ses scripts inclus : tu ne peux pas envoyer de formulaire HTML dans un script sensé envoyer une image, puisque les images ne contiennent jamais de HTML brut.

    Il te faut séparer les éléments à afficher. Je te recommande de regarder l'index php.developpez.com, il y a un lien vers un sujet à propos de header et de GD : c'est tout à fait ce que tu cherches à faire.

  17. #17
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Si j'ai bien compris il suffit juste de séparé les scripts :
    - 1) cree une image : img.php
    - 2) le formulaire : form.php

  18. #18
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Vi.
    À l'endroit où tu souhaites afficher ton image dans form.php, fais :
    <img src="img.php" />

  19. #19
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    OK voila c'est parfait ca marche nikel maintenant. Merci de ton aide.

    Je voudrais juste signalé que comme dis plus haut et répeté 10X mon script ne contenait pas d'erreur (même en rajoutant les 2 espaces blanc ca marche). Il fallait juste trouver le truc ...

    Une question à propos du script anti-robots, qduand GD n'est pas activé, il n'y a pas un aurte moyen pour faire la même chose en évitant le systeme genre a.jpg, b.jpg car suffit de récupéré les lettre dnas le nom de l'img (même par md5, suffira de connaitre le md5(a) et le tour est joué). ?

  20. #20
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    "mon script ne contenait pas d'erreur"
    Moui, tout dépend du point de vue... Syntaxiquement, le script était correct. Sémantiquement, cependant, il ne l'était pas. Bref, problème réglé (comme quoi, il y avait bel et bien un problème).

    Tu peux regarder comment phpBB gère son antispam, il le fait sans GD. Pour éviter d'avoir une correspondance nom de l'image / contenu de l'image, le plus simple est d'utiliser un tableau pour contenir les valeurs en base64 des images, de conserver la relation nom-contenu dans une session et de faire un shuffle()sur ce tableau. Cela te permet de donner un nom numérique et aléatoire à tes images sans que cela ait aucun rapport avec le contenu de l'image.
    Il va te falloir un peu d'ingénuosité pour le mettre au point. L'intérêt de la technique est d'embrouiller l'intrus, pas de lui indiquer pas à pas comment tu fais.

    ++

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

Discussions similaires

  1. [Système] Affichage imag et phpinfo
    Par arti2004 dans le forum Langage
    Réponses: 6
    Dernier message: 29/06/2006, 20h27
  2. Réponses: 1
    Dernier message: 17/05/2006, 21h03
  3. [php-header] problème header téléchargement
    Par nigiri dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2006, 15h16
  4. Réponses: 8
    Dernier message: 06/07/2004, 18h30

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