Hum...
Je peux difficilement faire plus clair que ce que j'ai déjà dit :
Un script qui génère une image va envoyer un header pour cette image. Donc : il ne va générer que cette image. Oui, il FAUT (c'est obligatoire, c'est pas facultatif) un script qui ne fait QUE ça, et rien d'autre. T'as pas le choix, c'est imposé.
Pour inclure ton image dans le code html, il faut appeler le script, comme tu le ferais avec une image :
<img src="ton_script.php?image_id=12345" alt="image custom de la bdd" />
Dans l'exemple, ton_script.php est le script qui renvoit l'image, et QUI NE FAIT QUE CA.
image_id, c'est un paramètre fantaisiste de mon invention pour un script tout autant imaginaire, histoire que le script sache quand même quelle image renvoyer, donc quelle ligne de la table aller chercher dans la base de données...
Je crois que tu as du mal à bien comprendre comment fonctionne PHP. Alors on va reprendre... Depuis le début.
PHP est un interpréteur de scripts.
Apache est un serveur HTTP (un logiciel).
Le navigateur est le client.
Le serveur désigne généralement la machine, mais aussi un logiciel qui "sert" des données en réponse à des requêtes bien précises.
Tu tapes une adresse dans la barre d'adresse de ton navigateur. Tu valides. Le navigateur va chercher où se trouve le serveur hébergeant le domaine demandé et va lui envoyer la requête, qui est celle que tu as entrée dans la barre d'adresse de ton navigateur.
Le serveur HTTP va recevoir cette requête. Si on lui demande un fichier html ou du texte (ou du XML ou n'importe quoi dans le genre) il va se contenter de lire le fichier que tu demandes et renvoyer son contenu au navigateur, qui va ensuite l'analyser et l'afficher avec la mise en forme qui convient.
Si on lui demande un fichier PHP, Apache sait qu'il doit d'abord envoyer la requête à PHP, qui va se charger d'exécuter le script demandé, en prenant en compte la requête (l'URL), qui peut contenir des paramètres pour le script. PHP, une fois le script interprété, va renvoyer à Apache le résultat de ce traitement, sous forme de texte brut (a priori). Texte qu'Apache va renvoyer à ton navigateur qui va l'afficher avec la bonne mise en forme.
Mais. PHP peut ne pas renvoyer de texte, mais une image, un fichier PDF, ou n'importe quoi, tant qu'il envoie les bons entetes à Apache pour qu'il sache quoi dire au client (je commande le plat du jour, est-ce que j'aurai une salade verte ou un magret aux pommes ?). Ca, c'est le rôle de la fonction header() : envoyer les entetes au serveur HTTP pour qu'ils puisse les transmettre au client, qui saura ainsi ce qu'on lui donne à manger : du texte, du pdf, une image jpeg, gif, png...
Mais ce n'est pas tout... Taper l'adresse dans son navigateur est la manière la plus simple pour un humain d'envoyer une requête au serveur HTTP. Mais ce n'est pas la seule.
Les images présentes dans le code HTML ne sont pas à proprement parler des images : ce sont des URI (Uniform Resource Indicator) qui informent le serveur de quelle image on veut. C'est là encore une requête HTTP qui est envoyée au serveur Apache. Donc là encore, Apache va traiter cette requête, en plus des autres (l'adresse, mais aussi les feuilles de styles, etc).
Grosso modo, toutes les balises qui font appel à un fichier (image, feuille de style, etc) ne sont pas le fichier demandé, mais uniquement son adresse. Il y a pour chaque fichier de ce genre une requête HTTP faite au serveur.
Donc. Si sur ta page, tu souhaites afficher une image dynamiquement, au lieu de lui indiquer l'adresse d'un fichier, tu vas lui indiquer l'adresse d'un script PHP qui va renvoyer une image. Pour Apache, c'est kiffkiff : qu'il lise un fichier ou qu'il récupère un contenu d'image de la part de PHP, pour lui, c'est du pareil au même : il renvoit ça, c'est une image.
Mais Apache, et donc le client également, ne sait pas que ce qu'on lui renvoit c'est une image : le navigateur affiche ce qu'on lui dit là où on lui dit, il ne s'occupe pas de savoir si c'est effectivement une image, un pdf, ou autre... Il fait de son mieux. C'est là que header() intervient. Le script PHP qui va renvoyer l'image va utiliser header() pour dire qu'il s'agit d'une image jpg, png, gif, tiff, pict, aiff, ou autre. Le serveur va renvoyer ça au client, qui saura que là, il a bien une image, peu importe le contenu : il se comporte comme si c'était une image. Si le contenu est effectivement le contenu d'une image, ça marche. Sinon, pas d'image.
Donc. Dans ton code HTML, au lieu de mettre l'adresse d'une image, tu vas mettre l'adresse d'un script qui renverra l'image. Ce script, pour bien faire son travail ne doit renvoyer qu'une image (sinon c'est le dawa). et ne doit pas pouvoir renvoyer autre chose.
J'espère que c'est plus clair...
Je sens que je vais faire un vrai tuto complet sur le sujet, parce que manifestement, tout les développeurs n'ont pas forcément les bases...
Neige