Partage

afficher une image stockée dans une base mysql

Le 21 octobre 2009 à 16:09:45

Bonjour,

Graphiste de profession, je suis débutante en php.
Je voudrais afficher dans une page une image que je suis parvenue à stocker dans une base de données, avec un titre et une description.
J'arrive à afficher le titre et la description mais pas l'image.

Cela fait une journée que je cherche dans tous les forums et je n'arrive à rien de concluant sauf une bonne migraine.
Si vous pouviez m'aider, cela me sortirait une bonne épine du pied.


Voici le contenu de ma table qui s'appelle promotion
id :int(11) auto_increment
titre : varchar(255)
description :text
ref : text
img : longblob
timestamp : bigint(20)

Voici le contenu de la page rediger-promotion

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("rayostar");
if (isset($_GET['modifier_promotion'])) // Si on demande de modifier une promotion
{
// On protège la variable "modifier_promotion" pour éviter une faille SQL
$_GET['modifier_promotion'] = mysql_real_escape_string(htmlspecialchars($_GET['modifier_promotion']));
// On récupère les infos de la promotion correspondante
$retour = mysql_query('SELECT * FROM promotion WHERE id=\'' . $_GET['modifier_promotion'] . '\'');
$donnees = mysql_fetch_array($retour);

// On place le titre et le contenu dans des variables simples
$titre = stripslashes($donnees['titre']);
$description = stripslashes($donnees['description']);
$ref = stripslashes($donnees['ref']);
$img = $donnees['img'];
$id_promotion = $donnees['id']; // Cette variable va servir pour se souvenir que c'est une modification
}
else // C'est qu'on rédige une nouvelle promotion
{
// Les variables sont vides, puisque c'est une nouvelle promotion
$titre = '';
$description = '';
$ref = '';
$img = '';
$id_promotion = 0; // La variable vaut 0, donc on se souviendra que ce n'est pas une modification
}
?>
<form action="promos.php" method="post" enctype="multipart/form-data">
<h3>Rédiger une promotion</h3>
<p>Titre : <input type="text" size="30" name="titre" value="<?php echo $titre; ?>" /></p>
<p>description :<br /><textarea name="description" cols="50" rows="3"><?php echo $description; ?></textarea></p>
<p>référence :<br /><input type="text" size="30" name="ref" value="<?php echo $ref; ?>" /></p>
<p>Ajouter une image : <input type="file" name="img" /></p>

<p><input type="hidden" name="id_promotion" value="<?php echo $id_promotion; ?>" />
<input type="submit" value="Envoyer" /></p>
</form>



Voici le contenu de la page promo qui liste les promotions

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Liste des promotions</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
h2, h3, th, td
{
text-align:center;
}
table
{
border-collapse:collapse;
border:2px solid black;
margin:auto;
}
th, td
{
border:1px solid black;
}
</style>
</head>

<body>

<h2><a href="rediger_promotion.php">Ajouter une promotion</a></h2>
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("rayostar");
//-----------------------------------------------------
// Vérification 1 : est-ce qu'on veut poster une promotion ?
//-----------------------------------------------------
if (isset($_POST['titre']) AND isset($_POST['description'])
AND isset($_POST['ref']) AND($_FILES['img']) )

