probleme de jointures

Eléphant du PHP | 58 Messages

18 déc. 2011, 18:57

Bonsoir, j'ai encore besoin de votre fameuse aide :wink:

Dans ma base de donnée j'ai deux tables: comptes_utilisateurs et annonce.

Je me suis inscrit avec 2 nom d'utilisateur (exemple utilisateur-A & utilisateur-B) donc dans ma table comptes_utilisateurs j'ai mes 2 entrée jusque là parfait !

l'utilisateur-A, crée son annonce et elle s'enregistre bien dans la table annonce si il veut la visualiser il va dans son espace membre et elle s'affiche bien!

Mais si exemple l'utilisateur-B se connecte à son espace, il aura dans son espace l'annonce de l'utilisateur-A donc là: problème !!

Donc faut faire appel aux jointures, mais je suis perdu dans requête SQL et j'ai deux erreurs ....

Ma table comptes_utilisateurs
CREATE TABLE IF NOT EXISTS `comptes_utilisateurs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Nom_Utilisateur` varchar(20) CHARACTER SET utf8 NOT NULL,
  `Mot_de_Passe` varchar(40) CHARACTER SET utf8 NOT NULL,
  `Adresse_Email` varchar(255) CHARACTER SET utf8 NOT NULL,
  `Date_Inscription` int(10) NOT NULL DEFAULT '0',
  `Compte_Active` enum('0','1') CHARACTER SET utf8 NOT NULL DEFAULT '0',
  `Clef_Activation` varchar(8) CHARACTER SET utf8 NOT NULL,
  `hash_cookie` varchar(40) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Table annonce
CREATE TABLE IF NOT EXISTS `annonce` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `id_user` int(20) NOT NULL,
  `gamme` varchar(60) CHARACTER SET utf8 NOT NULL,
  `titre` varchar(100) CHARACTER SET utf8 NOT NULL,
  `description` mediumtext CHARACTER SET utf8 NOT NULL,
  `prix` varchar(100) CHARACTER SET utf8 NOT NULL,
  `contact` varchar(255) CHARACTER SET utf8 NOT NULL,
  `departement` varchar(50) CHARACTER SET utf8 NOT NULL,
  `avatar` varchar(100) CHARACTER SET utf8 NOT NULL,
  `date_annonce` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Ce que je ne comprend pas si par exemple l'utilisateur-A enregistre 2 annonces ou + dans id_user la valeur sera toujours 0

Ma requête préparé lors de la création de l'annonce
$query=$db->prepare('INSERT INTO annonce (
				     id_user
                                   , gamme
                                   , titre
                                   , description
                                   , contact
                                   , departement
                                   , prix
                                   , avatar								   
                                     )
                            VALUES (:id_user, :gamme, :titre, :description, :contact, :departement, :prix, :avatar)');
				$query->bindValue(':id_user', $gamme, PDO::PARAM_INT);	   
                        	$query->bindValue(':gamme', $gamme, PDO::PARAM_STR);	                        
	                        $query->bindValue(':titre', $titre, PDO::PARAM_STR);
                         	$query->bindValue(':description', $description, PDO::PARAM_STR);
                          	$query->bindValue(':departement', $departement, PDO::PARAM_STR);
			        $query->bindValue(':contact', $contact, PDO::PARAM_STR);
				$query->bindValue(':prix', $prix, PDO::PARAM_STR);
				$query->bindValue(':avatar', $nomavatar, PDO::PARAM_STR);
                                $query->execute();
Ma requête pour afficher mes annonces
$query=$db->prepare('SELECT titre, description, contact, departement, DATE_FORMAT(date_annonce, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr 
				 FROM annonce
				 INNER JOIN comptes_utilisateurs
                                 ON annonce.id_user = comptes_utilisateurs.id
				 ORDER BY id DESC
				 LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage.'');           
 $query->execute();

et mes 2 erreurs lors je veux voir mon annonce:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in order clause is ambiguous' in C:\wamp......

PDOException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in order clause is ambiguous in C:\wamp\....

