Extraire une image d'un champ blob

Signaler
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008
-
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008
-
Dans une base mysql, j'ai des jolies images que je souhaite afficher où je le veux sur des pages html.
Ma base fonctionne bien je peux mettre supprimer ajouter les images que je veux. ça, ça roule !
Là ou çà se complique c'est quand je veux prendre l'image avec l'id=... et que je veux l'afficher dans une page html.
Je viens de galérer avec header qui me donne toujours la maudite .... always send ...  J'ai essayé de remanier mon code, l'image s'affiche mais pas le reste !

<?php
  include("connexion.php");  $req "SELECT img_id,img_type,img_blob "." FROM images WHERE img_id '1'";
$ret = mysql_query($req) or die (mysql_error());
$col = mysql_fetch_row($ret);
header"Content-type:" .$col[1];
echo $col[2];
?>

J'aimerais bien me passer de ce borde.. à c.. de header !!!
Help !
François

10 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

Tu ne peux pas te passer de header() : c'est 999999999% obligatoire.

PHP renvoit des caractères. N'importe lesquels, tout dépend de ton script.
C'est le navigateur qui reçoit ces caractères : lui, ne sait pas quoi en faire. Par défaut, il considère ça comme du texte, sans se soucier réellement du type mime. Si tu souhaites que les caractères envoyés aient une autre signification pour le navigateur, il faut le lui dire : il n'est pas foutu, tout seul, de le deviner (et ça se comprend).
herder() sert à ça.

Je ne vois pas en quoi c'est une contrainte...
<hr size="2" width="100%" />Neige
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Contrainte !
je n'arrive pas à inclure ce header pour afficher l'image voulue dans la page html que j'ai faite. Comment faut il faire et en plus j'ai 2 photos à afficher, entourées de 2 pavés de textes issus d'une base de données.
Et quand je lis toutes les questions qui concernent le blob et les header, ça galère !

Bon comment je peux intérger le code du dessus dans du html sans que j'a le joli message always send.. ?

Un petit coup de main svp

François
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Bon, n'arrive pas !*
Galère
 voici le bout de code et mes soucis !

<?php
  include("connexion.php");  $req "SELECT img_id,img_type,img_blob "." FROM images WHERE img_id '1'";
$ret = mysql_query($req) or die (mysql_error());
$col = mysql_fetch_row($ret);
"Content-type:" .$col[1];
echo $col[2];



Si je mets ça, l'image s'affiche mais c'est tout , tout le dessous rien, aucun affichage, une page blanche et c'est tout!


 $idConnexion = mysql_connect()
  //if ($idConnexion) echo "Connexion au serveur réussie
";
  //else echo "Connexion au serveur ratée";


  $connexionReussie = mysql_select_db(°
  //if ($connexionReussie) echo "Connexion à la base réussie
";
  //else echo "Connexion à la base ratée";


// variable du samedi 29 texte 1


$rq = "SELECT lestextes FROM textes WHERE id='16'";
  $res = mysql_query($rq) or die("Loupé");
$ligne=mysql_fetch_array($res);
  extract ($ligne);
$samedi1=$lestextes;je mets le texte N°1 du samedi dans la variable $samedi1


// Variable du samedi 29 texte 2


$rq = "SELECT lestextes FROM textes WHERE id='17'";
  $res = mysql_query($rq) or die("Loupé");
$ligne=mysql_fetch_array($res);
  extract ($ligne);
$samedi2=$lestextes;idem pour ce texte




mysql_close();  // on ferme la connexion


?>



La partei html pour la mise en page, mais en jaune ça marche pas !!!!!

<html>
<head>


samedi 29 mars


[accueil.htm Accueil]

 ----

  <?php;echo $col[2];?>,
 
 ----

  ><?php; echo addslashes($col[2]); ?></td>
  , <?php echo \"$samedi2\"; ?></td>
 


</head>
</html>

Sur ce coup j'ai besoin d'aide !
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

Bon... Faut reposer quelques bases...

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 :

Tu ne peux pas balancer dans le code html le contenu de l'image, ça n'a aucun sens.
Dans cette ligne, ton_script.php est le script qui va générer l'image, et rien d'autre.
Entendons-nous bien... Le script, suivant les arguments que tu lui passes, peux faire autre chose. Mais s'il envoit une image, il ne peut rien envoyer d'autre.
Comme un script qui renvoit du HTML, il ne renverra pas d'image, pas de XML, pas de pdf, etc.

<hr size="2" width="100%" />Neige
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Pas compris !
en fait un petit peu !
Dans le script que tu me donnes, c'est quoi "ton_script.php?image_id=12345"

image_id = ça j'ai compris, c'est le N° id qui correspond à mon image que je veux afficher.
mais ton_script.php?, c'est quoi ?

alt="image custom de la bdd"
pour moi, c'est le nom de l'image qui est dans la bdd, mais c'est le blob ? ou le nom complet ?


Encore merci pour ton aide.


 


François
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

est ce que ce serait qq chose comme cela ?

td>
  >
  </td>

parce que ça ne marche pas
François
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Je viens de lire pas mal de trucs...

voila ce que j'ai fait est ce que je suis sur la bonne voie ?

j'ai crée une page
affichage.php
avec le code suivant:
<?php
  include("connexion.php");  $req "SELECT img_id,img_type,img_blob "." FROM images WHERE img_id '1'";
$ret = mysql_query($req) or die (mysql_error());
$col = mysql_fetch_row($ret);
header"Content-type:" .$col[1];
echo $col[2];
?>

puis j'ai écris la balise html suivante, comme tu me l'a écrit:

 

Et j'obtiens à l'écran un rectangle une croix rouge et $col2 noté dedans
C'est où mon zerreur ?
François
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
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 :

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...

<hr size="2" width="100%" />Neige
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Merci bien ,mais je suis pratico pratique.


J'ai donc crée un script affichage.php


est-il correct pour afficher ou retirer une image ?

Que dois je modifier ?


 


dans la balise

je fais appel à ce script, je prends img_id =1 car c'est l'image avec id =1 que je veux afficher

Que dois-je modifier ?
Merci encore
François
Messages postés
15
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
5 mai 2008

Merci pour tout, en surfant j'ai trouvé l'explication
François
je mettrai en ligne ce code, car au vue du nombre de personne qui cherche cette solution, cela devrait interessé, m^me si mon code n'est pas tip top.
François