Page 1 sur 1

Systeme de vote pour des images

Posté : 15 janv. 2009, 15:59
par Ariochs
Bonjour a tous. Bon voila je galere un peu sur mon code, et a chaque modification que je fais j'ai l'impression que j'aggrave..

Alors voila, j'aimerai faire un systeme de vote pour des images. Du genre on retrouve 4 images sur une page, et il y a possibilité de voter pour chaque image (mais sans etre obligé de voter pour toute les images).

L'utilisateur peux voter qu'une fois par image.

J'ai donc pour cela deux tables

La 1ere : USER avec id_user / pseudo / mdp
La seconde : IMAGE avec id_image / note / id_user

Bon j'arrive a m'inscrire et me conencter correctement. Maintenant voici le code de ma page 'vote.php'.
<?php
	session_start();
	include 'connect.php';
	
		$id_user = $_SESSION['cle'];
		$vote01 = $_POST['vote01'];
		$vote02 = $_POST['vote02'];
		$vote03 = $_POST['vote03'];
		$vote04 = $_POST['vote04'];
		
			if (isset($_POST['ok01'])){
				$sql = "INSERT INTO image (id_user, id_image, note) VALUES ('$id_user','1','$vote01')";
				mysql_query($sql) or die(mysql_error());
			}
			else{
				echo "erreur 01";
			}
				
			if(isset($_POST['ok02'])){
				$sql = "INSERT INTO image (id_user, id_image, note) VALUES ('$id_user','2','$vote02')";
				mysql_query($sql) or die(mysql_error());
			}
			else{
				echo "erreur 02";
			}
				
			if(isset($_POST['ok03'])){
				$sql = "INSERT INTO image (id_user, id_image, note) VALUES ('$id_user','3','$vote03')";
				mysql_query($sql) or die(mysql_error());
			}
			else{
				echo "erreur 03";
			}
				
			if(isset($_POST['ok04'])){
				$sql = "INSERT INTO image (id_user, id_image, note) VALUES ('$id_user','$4','$vote04')";
				mysql_query($sql) or die(mysql_error());
			}
			else{
				echo "erreur 04";
			}


?>
A la suite il y a le code HTML

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Document sans titre</title> </head> <body> Image 01 : <img src="img/img1.jpg" alt="Photo 01" /><br/> <form action="vote.php" method="POST" enctype="multipart/form-data"> <select name="vote01"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok01" value="Envoyer" /> </form> Image 02 : <img src="img/img2.jpg" alt="Photo 02" /><br/> <form action="vote.php" method="POST" enctype="multipart/form-data"> <select name="vote02"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok02" value="Envoyer" /> </form> Image 03 : <img src="img/img3.jpg" alt="Photo 03" /><br/> <form action="vote.php" method="POST" enctype="multipart/form-data"> <select name="vote03"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok03" value="Envoyer" /> </form> Image 04 : <img src="img/img4.jpg" alt="Photo 04" /><br/> <form action="vote.php" method="POST" enctype="multipart/form-data"> <select name="vote04"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok04" value="Envoyer" /> </form> </body> </html>
Je n'ai aucune erreur qui s'affiche, mais les données ne s'ajoute pas a la BDD, donc je suppose que mon erreur vient du php.

Merci de votre aide

Posté : 15 janv. 2009, 16:36
par guilt92
Bonjour,
    session_start(); 
    include 'connect.php'; 
     
     
     
    if(mysql_query($sql)){ 
Qu'est ce que c'est ce if() qui effectue une requete qui n'existe pas ? (sauf si tu as défini $sql dans connect.php...)

Sinon je te conseil de prendre l'habitude de mettre des

or die(mysql_error()) à la suite de chaque mysql_query(), ca aide pr le débug.

Posté : 15 janv. 2009, 16:49
par Ariochs
Voila j'ai re-modifié le code php.

Euh ouais mon if n'avait rien a faire la lol.

Par contre quand je l'enleve tout mes echos s'affiche.

Avec l'ajout du or die(mysql_error()) j'ai cette phrase la qui apparait :

Cannot add or update a child row: a foreign key constraint fails (`vote/image`, CONSTRAINT `FK_image_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`))