Mammouth du PHP | 790 Messages

18 déc. 2011, 19:23

salut, regarde la: php-debutant/requete-une-comment-faire-t260658.html
j'avais eu le même genre de soucis...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

18 déc. 2011, 19:53

Column 'id' in order clause is ambiguous
Tes deux tables possèdent un champ id qui ne représentent pas la même chose, ton sgbd ne sait donc pas lequel prendre.
Prefixes le avec le nom de la table.

Eléphant du PHP | 58 Messages

18 déc. 2011, 20:09

Voila dans la table annonce, à la place de id j'ai mis "id_annonce" je n'ai plus d'erreur mais l'annonce s'affiche pas :(

ps: avant tout fonctionner!

voila ma requête pour afficher l'annonce :
$query=$db->prepare('SELECT titre, description, contact, departement, DATE_FORMAT(date_annonce, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr 
				 FROM annonce
				INNER JOIN comptes_utilisateurs
                                ON annonce.id_user = comptes_utilisateurs.id
			        ORDER BY id_annonce DESC
			       LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage.'');           
                $query->execute();




et es-que c'est normal que dans table annonce le champ id_user à chaque fois la valeur 0 à chaque création d'annonce , normalement il devrait pas avoir la valeur de l'id de la table comptes_utilisateurs vu c'est une jointure?

ViPHP
xTG
ViPHP | 7331 Messages

18 déc. 2011, 21:28

Bah encore faut-il lors de la création lui mettre la bonne valeur. :roll:
$query->bindValue(':id_user', $gamme, PDO::PARAM_INT);

Eléphant du PHP | 58 Messages

18 déc. 2011, 22:21

j'ai mis la bonne valeur :
$query->bindValue(':id_user', PDO::PARAM_INT);	
je ne vois pas pour être mon problème :(

je me suis connecté avec l'utilisateur-A j'ai enregistré mon annonce et dans ma table annonce la valeur id_user il y a écris 1 et je ne peux pas visualiser mon annonce

je me suis connecté avec l'utilisateur-B idem j'ai enregistré mon annonce et dans la table la valeur id_user est aussi à 1 et idem je ne peux pas visualisé mon annonce
$query=$db->prepare('SELECT titre, description, contact, departement, DATE_FORMAT(date_annonce, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr 
				  FROM comptes_utilisateurs
				   INNER JOIN annonce
                                   ON annonce.id_user = comptes_utilisateurs.id
				  ORDER BY id_annonce DESC
				 LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage.'');           
                $query->execute();
                
 
while ($donnees = $query->fetch(PDO::FETCH_ASSOC))
{
        $contenu = nl2br(htmlspecialchars($donnees['description'], ENT_QUOTES, 'UTF-8'));
        
		echo '<div class="couleurfon"><strong><span class="petitemaj">' . htmlspecialchars($donnees['titre'], ENT_QUOTES, 'UTF-8') . ' </span></strong><span class="couleurbleu"> le ' . $donnees['date_creation_fr'] . ' </span></div><div class="entier"> ' . $contenu . ' </div>';
}



Eléphant du PHP | 58 Messages

18 déc. 2011, 22:41

je rajoute la variable de session comme valeur
$query->bindValue(':id_user', $_SESSION['id'], PDO::PARAM_INT);		

maintenant mes annonce s'affiche bien , mais si exemple je me connecte avec utilisateur_B dans la partie "mes annonce" je vois les annonce de l'utilisateur_A ! je devrais voir uniquement les annonce de l'utilisateur_B

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 10:15

Tu n'as pas de clause WHERE dans ta requête de récupération pour dire qu'on ne récupère que ceux de l'utilisateur X. ;)

Eléphant du PHP | 58 Messages

19 déc. 2011, 10:49

Oui je m'en suis rendu compte ce matin qui me manqué la clause WHERE! Je l'ai rajouté et ça fonctionne parfaitement

Mais du coup plus besoin de jointure ça ne sert à rien dans mon cas :?:

je t’explique mon cas et tu me dira si c'est bon comme j'ai fais...merci
:wink:

Lors de la connexion d'un utilisateur exemple (utilisateur_A) j'ai une variable $_SESSION['id'] qui se créé.

Dans ma table annonce j'ai rajouté un champ id-user, quand l'utilisateur_A crée son annonce j'utilise cette requête:
$query=$db->prepare('INSERT INTO annonce (
				     id_user
                                   , gamme
                                   , titre
                                   , description
                                   , contact
                                   , departement
                                   , prix
                                   , avatar								   
                                     )
                                 VALUES (:id_user, :gamme, :titre, :description, :contact, :departement, :prix, :avatar)');
				$query->bindValue(':id_user', $_SESSION['id'], PDO::PARAM_INT);		   
                        	$query->bindValue(':gamme', $gamme, PDO::PARAM_STR);	                        
	                        $query->bindValue(':titre', $titre, PDO::PARAM_STR);
                         	$query->bindValue(':description', $description, PDO::PARAM_STR);
                          	$query->bindValue(':departement', $departement, PDO::PARAM_STR);
				$query->bindValue(':contact', $contact, PDO::PARAM_STR);
				$query->bindValue(':prix', $prix, PDO::PARAM_STR);
				$query->bindValue(':avatar', $nomavatar, PDO::PARAM_STR);
                                $query->execute();

et pour l'afficher j'utilise celle qui va suivre et je n'ai pas besoin de jointure et j'ai bien les annonces uniquement de l'utilisateur A et pas des autres utilisateurs
$query=$db->prepare('SELECT id_user, id_annonce, titre, description, contact, departement, DATE_FORMAT(date_annonce, \'%d/%m/%Y à %Hh%imin%ss\') AS date_creation_fr 
				  FROM annonce								   	
                                  WHERE id_user = :id_user								   
				  ORDER BY id_annonce DESC
				   LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);   
                $query->bindValue(':id_user',$_SESSION['id'], PDO::PARAM_INT);								   
                $query->execute();


ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 11:07

En effet, la jointure n'est utile que si tu souhaites aussi récupérer des informations de la table membre.

Eléphant du PHP | 58 Messages

19 déc. 2011, 11:48

Cool, merci je commence bien à comprendre :)

