IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Récupération des donné, mais multiplié [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Inscrit
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 151
    Points
    151
    Par défaut Récupération des donné, mais multiplié
    Bonjour,

    Voila ex : dans mon site j’ai 3 articles, j’essaye de les récupérer le problème au lieu qu’il m’affiche les 3 articles le script les multiplis par 8.

    Voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php 
    $server ="localhost";
    $user ="root";
    $pass ="******";
    $db ="mydb1";
    mysql_connect($server, $user, $pass) or die('Erreur de connexion');
    mysql_select_db($db) or die('Base inexistante');
     
     
    $sql = "SELECT * FROM ps_orders,ps_order_history , ps_customer,ps_address,ps_order_detail WHERE ps_orders.id_order = ps_order_history.id_order"; 
     
    $req = mysql_query($sql) or die('Erreur SQL !'.$sql.''.mysql_error()); 
    echo '<b>debut</b>; ';
    echo '<table border="1">';
    echo '<tr>';
    while($data = mysql_fetch_assoc($req)) 
    { 
     
    echo '<td>';
    echo '<!-- 1order_history -->';
    echo ''.$data['payment'].'; '; 
    echo ''.$data['total_paid'].'; '; 
    echo ''.$data['id_order'].'; '; 
    echo ''.$data['id_carrier'].'; '; 
    echo ''.$data['id_lang'].'; '; 
    echo ''.$data['id_customer'].'; '; 
    echo ''.$data['id_cart'].'; '; 
    echo ''.$data['id_currency'].'; '; 
    echo ''.$data['id_address_delivery'].'; '; 
    echo ''.$data['id_address_invoice'].'; '; 
    echo ''.$data['recyclable'].'; '; 
    echo ''.$data['gift_message'].'; '; 
    echo ''.$data['date_add'].' ; '; 
    echo ''.$data['id_order_state'].'; '; 
    echo '<!-- 2order_history --><br><br>';
     
    echo '<!-- 1customer -->';
    echo ''.$data['email'].'; '; 
    echo ''.$data['lastname'].'; '; 
    echo ''.$data['firstname'].'; '; 
    echo '<!-- 2customer --><br><br>';
     
    echo '<!-- 1address-->';
    echo ''.$data['company'].'; '; 
    echo ''.$data['address1'].'; '; 
    echo ''.$data['postcode'].'; '; 
    echo ''.$data['city'].'; '; 
    echo ''.$data['address2'].'; '; 
    echo ''.$data['other'].'; '; 
    echo ''.$data['phone'].'; '; 
    echo ''.$data['phone_mobile'].'; '; 
    echo '<!-- 2address--><br><br>';
     
    echo '<!-- 1product_id --> ';
    echo ''.$data['product_id'].'; '; 
    echo ''.$data['product_name'].'; '; 
    echo ''.$data['product_quantity'].'; '; 
    echo ''.$data['product_price'].'; '; 
    echo ''.$data['product_reference'].'; '; 
    echo '<!-- 2product_id --> <br><br>';
    echo '</td>';
    } 
     
    echo '</tr><tr>';
     
    echo '</table>';
    echo '<b>fin</b>; ';
     
    mysql_close();
    ?>

    Merci d’avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu utilises 3 tables dans ta requête mais tu n'as défini qu'une seule jointure.

    Au passage les jointures doivent s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tableA join tableB ON champ1 = champ2
    et non avec une clause WHERE.

  3. #3
    Inscrit
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 151
    Points
    151
    Par défaut
    Merci de m’avoir répondu

    Je crois que n’ai pas bien compris car j’ai réécrit le code comme ceci, mais ca donne la même chose


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM ps_orders join ps_order_history join ps_customer join ps_address join ps_order_detail  ON ps_orders.id_order = ps_order_history.id_order";

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tableA
    join tableB on champ1 = champ2
    join tableC on champ3 = champ4

  5. #5
    Inscrit
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 151
    Points
    151
    Par défaut
    1000 mercis sabotage

    Problème résolut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT * FROM ps_orders INNER JOIN ps_order_history ON (ps_orders.id_order = ps_order_history.id_order) 
    INNER JOIN ps_address ON (ps_address.id_customer = ps_orders.id_customer)
    INNER JOIN ps_customer ON (ps_customer.id_customer = ps_orders.id_customer)
    INNER JOIN ps_order_detail ON (ps_order_detail.id_order = ps_orders.id_order)";
    Par contre je voudrais savoir s’il est possible de récupérer mieux les articles
    Exemple :
    J’ai 3 articles
    Dans ps_orders j’ai 3 lignes
    Dans ps_address j’ai 2 lignes
    Mais dans ps_order_detail j’ai 4 lignes
    Chaque ligne correspond a un a articles sauf qu’il un article que logiquement doit récupérer 2 ligne par rapport au ps_orders.id_order
    Au lieu de 3 articles qui s’affichent j’ai 4 articles (le 4 emme avec la ligne qui manque a l’article 3).

    Avez vous une solution SVP.
    Merci d'avance

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu utilises 3 tables dans ta requête mais tu n'as défini qu'une seule jointure.

    Au passage les jointures doivent s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM tableA join tableB ON champ1 = champ2
    et non avec une clause WHERE.
    heu je suis pas entièrement d'accord
    de la doc mysql (bon apparemment c'est mal traduit)
    INNER JOIN et , (virgule) sont sémantiquement équivalents. Les deux opèrent une jointure totale sur les tables utilisées. Normalement, vous spécifiez les conditions de jointure dans la clause WHERE.
    cela dépend principalement de ce que tu veux obtenir, c'est juste qu'il lui manquait des conditions de jointure dans son WHERE

    donc normalement on devrai pouvoir aussi l'ecrire comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM ps_orders, ps_order_history, ps_address, ps_customer, ps_order_detail
    WHERE ps_orders.id_order = ps_order_detail.id_order
    AND ps_order_history.id_order = ps_orders.id_order
    AND ps_address.id_customer = ps_orders.id_customer
    AND ps_customer.id_customer = ps_orders.id_customer
    Attention l'ordre des conditions du WHERE modifie le résultat (normalement)

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce passage n'existe pas dans la documentation originale qui dit le contraire :
    Generally, you should use the ON clause for conditions that specify how to join tables, and the WHERE clause to restrict which rows you want in the result set.

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut
    @sabotage: la bonne blague, je vais plutot me référer à la version anglaise meaculpa ceci dit pour du INNER JOIN et pas de JOIN en général et selon les cas je pense pas avoir tord non plus

    pour avoir les résultats selon ps_order_detail devrai être ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "SELECT * FROM ps_order_detail";
    $sql.= "INNER JOIN ps_orders ON ps_orders.id_order = ps_order_detail.id_order";
    $sql.= "INNER JOIN ps_order_history ON ps_order_history.id_order = ps_orders.id_order";
    $sql.= "INNER JOIN ps_address ON ps_address.id_customer = ps_orders.id_customer";
    $sql.= "INNER JOIN ps_customer ON ps_customer.id_customer = ps_orders.id_customer";

  9. #9
    Inscrit
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Points : 151
    Points
    151
    Par défaut
    Merci a vous deux

    Les deux méthodes fonctionnent très bien

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération des données d'un formulaire
    Par placenargac dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/02/2006, 15h10
  2. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  3. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  4. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo