Résultat de requête qui affiche en double

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Résultat de requête qui affiche en double

par France-Webmaster » 03 janv. 2007, 15:49

Bonjour, en fait j'ai exactement ou presque le même prpblème :

http://www.phpfrance.com/forums/voir_sujet-25727.php

Mais je n'est pas trouvé les mots pour l'expliqué !

Quelqu'un peut m'aider ?

Je n'est tout à fait suivi cette discution car il y a toute sorte de chose que je n'utilise pas dans mon code...

par Cyrano » 20 déc. 2006, 23:15

Ben c'est pas un problème : télécharge MySQL et lance l'installeur, ça fonctionne tout seul et en trois minutes tu auras une version à jour.

C'est ici que ça se passe

Revenons a ma première requête

par stefane321 » 20 déc. 2006, 21:31

Revenons à ma première requête.

Un nouveau problème est apparue.

Si j'ai 3 produits différents qui utilisent un même attribut (ex.: 2 produits qui peuvent être acheté en bleu id_attribut de bleu = 5)

Bien la requête va afficher 3 fois l'attribut bleu :?

Pour mon vieux mysql, pour moi se sera plus que 5 minutes car je ne n'ai jamais fait une installation de mysql.

Merci!

par Xenon_54 » 20 déc. 2006, 20:39

Durée d'installation de MySQL 5.0 : 5 minutes.
Temps gaspillé à réparer des bugs qui n'auraient jamais existé si tu avais mis à jour MySQL : :?:
Ça n'a pas de prix.

Pour tout le reste, il y a master card.

par Hubert Roksor » 20 déc. 2006, 20:30

Durée d'installation de MySQL 5.0 : 5 minutes.
Temps gaspillé à réparer des bugs qui n'auraient jamais existé si tu avais mis à jour MySQL : :?:

Ma version mysql

par stefane321 » 20 déc. 2006, 20:19

Version MySQL 3.23.51

C'est un serveur de développemeent locale.

J'envisage de l'upgrader lorsque j'aurai le temps (chose rare)

Merci!

Stéphane

par Cyrano » 20 déc. 2006, 20:04

Pas normal : je viens de tester directement tes deux requêtes en ligne de commande dans un premier temps et avec phpMyAdmin dans un second temps : aucune erreur n'est reportée et j'ai bien les résultats attendus.....

Quelle version de MySQL tu utilises ?

Sa fonctionne!

par stefane321 » 20 déc. 2006, 19:49

Bien merci à vous deux sa fonctionne avec la requête utilisant LEFT JOIN

J'ai essayé le tuto proposé par Cyrano.

J'essais en faisant copier/coller pour ensuite modifier les requêtes proposé mais il sempble y avoir une erreure de syntaxe dans les requêtes suivantes du tutoriel.

C'est se que phpmyadmin me dit.
SELECT `pers_prenom`, `pers_nom`, `tel_num`, `tel_type`
FROM `personnes` AS p
    JOIN `telephones` AS t
    ON p.pers_id = t.pers_id;

Code : Tout sélectionner

You have an error in your SQL syntax near 'ON p.pers_id = t.pers_id LIMIT 0, 30' at line 1
SELECT `pers_prenom` AS 'Prénom', `pers_nom` AS 'Nom', COUNT(`tel_id`) AS 'NbNums'
FROM `personnes` AS p
  LEFT JOIN `telephones` AS t
    ON p.pers_id = t.pers_id
GROUP BY `pers_nom`, `pers_prenom`
ORDER BY COUNT(`tel_id`) DESC;

Code : Tout sélectionner

Invalid use of group function
J'aimerais faire fonctionner le tuto pour bien comprendre.

Merci!

par Shrell » 20 déc. 2006, 19:06

$sql2 = "SELECT ap.id, ap.nom, pa.id, pa.id_produit, pa.id_attribut ". 
      "FROM produits_attributs AS pa, attributs_produits AS ap ". 
      "WHERE pa.id_produit=".$row["id"]." ". 
    "ORDER BY ap.id";
cette requete t'affiche uniquement les attributs du produit sélectionné, mais chacun est associé à toutes les lignes dans attributs_produits. Ce que j'essaierais de faire:
$sql2= "SELECT ap.id, ap.nom, pa.id, pa.id_produit, pa.id_attribut ".
        "FROM produits_attributs AS pa LEFT JOIN attributs_produits AS ap ".
        "ON ap.id=pa.id_attribut WHERE pa.id_produit='".$row['id']."'";
dans ce cas tu récupères uniquement les attributs qui sont associés à ton produit.

