Afficher une image en fonction d'un champ

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Afficher une image en fonction d'un champ

par Imer2008 » 02 oct. 2008, 11:40

Alors, l'image est bien en jpg.

Et lorsque j'affiche mon image directement, j'obtiens "mauvais id d'image"...

NB:
En fait, quelque soit le chiffre que je mets à la fin (18, 48, 100, ou 250684), ca me met toujours "mauvais id d'image".


News...
Je me suis dit que le champ Blob étant complexe à mettre en oeuvre, j'ai testé l'autre solution, à savoir charger les images dans un dossier "image", la nommer avec le meme "id" que l'agent et là.. bingo ! Ca marche.

D'où mon code:

Code : Tout sélectionner

<td><img src="../personnel/<?php echo $tabagent[idagent]; ?>.jpg" /></td>
Et ca m'affiche sans problème l'image se trouvant dans le dossier "personnel" et correspondant à l'id de l'agent.

Maintenant le hic, c'est qu'il faut que je me coltine ma base de données et les id, une par une pour savoir quelle photo mettre sur quel agent.
Y aurait'il un moyen plus simple pour le faire ?

J'aurais pensé à une page du genre :
"Charger la photo pour Mr. DUPONT Gérard (avec une liste déroulante pour chaque personne" avec un bouton "parcourir" et une fois la photo chargée, elle est visualisée sur la page de l'annuaire.
Mais là, je crois que je vais avoir besoin de vous...

par Ryle » 02 oct. 2008, 11:36

Ah ben ça... tu peux être désolé de nous importuner oui... franchement, venir poser des questions sur un forum d'entraide, c'est à se demander parfois où les gens se croient ?! :langue:

Bon, première chose à faire pour tester, c'est d'ouvrir l'url de l'image directement dans ton navigateur : http://..../apercu.php?idagent=235 (ou tout autre id qui fonctionne :)). Le but, c'est qu'en cas d'erreur sql ou php, ben tu vois le message :) (parce que si tu retournes un message d'erreur à une balise <img>, elle se vexe et affiche une croix rouge sans t'en dire d'avantage :))

Et question bête : tu mets un content type "image/jpg" en dur, mais l'image que tu as en base était-elle bien du jpg ? :)

par Imer2008 » 02 oct. 2008, 11:29

Bon, on va y arriver... peut etre...

J'ai remodifié le fichier apercu.php puisqu'apparement c'est le fichier qui pose problème... Sauf que mes images sont toujours des croix rouges...
Désolé de vous importuner avec ca...

Code apercu remodelé

Code : Tout sélectionner

<?php if ( isset($_GET['id']) ) { $id = intval ($_GET['id']); include ("../include/connexion.php"); $req = "SELECT idagent, imgagent FROM agent WHERE idagent = ".$id; $ret = mysql_query ($req) or die (mysql_error ()); $row = mysql_fetch_assoc ($ret); if ( !$row['idagent'] ) { echo "Id d'image inconnu"; } else { header('Content-Type: image/jpg'); echo $row['imgagent']; } } else { echo "Mauvais id d'image"; } ?>

par Ryle » 02 oct. 2008, 11:13

En fait le camarade Ryle ne t'a pas prévenu qu'avec cette méthode (stockage de l'image en direct dans un BLOB) il y allait y avoir une petite subtilité
Maieuuh ?! Si, j'l'ai dit ?!
Suffit ensuite de le relire et de l'envoyer au navigateur avec le bon entête pour qu'il le gère comme un fichier image...
Mais c'est vrai que j'ai pas insisté, vu que pour ma part, je préfère avoir les fichiers sur le disque plutôt qu'en base ;)

Pour en revenir à ton problème, y a un petit soucis entre ta requête et les données que tu utilises :)
Ta requête retourne deux champs (idagent et imgagent) et tu fais appel à 3 variables $row[0], $row[1] et $row[2] ... mathématiquement, ça colle pas ;)

(Un petit truc pour rendre ton code plus clair et éviter ce genre d'erreur, au lieu d'utiliser mysql_fetch_row() qui te retourne un tableau indexé ($row[0], 1, 2...) tu peux utiliser mysql_fetch_assoc() qui te renvoi un tableau associatif, où les noms des champs sont utilisés comme clés : $row['idagent'], $row['imgagent']. Ainsi pas de doute sur la valeur que tu veux afficher, ni de risque d'erreur si l'ordre des champs change ;))

par Imer2008 » 02 oct. 2008, 10:43

Merci de ta réponse,

Je teste voir ca... :)