Et j'ai une question aussi sur le système d'annonce que je sens va me faire bouillir la tête :mrgreen:

Dans mon formulaire pour créer l'annonce j'ai une liste à puce que pour la personne choisi sa gamme(Clio, Mégane, GT turbo, etc) ou pièces(moteurs & boites, etc....)

Dans ma table j'ai le champ gamme qui aura la valeur de ce que la personne à choisi, (exemple il choisi "clio" dans ma base de donné au champ gamme il y aura comme valeur écrite "clio")

jusque là parfait :wink:

Mais là ça se complique... :(
Sur ma page 'annonce" les personne pourront visualiser toute les annonces rangées par catégories comme ceci:

Image

Donc si la personne clique sur (exemple:Mégane) il doit avoir toute les annonce e la gamme Mégane..

Donc comment organiser ma requête SQL pour dire (va chercher dans la table annonce les entrées avec le mot "megane")

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 12:31

Clause WHERE ? :)

Eléphant du PHP | 58 Messages

19 déc. 2011, 13:09

Ah oui avec la clause where on peut aussi récupéré la valeur d'une entrée? si exemple dans le champ gamme l'utilisateur à choisi GT turbo si je marque dans ma requête SQL
$query=$db->prepare('SELECT gamme
                                    FROM annonce 
	                            WHERE GT turbo = :test');
			  $query->bindValue(':test',$_COOKIE['pass'], PDO::PARAM_STR);
                          $query->execute();

ça va récupérer dans le champ gamme tout les entrée avec le mot GT turbo?

ViPHP
xTG
ViPHP | 7331 Messages

19 déc. 2011, 14:02

La clause WHERE travaille sur des champs d'une table :
SELECT gamme
FROM annonce
WHERE gamme = :test
Avec :test strictement égal au champ gamme que tu souhaites filtrer.