sinon, tu peux faire la jointure dans l'autre sens, et dans ce cas tu récupèreras tous les attributs possibles, et des champs différents de NULL si ils sont effectivement cochés pour le produit choisi :
$sql2= "SELECT ap.id, ap.nom, pa.id, pa.id_produit, pa.id_attribut ".
        "FROM attributs_produits AS ap LEFT JOIN produits_attributs AS pa ".
        "ON ap.id=pa.id_attribut";
remarque bien que dans ce dernier cas on enlève la clause WHERE pour ne pas se priver des enregistrements dans la table attributs_produits qui n'ont pas d'équivalent dans la table produits_attributs.
Ensuite tu n'as plus qu'à faire une boucle, tester si la valeur est NULL ou pas et cocher ta case le cas échéant

Une dernière chose : si tu n'utilises pas encore toutes ces tables ailleurs, je ne saurai trop te recommander de renomme ta table attributs_produits en attributs tout cours, afin de bien distinguer tes tables de valeurs (produits et attributs) de tes tables de liaison (produits_attributs)
mais ca, c'est toi qui vois :)

par Cyrano » 20 déc. 2006, 18:33

Voir ceci pour les requête avec jointure.

Mes enregistrements

par stefane321 » 20 déc. 2006, 17:06

Dans chacune de mes table les enregistrement sont unique.

Table attributs_produits:

Code : Tout sélectionner

id nom prix defaut ord_affiche 1 100g 6.00 1 0 2 15g 1.00 0 0 3 Blanc 0 0 0 4 Rose 0 0 0 5 Bleu 0 0 0
Table produits_attributs:

Code : Tout sélectionner

id id_produit id_attribut 1 2 1 2 2 2 3 3 3 4 3 4
J'ai rajoué deux enregistrements depuis mon dernier post pour tester.

Si dans ma requête j'enlève toutes sélections à la table produits_attributs les résultats ne sont pas en double mais je ne peux avoir la données nécessaires pour mettre une condition qui sélectionnera mon bouton radio quand l'attributs est attitré au produits en traitement.
$sql2 = "SELECT ap.id, ap.nom ".
        "FROM attributs_produits AS ap ".
        "ORDER BY ap.id";
Si je fais ceci j'obtiens seulement les attributs du produits en traitement:
$sql2 = "SELECT pa.id, pa.id_produit, pa.id_attribut ".
      "FROM produits_attributs AS pa ".
	  "WHERE pa.id_produit=".$row["id"]." ";
Mais ceci affiche en double car il y a deux enregistrement de la table produits_attributs qui correspondent si j'enlève la clause where sa affiche en quadruple (J'ai ajouter deux enregistrement à la table):
$sql2 = "SELECT ap.id, ap.nom, pa.id, pa.id_produit, pa.id_attribut ".
      "FROM produits_attributs AS pa, attributs_produits AS ap ".
	  "WHERE pa.id_produit=".$row["id"]." ".
    "ORDER BY ap.id";
J'ai l'impression que ma clause where pause probème ou carrément la requête.

J'ai déjà vu des requêtes utilisant quelques chose du genre INNER JOIN serait-ce plus approprié??

Si oui sa marche comment INNER JOIN?

Merci encore!

par Cyrano » 20 déc. 2006, 08:20

Question : exécute ta requête directement dans phpMyAdmin et vérifie si les enregistrements ne seraient pas également en double dans ta base :-k

Précision

par stefane321 » 20 déc. 2006, 00:28

En fait,

Au départ j'ai une table de produit, une table attributs_produits et produits_attributs

Dans la table de produit je stock son id, son nom, sa description et le nom de son image.

Mes produits on des choix de format et de couleur différentes.

Alors, je me suis fait une table pour stocker les formats et choix de couleurs possible.

C'est choix son ensuite enregistré dans ma table produits_attributs.

La requête qui me pose problème me sert dans ma page d'admistration du produit.

Je veux y faire afficher tous les choix d'attribut possible et que les attributs qui ont préalablement été attitré au produit soit sélectionné pour que l'utilisateur voit les attribus déjà enregistré et puisse choisir de changer les attributus du produis ou non.

J'espère que mon explication est compréhensible :roll:

ok

par stefane321 » 20 déc. 2006, 00:18

J'avais pas vu la réponse de Shrell.

Je vais y voir!

Résultat de requête encore en double

par stefane321 » 20 déc. 2006, 00:09

Merci.

1- Écrire mon code plus proprement:

J'ai remarqué que tu ne fait fait affiché le html par des echo et que tu as mis la requête sur plus d'une ligne.

C'est se que tu veux dire par mettre le code plus propre?

2- Avec la solution que tu m'as suggéré j'obtient exactement le même résultat de requête.

Merci!