Images + commentaires des internautes

Mammouth du PHP | 620 Messages

20 juin 2008, 12:11

Bonjour,

J’ai une petite galerie photos dont les images sont stockées via mysql.
J’ai donc un table "galerie" avec comme champs "photo" "alt" "description" ...

Maintenant j'aimerai donnée la possibilité a mes internautes de passage de laissé un commentaire sur tel ou tel photo.

Comment dois-je procédé ? Dois-je faire une nouvelle table ?

Mammouth du PHP | 1353 Messages

20 juin 2008, 12:20

Il faut d'abord que tu rajoutes (si elle n'existe pas déjà) un champ ID unique pour chaque photo (utilisation d'un clef primaire).

Ensuite il faudrait créer une table commentaires avec comme champs par exemple :

ID_PHOTO | AUTEUR | COMMENTAIRE | DATE

Un champ unique ID pour cette table de commentaire peut aussi être utile par la suite.

Enfin l'idée est donc d'avoir un formulaire sous tes photos qui récupère en hidden par exemple l'ID de la photo concernée et quand tu stockes dans ta table commentaire tu sais à quelle photo est associé le commentaire :)

Attention néamoins aux injections SQL, il te faudra traiter les champs de ton formulaire pour éviter que des gens puissent insérer du code potentiellement dangereux dans ta base de données ou sur ton serveur...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Mammouth du PHP | 620 Messages

21 juin 2008, 09:54

Bonjour,
je me lance. j'ai créer mes deux tables dont dans chaque un champ identique que j'ai nommé idsnap pour faire la jointure des deux tables.

table photossnap
CREATE TABLE `photosnap` (
`id` mediumint(75) NOT NULL auto_increment,
`photo` text NOT NULL,
`prenom` varchar(25) NOT NULL default 'Snapi',
`idsnap` smallint(6) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;

table photosnapcom
CREATE TABLE photosnapcom (
idsnap smallint(6) unsigned NOT NULL auto_increment,
nom varchar(128) NOT NULL default '',
commentaire text NOT NULL,
PRIMARY KEY (idsnap)
);

mes tables sont faites (sont-elles bonnes ?).
pour l'alimentation de ma table photosnap j'ai un formulaire qui envoi les infos vers mysql (sauf idsnap que je ne sait pas encore comment alimenter)

a partire de là j'aurai besoin de votre aide pour m'aider a faire la suite

Eléphant du PHP | 74 Messages

21 juin 2008, 10:57

Pourquoi avoir créer deux tables ? tu as déjà la table galerie apparement. Tu devrais rajouter un champ ID a la table galerie et faire la jointure de la nouvelle table en fonction de cet ID. Comme te la suggéré guilt92.

Table galerie => "photo_id (auto_incr)" "photo" "alt" "description"...
Table comment => "photo_id" "nom" "comment" "time"

un champ time peut etre utile pour afficher l'heure et la date du comment. Mais c'est seulement mon avis...

Mammouth du PHP | 620 Messages

21 juin 2008, 11:12

en fait j'ai recréer deux table pour reprendre mon projet a zero et partire sur de bonnes bases.

j'avais pas bien saisie. j'ai remodifié mes tables :

table photossnap
CREATE TABLE `photosnap` (
`id` mediumint(75) NOT NULL auto_increment,
`photo` text NOT NULL,
`prenom` varchar(25) NOT NULL default 'Snapi',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;

table photosnapcom
CREATE TABLE `photosnapcom` (
`id` mediumint(75),
nom varchar(128) NOT NULL default '',
commentaire text NOT NULL,
PRIMARY KEY (`id`)
);

par contre comment faire la jointure ?

j'affiche mes photos dans un tableau de cette facon : photo-snap.php
<?php
 
$nb = 3;               // Nombre d'affichages souhaités sur une ligne

// requête SQL 
$sql = "SELECT * FROM `photosnap` ORDER BY `id` DESC";
// envoie de la requête
$req = mysql_query($sql) or die('<u>Probleme SQL</u> : '.$sql.'<br>'.mysql_error
());  
// affichage des résultats avec $nb résultats par ligne
echo'<table>';
$i = 1;

while($resultat = mysql_fetch_array($req)) {

if($i == 1) { echo'<tr>'; }

echo'<td align="center">
		<div id="cadresnap">
		<img src="../snap/' , $resultat['photo'] , '" /></br>
		' , $resultat['prenom'] , '</br>
		>/div>
	</td>';

$i++;
if($i > $nb) { echo'</tr>'; $i = 1; }
}
echo'</table>';
?>


mon forumaire de saisi de commentaire : photo-snap-com.php
<form action="photo-snap-valide.php" method="post" enctype="multipart/form-data"> 
   <p>&nbsp;  </p> 
   <table border="0" cellspacing="10" cellpadding="0">
     <tr>
       <td><div align="right">Nom </div></td>
       <td><input type="text" name="nom" /></td>
     </tr>
     <tr>
       <td>Commentaire</td>
       <td><textarea name="commentaire" id="commentaire" maxlength="255"></textarea></td>
     </tr>
     <tr>
       <td>&nbsp;</td>
       <td><input name="submit" type="submit" value="Valider" /></td>
     </tr>
   </table>
</form>
ma page de validation du commentaire: photo-snap-valide.php
<?PHP

$sql = "INSERT INTO photosnapcom(id, nom, commentaire)
VALUES('','$nom','$commentaire')";
mysql_query($sql) 
or die('Erreur SQL !'.$sql.'
'.mysql_error()); 

echo 'Votre commentaire a été ajouter.'; 
mysql_close(); 


?> 
Modifié en dernier par fabrice88250 le 21 juin 2008, 11:43, modifié 1 fois.

Eléphant du PHP | 74 Messages

21 juin 2008, 11:43

Un exemple...
$sql = "SELECT a.*,b.nom,b.commentaire FROM `photosnap` AS a  LEFT JOIN `photosnapcom` AS b ON   a.id = b.id ORDER BY `a.id` DESC"; 
//il faut ensuite que tu récupéres $resultat['id'] dans le formulaire de commentaire.

Par contre ton formulaire de commentaire il se trouve dans la page ou tu affiches une photo unique ou dans la page du tableau des photos ?

Mammouth du PHP | 620 Messages

21 juin 2008, 11:49

mon formulaire de commentaire est independant. il a sa propore page. j'aimerai que le formulaire s'ouvre en cliquant sur un lien qui serrait en dessous de chaque photo depuis la page photosnap.

merci pour ton exemple mais je comprend pas tres bien. A quoi correspond a, b ...

Eléphant du PHP | 74 Messages

21 juin 2008, 12:00

Dac donc dans le lien qui enméne vers ton formulaire il faut inclure l'id de la photo.
$sql = "SELECT a.*,b.nom,b.commentaire FROM `photosnap` AS a  LEFT JOIN `photosnapcom` AS b ON   a.id = b.id WHERE `a.id`= "ID"  \\ => ID DE LA PHOTO AFFICHER";
a.* correspond a la table `photosnap`
b.* a la table `photosnapcom`

En faite dans mon exemple j'ai créer des ALIAS des tables. ( `photosnap` AS a ) et ( `photosnapcom` AS b ).

Mammouth du PHP | 620 Messages

21 juin 2008, 12:52

ok je pense que j'ai compris les alias. Par contre j'arrive pas a mettre le tout en place

Eléphant du PHP | 74 Messages

21 juin 2008, 13:01

Qu'est ce qui t'embete ? Qu'est ce que tu as essayer ?

Mammouth du PHP | 620 Messages

21 juin 2008, 13:19

ben déja au niveau du lien pour ouvrir le formulaire de commentaire.

est ce que c'est ça qu'il faut faire ?
echo'<td align="center">
		<div id="cadresnap">
		<img src="../snap/' , $resultat['photo'] , '"/></br>
		' , $resultat['prenom'] , '</br>
		' , $resultat['date'] , '</br>
		<a href=\'photo-snap-com.php?id=' .$resultat->id.'\'>ajouter un commentaire</a>
		</div> 

Eléphant du PHP | 74 Messages

21 juin 2008, 13:32

oui par exemple.

Code : Tout sélectionner

<a href=\'photo-snap-com.php?id=' .$resultat['id'].'\'>ajouter un commentaire</a>
ensuite il faut déterminer si ta page c'est un simple formulaire ou une page qui affiche ta photo en detail et les divers commentaires déjà postés, plus le formulaire...

Si c'est simplement un formulaire... tu ajoutes un champ hidden avec l'id de la photo qui est passé via ton l'url...


Code : Tout sélectionner

<form action="photo-snap-valide.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="id_photo" value="<?php echo $id; ?>"> <p>&nbsp; </p> <table border="0" cellspacing="10" cellpadding="0"> <tr> <td><div align="right">Nom </div></td> <td><input type="text" name="nom" /></td> </tr> <tr> <td>Commentaire</td> <td><textarea name="commentaire" id="commentaire" maxlength="255"></textarea></td> </tr> <tr> <td>&nbsp;</td> <td><input name="submit" type="submit" value="Valider" /></td> </tr> </table> </form>

Mammouth du PHP | 620 Messages

21 juin 2008, 14:52

Sa fonctionne... enfin presque. En fait si j'enregistre un commentaire (1er commentaire) sur un photo sa fonctionne.
Par contre si on essai de mettre un deuxieme commentaire sur la meme photo on a ce message d'erreur qui est retourné :shock:

Code : Tout sélectionner

Erreur SQL !INSERT INTO photosnapcom(id, nom, commentaire) VALUES('22','fabrice','essai commentaire numero 2') Duplicate entry '22' for key 1

Eléphant du PHP | 74 Messages

21 juin 2008, 17:06

C'est normal, c'est par ce que tu as du mettre la colone ID en clé primaire. Une colone en primary key ne peut être NULL et ne peux pas recevoir 2 fois la même valeur. Il faut enlevé la primary key sur cette colonne. Si tu veux conserver une colone en primary key, tu peux par exemple ajouter une colone id_truc en auto_increment.

Code : Tout sélectionner

CREATE TABLE `photosnapcom` ( `pid` mediumint(75) NOT NULL auto_increment, `id` mediumint(75), nom varchar(128) NOT NULL default '', commentaire text NOT NULL, PRIMARY KEY (`pid`) );

Mammouth du PHP | 620 Messages

21 juin 2008, 17:49

tres bien sa fonctionne merci. j'en voie presque le bout.
il ne me reste plus que l'affichage des commentaire qui ont été enregistrés en fonction de la photo.
j'essai de mettre ça en place et je reviens pour vous dire si sa fonctionne.

-- Edit

bon alors voilà ou j'en suis. je n'arrive pas a affiché le nbr de commentaires en fonction de la photo. De plus j'aimerai que le nbr de com s'affiche justre a coté de l'image com.png que je fait affiché pour faire un lien et ajouté un commentaire.
<?php
 
$nb = 3;               // Nombre d'affichages souhaités sur une ligne

// requête SQL 
$sql = "SELECT *, DATE_FORMAT(date,'%d/%m/%Y - %H:%i') as date FROM `photosnap` ORDER BY `id` DESC";
// envoie de la requête
$req = mysql_query($sql) or die('<u>Probleme SQL</u> : '.$sql.'<br>'.mysql_error
());  
// affichage des résultats avec $nb résultats par ligne
echo'<table>';
$i = 1;

while($resultat = mysql_fetch_array($req)) {

if($i == 1) { echo'<tr>'; }

echo'<td align="center"> 
        <div id="cadresnap">' , $resultat['prenom'] , ' 
        <img src="../snap/' , $resultat['photo'] , '" alt="' , $resultat['prenom'] , ' a mis sa trombine sur photos vosges" /></br> 
        <div class="com" id="com">
		<a href="photo-snap-com.php?id=' , $resultat['id'] , '" style="color: #FF9900; text-decoration: none;" onclick="window.open(\'\',\'popup\',\'width=400,top=0,left=0,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0\')" target="popup"> <img src="../images/com.png" alt="ajouter un commentaire" border="0"></a> 
		</div>
        <div class="date">' , $resultat['date'] , ' </div>         
        </div> 
    </td>'; 


$i++;
if($i > $nb) { echo'</tr>'; $i = 1; }
}
echo'</table>';
?>


// j'affiche le nombre total des commentaires stockés dans la table photosnapcom.
<?PHP
$data = mysql_query("SELECT count(idcom) FROM photosnapcom");
$donnees = mysql_fetch_array($data);
$nbr = $donnees[0];
echo  $donnees['0'].' commentaires ont été poster dans cette galerie';
 ?>
Modifié en dernier par fabrice88250 le 24 juin 2008, 13:16, modifié 1 fois.