Pas compris.. L'erreur vient du la BDD ?

Posté : 15 janv. 2009, 16:59
par guilt92
L'erreur vient peut etre de la valeur de $_SESSION["cle"];

On dirait que cela vaut "image/vote" hors il cherche l'id d'un user existant dans la base user (c'est une foreign key) et forcement il trouve pas d'utilisateur avec cet id, d'ou le message d'erreur...

Teste la valeur, ou fait un echo $sql au lieu de faire le mysql_query pour être sur que les valeurs sont bonnes...

Posté : 15 janv. 2009, 17:43
par Ariochs
Bon alors quand je remplace
$sql = "INSERT INTO image (id_user, id_image, note) VALUES ('$id_user','1','$vote01')";
par
$sql = "INSERT INTO image (id_image, note) VALUES ('1','$vote01')";
l'ajout de la note fonctionne. Par contre je peux l'ajouter qu'une fois, apres j'ai droit a : Duplicate entry '1' for key 1

Donc effectivement il a un probleme avec ma SESSION['cle'] mais aussi un probleme pour ajouter deux fois une note a une meme image..

Je rajoute en code la BDD

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.6 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Jeu 15 Janvier 2009 à 16:42 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `vote` -- -- -------------------------------------------------------- -- -- Structure de la table `image` -- CREATE TABLE `image` ( `id_image` int(11) NOT NULL auto_increment, `note` varchar(10) default NULL, `id_user` int(11) default NULL, PRIMARY KEY (`id_image`), KEY `FK_image_id_user` (`id_user`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; -- -- Contenu de la table `image` -- -- -- Contraintes pour les tables exportées -- -- -- Contraintes pour la table `image` -- ALTER TABLE `image` ADD CONSTRAINT `FK_image_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`);
Merci de ton aide (ou votre si d'autres rejoigne le sujet ^^)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 15 janv. 2009, 18:01
par guilt92
Ca me parait normal...

PRIMARY KEY (`id_image`),

id_image est une clef primaire donc tu ne pourras pas avoir plusieurs fois la même valeur dans la table...

Mais je pense pas qu'il faille supprimer le id_user faudrait juste avoir la bonne valeur de ton user...

Et a ce moment faire faire une clef primaire sur le couple (id_user, id_image) pour etre sur qu'un user ne puisse voter qu'une fois par image...

Sauf si c est pas le but et qu un user peut voter plusieurs fois sur la meme image ?

Posté : 15 janv. 2009, 20:10
par AB
C'est laborieux comme façon de faire. Et si tu ne faisait qu'une requête d'insertion ?

Aller on bosse un peu, il suffit de faire tes formulaires autrement.
Testes ce code dans une page séparée et tu devrais en déduire rapidement la requête unique qui pourra traiter tous tes votes.

<?php
if (!empty($_POST))
     {
		 echo '<pre>';
		 print_r($_POST);
		 echo '</pre>';
	}
		 
 ?>
         <form action="#" method="POST" enctype="multipart/form-data">
            <select name="vote">
                <option value="0">-</option>
                <option value="1">0</option>
                <option value="2">1</option>
                <option value="3">2</option>
                <option value="4">3</option>
                <option value="5">4</option>
                <option value="6">5</option>
            </select>
            <input type="submit" name="ok" value="Envoyer" />
			<input type = "hidden" name="num_phot" value = "1" />
       </form> 
 
         <form action="#" method="POST" enctype="multipart/form-data">
            <select name="vote">
                <option value="0">-</option>
                <option value="1">0</option>
                <option value="2">1</option>
                <option value="3">2</option>
                <option value="4">3</option>
                <option value="5">4</option>
                <option value="6">5</option>
            </select>
            <input type="submit" name="ok" value="Envoyer" />
			<input type = "hidden" name="num_phot" value = "2" />
       </form> 

Posté : 21 janv. 2009, 17:03
par Ariochs
Bonjour. Désolé de ne pas avoir repondu j'ai été pas mal occupé dernierement.

Donc pour revenir a ce probleme je n'ai toujours pas trouvé la solution.

AB je te remercie de ton idée, je pense avoir fait ce que tu voulais, mais il m'est toujours impossible d'ajouter les valeurs dans la BDD. J'ai donc aussi fait une nouvel BDD ou dans la fameuse table "image" (qui ce nomme maintenant "pictures") on a id_pictures / image / note / id_user

Voici le code de la bdd :

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.6 -- http://www.phpmyadmin.net -- -- Serveur: localhost -- Généré le : Mer 21 Janvier 2009 à 16:00 -- Version du serveur: 5.0.51 -- Version de PHP: 5.2.6 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `vote` -- -- -------------------------------------------------------- -- -- Structure de la table `pictures` -- CREATE TABLE `pictures` ( `id_pictures` int(11) NOT NULL auto_increment, `image` varchar(10) default NULL, `note` varchar(10) default NULL, `id_user` int(11) default NULL, PRIMARY KEY (`id_pictures`), KEY `FK_pictures_id_user` (`id_user`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- Contenu de la table `pictures` -- -- -------------------------------------------------------- -- -- Structure de la table `user` -- CREATE TABLE `user` ( `id_user` int(11) NOT NULL auto_increment, `pseudo` varchar(20) default NULL, `mdp` varchar(100) default NULL, PRIMARY KEY (`id_user`), UNIQUE KEY `pseudo` (`pseudo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; -- -- Contenu de la table `user` -- INSERT INTO `user` (`id_user`, `pseudo`, `mdp`) VALUES (1, 'greg', 'greg'), (2, 'z', 'z'), (3, 'a', 'a'), (4, 'v', 'v'); -- -- Contraintes pour les tables exportées -- -- -- Contraintes pour la table `pictures` -- ALTER TABLE `pictures` ADD CONSTRAINT `FK_pictures_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`);

Celui du php :
<?php

	session_start();
	include 'connect.php';
	
	
	if (!empty($_POST))
		 {
			$vote = $_POST['vote'];
			$num_photo = $_POST['num_photo'];
			$id_user = $_SESSION['cle'];
			
			echo '<pre>';
			print_r($_POST);
			echo '</pre>';
			
			$sql = "INSERT INTO pictures (id_user, image, note) VALUES ('$id_user','$num_photo','$vote')";
			mysql_query($sql) or die(mysql_error()." <br>$sql");
		}
			 
	 ?>

et le html a la suite du php :

Code : Tout sélectionner

Image 01 : <img src="img/img1.jpg" alt="Photo 01" /><br/> <form action="#" method="POST" enctype="multipart/form-data"> <select name="vote"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok" value="Envoyer" /> <input type = "hidden" name="num_photo" value = "1" /> </form> Image 02 : <img src="img/img2.jpg" alt="Photo 02" /><br/> <form action="#" method="POST" enctype="multipart/form-data"> <select name="vote"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok" value="Envoyer" /> <input type = "hidden" name="num_photo" value = "2" /> </form> Image 03 : <img src="img/img3.jpg" alt="Photo 03" /><br/> <form action="#" method="POST" enctype="multipart/form-data"> <select name="vote"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok" value="Envoyer" /> <input type = "hidden" name="num_photo" value = "3" /> </form> Image 04 : <img src="img/img4.jpg" alt="Photo 04" /><br/> <form action="#" method="POST" enctype="multipart/form-data"> <select name="vote"> <option value="0">-</option> <option value="1">0</option> <option value="2">1</option> <option value="3">2</option> <option value="4">3</option> <option value="5">4</option> <option value="6">5</option> </select> <input type="submit" name="ok" value="Envoyer" /> <input type = "hidden" name="num_photo" value = "4" /> </form>

L'erreur que j'ai a l'envoi :
Cannot add or update a child row: a foreign key constraint fails (`vote/pictures`, CONSTRAINT `FK_pictures_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`))
INSERT INTO pictures (id_user, image, note) VALUES ('','1','4')


Encore merci pour votre aide

Posté : 21 janv. 2009, 18:30
par AB
Ben la réponse de mysql est pourtant explicite.

Code : Tout sélectionner

Cannot add or update a child row: a foreign key constraint fails (`vote/pictures`, CONSTRAINT `FK_pictures_id_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`)) INSERT INTO pictures (id_user, image, note) VALUES ('','1','4')
Faut toujours écouter les dames sinon elles boudent :cry:

Elle te dit qu'elle ne peut pas ajouter le champ "id_user" de ta table "picture" à cause de la clé étrangère contrainte "FK_pictures_id_user" qui correspond au champ "id_user" de ta table "user".

Il doit donc y avoir un conflit entre la valeur que tu veux rentrer dans ce champ "id_user" de ta table "picture" et l'existence de cette même valeur dans le champ "id_user" de ta table "user"

C'est assez normal (l'inverse serait inquiétant) que cela génère une erreur puisque comme l'indique ta requête tu essaies de rentrer '' dans le champ id_user alors que ce même champ dans ta table "user" est autoincrémenté et commence donc à 1. Remarques qu'en l'état actuel des données de ta table "user" cela provoquerait la même erreur si tu voulais rentrer 5 comme valeur puisque ta table ne contient que 4 enregistrements.