{
$titre = addslashes($_POST['titre']);
$description = addslashes($_POST['description']);
$ref = addslashes($_POST['ref']);
$img = $_FILES['img'];


// Testons si l'image n'est pas trop grosse
if ($_FILES['img']['size'] <= 1000000)
{


// On vérifie si c'est une modification de promotion ou pas
if ($_POST['id_promotion'] == 0)
{
// Ce n'est pas une modification, on crée une nouvelle entrée dans la table
mysql_query("INSERT INTO promotion VALUES('', '" . $titre . "', '" . $description . "',
'" . $ref . "', '" . $img . "', '" . time() . "')");
}
else
{
// On protège la variable "id_promotion" pour éviter une faille SQL
$_POST['id_promotion'] = addslashes($_POST['id_promotion']);
// C'est une modification, on met juste à jour le titre et le contenu
mysql_query("UPDATE promotion SET titre='" . $titre . "', description='" . $description . "', ref='" . $ref . "',
img='" . $img . "' WHERE id='" . $_POST['id_promotion'] . "'");
} }
}

//--------------------------------------------------------
// Vérification 2 : est-ce qu'on veut supprimer une promotion ?
//--------------------------------------------------------
if (isset($_GET['supprimer_promotion'])) // Si on demande de supprimer une promotion
{
// Alors on supprime la promotion correspondante
// On protège la variable "id_promotion" pour éviter une faille SQL
$_GET['supprimer_promotion'] = addslashes($_GET['supprimer_promotion']);
mysql_query('DELETE FROM promotion WHERE id=\'' . $_GET['supprimer_promotion'] . '\'');
}
?>
<table width="600" align="center">
<tr>
<th width="10%">Modifier</th>
<th width="10%">Supprimer</th>
<th>Titre</th>
<th width="10%">Date</th>
</tr>
<?php
$retour = mysql_query('SELECT * FROM promotion ORDER BY id DESC');
while ($donnees = mysql_fetch_array($retour)) // On fait une boucle pour lister les promotions
{
?>
<tr>
<td><?php echo '<a href="rediger_promotion.php?modifier_promotion=' . $donnees['id'] . '">'; ?>Modifier</a></td>
<td><?php echo '<a href="promos.php?supprimer_promotion=' . $donnees['id'] . '">'; ?>Supprimer</a></td>
<td><?php echo stripslashes($donnees['titre']); ?></td>
<td><?php echo date('d/m/Y', $donnees['timestamp']); ?></td>
</tr>
<?php
} // Fin de la boucle qui liste les promotions
?>
</table>
<h3><a href="../promotions.php">Voir la page promotions</a></h3>
<h3><a href="../index.html">Retour &agrave; l'accueil du site </a></h3>
</body>
</html>



et voici le tableau dans lequel je voudrais que s'affiche le texte et l'image dans une page du site :

<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td width="70%">
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("rayostar");
// On récupère la dernière promotion
$retour = mysql_query('SELECT * FROM promotion ORDER BY id DESC LIMIT 0, 1');
while ($donnees = mysql_fetch_array($retour))
{
?>
<p class="titre"> <?php echo $donnees['titre']; ?></p>
<p class="lien"> <?php echo $donnees['description']; ?></p>
<p align="left" class="petit"><em><?php echo date('d/m/Y', $donnees['timestamp']); ?></em><br />
Référence : <?php $ref = nl2br(stripslashes($donnees['ref'])); echo $ref; ?></p></td>


<td width="30%">
<div><?php echo $donnees['img']; ?></div>
</td></tr>
</table>

<?php
} // Fin de la boucle des recherches
?>



J'ai essayé aussi de remplacer cette dernière instruction par <img src="<?php echo $donnees['img'];>"/>
mais cela n'a rien donné non plus.



Publicité
Le 21 octobre 2009 à 16:09:45
Le 21 octobre 2009 à 17:04:33

Serait il possible que tu mettes ton code dans les bonnes balises <code>, si tu sais pas les utilisés, je te conseillerais de relire le règlement.
Ensuite stocke tu l'image dans la base de donnée ou seulement l'adresse vers ton image?

lemirandais
Dommage, impossible de mettre ma signature
Le 21 octobre 2009 à 17:06:19

Vu le type du champ je pense que c'est l'image entière qui est stockée dans la bdd... ce qui n'est pas très judicieux ! Il aurait mieux valu stocker le fichier sur le serveur et n'enregistrer que l'url dans la bdd :).
Le 21 octobre 2009 à 17:18:00

Lorsqu'il faut stocker des images pour une base de donnée, il est préférable de stocker les images dans un dossier et de stocker dans la base de donnée le chemin vers cette dernière.
Dans les offres commerciales comme ovh, tu as droit à des bases de donnée d'un maximum de 25Mo (cas de mon offre personnelle). Si je stockais dans ma base de donnée les photos, j'augmenterais considérablement le poid de ma base.
Supposons que je veux stocké 25 images de 1.2MO (bon résolution....) déjà ma base de donnée va être bouffé. D'autre part, le serveur sql risque de lacher car il va envoyé a chaque requete environ 1.2mo pour une photo ce qui est immense ceux qui t'augmente d'autant plus le temps de chargement de la page.
Tous cela pour dire qu'il vaut mieux stocker dans la base de donnée les url vers les photos dans la base de donnée pour les appelés via les balises img.

Lemirandais
Dommage, impossible de mettre ma signature
Le 21 octobre 2009 à 17:45:25

A voir ton code (bien qu'illisible sans les balises de code) j'ai l'impression que dans ta bdd tu as stocké juste le nom de ton image (exemple : imageUploadee.jpg) et non le chemin et l'image.

De plus, quand tu souhaites l'afficher, tu fais juste un echo de ta donnée img de ta bdd. Or si tu n'as que le nom dans ta bdd, il faut pour l'afficher que tu fasses :
<img src="cheminVersDossierImage/<?php echo $donneesImg; ?>" alt="" title="" />
Le 22 octobre 2009 à 17:11:04

Merci de vos réponses. Finalement, j'ai fait comme vous me l'avez dit. J'ai stocké les images dans un dossier seulement le chemin dans la bdd.
Encore merci
Le 22 octobre 2009 à 17:19:26

J'ai pas envie de flooter ce post mais quelqu'un peu me dire comment on fait pour appellé une image stocker dans la base de donnée car la base de donnée enregistre que des éléments textes et non l'image en vrai?

C'est juste par curiosité.

lemirandais

PS: Bravo Enimar, tu as pris la bonne solution.
Dommage, impossible de mettre ma signature
Le 22 octobre 2009 à 17:21:41

Dans une BDD tu peux enregistrer un blob, donc un fichier binaire. A partir de là (en PHP je sais pas exactement comment on fait), tu peux récupérer ton fichier tel que tu l'as enregistré à la base...

afficher une image stockée dans une base mysql

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown