Page 1 sur 1

PHP - MySQL : Insérer et Afficher Photos dans Bdd

Posté : 01 févr. 2007, 22:22
par jakkihm
Bonjour,

Je conçois un site pour une boutique avec une bdd et je dois permettre au visiteur de visualiser la photo des objets avec leur description (je ne veux pas indiquer le chemin qui mène au répertoire des photos, car il faut que le visiteur puisse voir directement les photos sans avoir à cliquer sur un lien).

Voici la structure de ma table:

Code : Tout sélectionner

CREATE TABLE items ( id INT NOT NULL AUTO_INCREMENT, category VARCHAR (50) NOT NULL, photo BLOB NOT NULL, name VARCHAR (100) NOT NULL, description VARCHAR (200) NOT NULL, country VARCHAR (50) NOT NULL, PRIMARY KEY (id) );
J'ai inséré les informations pour tous les champs à travers un fichier ".txt" (pour l'instant je travaille en local):

Code : Tout sélectionner

;furniture;c:\Program Files\EasyPHP1-8\mysql\data\gallery\pict.jpg; etc...
Pour l'affichage, j'ai conçu le tableau suivant:

Code : Tout sélectionner

<form action="furniture.php" method="POST"> <table cellspacing=0" cellpadding="0" border="1"> <?php if($result) { while($data = mysql_fetch_assoc($result)) { printf ( "<tr> <td> doit afficher photo ?? </td> <td>%s</td> <td>%s</td> <td>%s</td> </tr>", $data["photo"], $data["name"], $data["description"], $data["country"] ); } // end while if(mysql_num_rows($result) == 0) { $msg.="Aucune information disponible"; } } ?> </table> </form>
Tout fonctionne très bien sauf en ce qui a trait aux photos.

Comment puis-je les insérer et par la suite les afficher dans mon tableau. Est-il possible de les copier dans le répertoire de la bdd et par la suite y faire appel ? Mais comment procéder ?

Merci beaucoup pour votre aide !

Posté : 02 févr. 2007, 00:07
par jojolapine
je pense qu'en insérant un chemin relatif de ta photo dans ta bdd, ce serait plus facile...
ensuite, tu n'as plus qu'a faire
<img src="<?php echo $chemin_photo; ?>" alt="<?php echo $description_photo; ?>" />
les deux variables seront remplies à partir de ta bdd

Posté : 02 févr. 2007, 00:15
par lord.anonymous
Je vais te filer un peu de code en vrac, à toi de trier et d'organiser tout ça pour ta page.
Si tu as un formulaire pour uploader tes images, utilise ce bout de code:
//ouverture du fichier temporaire envoyé en mode binaire
$file = fopen ($_FILES["userfile"]["tmp_name"], "rb");
//récupere la taille du fichier temporaire
$size = filesize ($_FILES["userfile"]["tmp_name"]);
//lit le contenu du fichier temporaire
$content = fread ($file, $size);
//protege le contenu par des / /
$userfile = addslashes ($content);
//recupere le nom du fichier
$file_name = $_FILES["userfile"]["name"];
//recupere la taille du fichier
$file_size = $_FILES["userfile"]["size"];
//recupere le type du fichier
$file_type = $_FILES["userfile"]["type"];

if (in_array (strtolower ($file_type), $image_types)) {
//construction et execution de la requète pour ajouter une image
$sql = "INSERT INTO image (image_type, image, image_size, image_name, image_date) ";
$sql.= "VALUES (";
$sql.= "'{$file_type}', '{$userfile}', '{$file_size}', '{$file_name}', NOW())";
@mysql_query ($sql, $conn);
//recharge la page index.php
header("Location:".$_SERVER["PHP_SELF"], true);
exit();
}
Dans une autre page pour afficher tes images issues de la bdd, tu fais ça:
//choisi l'image selectionnée
$sql = "SELECT * FROM image WHERE image_id=".$_GET["iid"];
$result = mysql_query ($sql, $conn);

if (mysql_num_rows ($result)>0) {

$row = @mysql_fetch_array ($result);

//prend le type de l'image
$image_type = $row["image_type"];

//prend le contenu de l'image en mode binaire
$image = $row["image"];

//spécifie l'entete HTTP
header("Content-type: $image_type");

//affiche le contenu de l'image
echo $image;

}

Posté : 02 févr. 2007, 00:23
par jojolapine
:non: pas bon pas bon de stocker des images en bdd ...
C'est pas du tout optimisé...
Il vaut mieu stocker uniquement le chemin vers le fichier (et aussi le poids les dimensions... etc, ça évite de les recalculer à chaque fois ;-) )

Posté : 02 févr. 2007, 00:27
par Truc
:non: pas bon pas bon de stocker des images en bdd ...
C'est pas non plus la mort... s'il y a un type blob en mysql c'est pour s'en servir :)

Certes pas pour stocker des images qui font parties de la charte graphique

Re: PHP - MySQL : Insérer et Afficher Photos dans Bdd

Posté : 02 févr. 2007, 01:46
par iclo
Bonjour,
je ne veux pas indiquer le chemin qui mène au répertoire des photos, car il faut que le visiteur puisse voir directement les photos sans avoir à cliquer sur un lien).
Le fait de stocker l'image ou son chemin dans la base de donnée, ne changera rien pour ce problème. Tu peux stocker le chemin et l'utiliser dans une balise IMG pour afficher l'image directement sur la page, (sans avoir de lien vers l'image)

Truc: les champs blob et leur usage un vaste débat :D :D

Posté : 03 févr. 2007, 22:14
par jakkihm
Merci à tous pour vos réponses !

J'ai effectué les changements suivant vos recommendations, c'est-à-dire en insérant le chemin de la photo dans la bdd et en le récupérant dans mon tableau via PHP. Toutefois, je reçois un message de "parse error ...".

Base de données : (Je travaille en local pour l'instant)
J'ai créé pour les images un champ "photo BLOB NOT NULL" :

Code : Tout sélectionner

... ;img\picture1.jpg; ...

Fichier PHP :

Code : Tout sélectionner

<form action="furniture.php" method="POST"> <table cellspacing=0" cellpadding="0" border="1"> <?php if($result) { while($data = mysql_fetch_assoc($result)) { printf ( "<tr> <td><img src="<?php echo $data['photo']; ?>"></td> <td>%s</td> <td>%s</td> <td>%s</td> </tr>", $data["photo"], $data["name"], $data["description"], $data["country"] ); } // end while if(mysql_num_rows($result) == 0) { $msg.="Aucune information disponible"; } } ?> </table> </form>
Merci pour votre aide !

Posté : 03 févr. 2007, 23:15
par lord.anonymous
:non: pas bon pas bon de stocker des images en bdd ...
C'est pas non plus la mort... s'il y a un type blob en mysql c'est pour s'en servir :)

Certes pas pour stocker des images qui font parties de la charte graphique
Que veux tu dire?

Posté : 04 févr. 2007, 12:04
par Truc
@jakkihm
Tu n'as pas besoin de champ de type "blob" si tu y enregistres le chemin (ou nom) de l'image... un varchar (avec une limite) suffira.

@lord.anonymous
Les images qui sont constamment appelées et nombreuses... et puis aucun interêt d'enregistrer une image pixel transparent en base par exemple.

Posté : 04 févr. 2007, 13:09
par lord.anonymous
@lord.anonymous
Les images qui sont constamment appelées et nombreuses... et puis aucun interêt d'enregistrer une image pixel transparent en base par exemple.
C'est une histoire de transfert entre le serveur SQL et le serveur Apache? Ca bouffe de la bande passante pour rien je suppose...