Bref ta variable de session $_SESSION['cle'] doit contenir un "id_user" existant dans ta table "user" et là elle est vide.

Posté : 22 janv. 2009, 14:31
par Ariochs
Oui mais pourtant dans ma table "user" j'ai :

id_user / pseudo / mdp
1 / a / a
2 / z / z
3 / bob / bob

J'arrive sur mon index, je choisi de me connecter, je rentre mon login et password (par exemple bob / bob). J'arrive sur une page basique, clique sur le lien pour aller voter et me voila sur la page vote.php qu'on essai de debugger en ce moment.

Donc ma $_SESSION['cle'] contient un id_user qui existe, puisque je me suis connecter avec bob (sois l'id_user 3)...

Ou alors c'est moi qui est mal compris ce que tu voulais me dire..


[EDIT] Ah non je crois avoir compris. J'ai besoin d'une table intermediaire. Je fais ca tout de suite avec une autre modif, et je reviens postuler (moui car apres avoir trouvé le probleme, j'ai d'autres truc que j'aimerai faire, et la je vais encore avoir besoin de vous :oops: )

Posté : 22 janv. 2009, 15:37
par AB
Donc ma $_SESSION['cle'] contient un id_user qui existe, puisque je me suis connecter avec bob (sois l'id_user 3)...
:?: :?: :?:
Si ton code est :
$id_user = $_SESSION['cle'];
        //...      
 $sql = "INSERT INTO pictures (id_user, image, note) VALUES ('$id_user','$num_photo','$vote')";

et que le résultat de ta requête donne
INSERT INTO pictures (id_user, image, note) VALUES ('','1','4') 
c'est que $id_user = '' (donc $_SESSION['cle'] = '') , $num_photo = 1 et $vote = 4

ça sert précisément à ça les lignes de vérification/débugages : connaître d'où vient l'origine du problème. Alors sert toi-en !

Maintenant tu peux faire aussi un
 if (empty($_SESSION['cle'])) echo 'session_clé est vide ou n\'existe pas '; else echo 'session_clé existe et  ='.$_SESSION['cle'];
pour être encore plus clair.

Posté : 27 janv. 2009, 16:45
par Ariochs
Bon voila tout marche correctement.

Le probleme en faite est que mon $_SESSION['cle'] ce nommé $_SESSION['ma_cle'] dans ma page de log..

Enfin du coup j'ai refait ma BDD avec un systeme d'upload d'image.

Si certain veulent le code complet, sa me derange pas de le mettre.



J'aurai encore autre chose a vous demandez. J'aimerai qu'une fois que l'utilisateur a voté, qu'on est a la place du menu déroulant et du bouton "envoyer" la moyenne de l'image.

Je sais comment calculer la moyenne, mais je ne vois pas comment remplacer le menu déroulant avec le bouton..

Je pense que je dois faire une verification de l'id_user sur chaque image et si il existe danbs la BDD lui dire d'afficher la moyenne. Si c'est ça, j'aimerai bien un peu d'aide pour partir, car la je vois comment coder en faite..

Merci

Posté : 27 janv. 2009, 16:49
par agité
Je viens de voir cette news sur nexen : http://www.nexen.net/actualites/php/189 ... system.php