Bon après test, je ne vois toujours pas l'image. Et je comprends pas où peut se trouver mon erreur... :roll:

Voilà mes codes :

Page annuaire.php

Code : Tout sélectionner

<?php $sql = "SELECT imgagent,nomagent,prenomagent,service,fonction,portefeuille,telephone,email FROM agent "; if (!empty($caisse_origine)) {$sql .= "WHERE caisse_origine = '$caisse_origine' ";} $sql .= "ORDER BY $ref"; $resultat = mysql_query ($sql, $connexion); while ($tabagent = mysql_fetch_array($resultat, MYSQL_ASSOC)) { ?> <tr onMouseOver="this.style.backgroundColor = '#FFCCCC'" onMouseOut="this.style.backgroundColor = '#FFFFFF'"> <td align="center"><input name="emaildest[]" type="checkbox" id="emaildest" value="<?php echo $tabagent[email]; ?>"></td> <td><img src="apercu.php?idagent=<?php echo $tabagent[idagent]; ?>" /></td> <td><?php echo $tabagent[nomagent]; ?></td> <td><?php echo $tabagent[prenomagent]; ?></td>
Et la page apercu.php (que j'ai légérement modifié du tutoriel dont je me suis servi).

Code : Tout sélectionner

<?php if ( isset($_GET['id']) ) { $id = intval ($_GET['id']); include ("../include/connexion.php"); $req = "SELECT idagent, imgagent FROM agent WHERE idagent = ".$id; $ret = mysql_query ($req) or die (mysql_error ()); $col = mysql_fetch_row ($ret); if ( !$col[0] ) { echo "Id d'image inconnu"; } else { header ("Content-type: ".$col[1]); echo $col[2]; } } else { echo "Mauvais id d'image"; } ?>

par Calimero » 02 oct. 2008, 10:27

En fait le camarade Ryle ne t'a pas prévenu qu'avec cette méthode (stockage de l'image en direct dans un BLOB) il y allait y avoir une petite subtilité : tu ne vas pas t'en sortir avec un simple
 <td><?php echo $tabagent[imgagent]; ?></td> 
Tu ne le décris pas (tu aurais dû !), mais tu as dû remarquer que ça t'affiche une soupe imbitable là où tu voulais avoir une image. Et pour cause : on ne peut pas afficher une image telle quelle dans une page web. Il faut le faire sous forme d'url appelée depuis la page (par exemple à travers une balise <img /> qui est faite pour ça).

Ok mais le blob là dedans il devient quoi ? Très simple, on va l'afficher avec un simple echo comme tu le fais ici, mais dans un script php à part qui ne fera que ça. Et dans la page web, on va simplement faire un appel à ce nouveau script à travers une balise <img /> en lui passant l'idagent (lui permettant de retrouver la photo unique à afficher). Par exemple tu pourrais remplacer la ligne ci-dessus par quelquechose comme :
 <td><img src="affichephoto.php?idagent=<?php echo $tabagent[idagent]; ?>" /></td> 
Le deuxième problème que tu vas devoir surmonter est au niveau de ce nouveau script qui va afficher l'image : il va te falloir également gérer le Content-Type du contenu affiché, puisqu'il ne s'agit pas d'html classique. Il faut pour cela envoyer un header HTTP, et il faudra donc le faire en tout début de script, par exemple si tes images sont au format JPG (ou JPEG) :
header('Content-Type: image/jpg');
// La suite du script qui retrouve le blob en fonction du $_GET['idagent'] et l'affiche (et uniquement le blob !)
Voilà, à toi de jouer maintenant :-)

par Imer2008 » 02 oct. 2008, 10:10

Bon bah je vois que mon post déchaine les foules... :lol:

par Imer2008 » 01 oct. 2008, 10:15

Bonjour,

J'ai donc créé un champ "imgagent" de type blob dans ma table existante. Jusque là pas de problème... J'ai meme vu qu'en éditant les champs, on pouvait ajouter une image dans ce champ imgagent (ce que j'ai fait). Voir image :
ImageImage

Sauf que maintenant, je fais comment pour afficher cette image ?
J'ai rajouté un champ mais ca ne doit pas être ca...

Code : Tout sélectionner

<?php $sql = "SELECT imgagent,nomagent,prenomagent,service,fonction,portefeuille,telephone,email FROM agent "; if (!empty($caisse_origine)) {$sql .= "WHERE caisse_origine = '$caisse_origine' ";} $sql .= "ORDER BY $ref"; $resultat = mysql_query ($sql, $connexion); while ($tabagent = mysql_fetch_array($resultat, MYSQL_ASSOC)) { ?> <tr onMouseOver="this.style.backgroundColor = '#FFCCCC'" onMouseOut="this.style.backgroundColor = '#FFFFFF'"> <td align="center"><input name="emaildest[]" type="checkbox" id="emaildest" value="<?php echo $tabagent[email]; ?>"></td> <td><?php echo $tabagent[imgagent]; ?></td> <td><?php echo $tabagent[nomagent]; ?></td> <td><?php echo $tabagent[prenomagent]; ?></td>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Ryle » 30 sept. 2008, 16:57

Tu peux effectivement utiliser un champ de type BLOB et stocker le flux de l'image dedans. Suffit ensuite de le relire et de l'envoyer au navigateur avec le bon entête pour qu'il le gère comme un fichier image...
L'avantage, c'est que lorsque tu supprimes l'utilisateur, l'image disparait avec. L'inconvénient, c'est que tu vas charger ta base de données avec des informations inutiles (puisqu'aucun traitement ne sera fait sur l'image) et allourdir les temps de recherche, réponse, etc. (bon après c'est sur qu'avec 5000 personnes ça se sentira plus qu'avec 50 ;))

L'autre solution est d'héberger l'image dans un dossier du serveur, et de ne stocker que le nom (voire le chemin) de celle-ci, dans la fiche utilisateur. Dès lors un simple champ varchar est suffisant.
L'inconvénient de cette méthode, c'est que lorsque tu supprimes une fiche, il faut également aller supprimer le fichier correpondant (mais ca se fait très bien avec un unlink() :))

par Imer2008 » 30 sept. 2008, 16:36

Ok,
Mais quel sera le type de champ à insérer ? Un fichier de type BLOB pour les images ?
Voilà une partie du code qui permet d'afficher la liste de personnel.

Merci encore pour votre aide.

Code : Tout sélectionner

<?php $sql = "SELECT nomagent,prenomagent,service,fonction,portefeuille,telephone,email FROM agent "; if (!empty($caisse_origine)) {$sql .= "WHERE caisse_origine = '$caisse_origine' ";} $sql .= "ORDER BY $ref"; $resultat = mysql_query ($sql, $connexion); while ($tabagent = mysql_fetch_array($resultat, MYSQL_ASSOC)) { ?> <tr onMouseOver="this.style.backgroundColor = '#FFCCCC'" onMouseOut="this.style.backgroundColor = '#FFFFFF'"> <td align="center"><input name="emaildest[]" type="checkbox" id="emaildest" value="<?php echo $tabagent[email]; ?>"></td> <td><?php echo $tabagent[nomagent]; ?></td> <td><?php echo $tabagent[nomagent]; ?></td> <td><?php echo $tabagent[prenomagent]; ?></td>

par Ryle » 30 sept. 2008, 16:19

Y a tout plein de solutions... après ça dépend un peu de ce que tu veux mettre en place.

En général, on va avoir tendance à ajouter un champ en plus dans la table contenant le nom du fichier à utiliser. Du coup sur la fiche de l'individu, quand tu récupères ses infos, tu récupères celle-ci en plus et tu l'utilises dans une balise <img> pour afficher sa photo :)

Pour cela, il faut bien sur que les photos soit sur le serveur (ou qu'elles soient renseignées avec une url pour pouvoir être retrouvées en ligne).

La question suivante est donc de savoir d'où proviennent ces images. Si c'est toi qui les mets sur le serveur dans un dossier spécifique, ben y a pas de problème, tu renseignes de même le nom de l'image dans la fiche du bonhomme. Si tu veux que ce soit eux qui mettent leurs images en ligne, tu peux suivre le tuto d'upload de fichier. Une fois le fichier en ligne sur ton serveur, il te suffit d'en récupérer le nom et d'aller mettre à jour la fiche de ton employé :)

voili voilo :)

Afficher une image en fonction d'un champ

par Imer2008 » 30 sept. 2008, 16:13

Bonjour à tous,

Je me joins à vous pour vous demander votre aide, je connais un peu le php mais pas assez selon moi d'où ma question, qui va surement vous paraitre bete...

J'ai une table déjà existante d'une liste de personnel (idagent, nomagent, prenomagent, etc.).
Je souhaiterai que pour chaque agent, on puisse voir sa photo perso. Ma question est simple : comment faire ?

J'ai utilisé ce tutoriel mais il me propose uniquement d'uploader des images.

Merci à celles et ceux qui pourront m'éclairer.