Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/01/2011, 13h24   #1
Inscrit
 
Inscription : septembre 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 260
Points : 98
Points : 98
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 :
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
Akim13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 13h32   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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 :
SELECT * FROM tableA join tableB ON champ1 = champ2
et non avec une clause WHERE.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 13h46   #3
Inscrit
 
Inscription : septembre 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 260
Points : 98
Points : 98
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 :
$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";
Akim13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 13h48   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tu dois avoir
Code :
1
2
3
tableA
join tableB on champ1 = champ2
join tableC on champ3 = champ4
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2011, 14h56   #5
Inscrit
 
Inscription : septembre 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 260
Points : 98
Points : 98
1000 mercis sabotage

Problème résolut

Code :
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
Akim13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 14h41   #6
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
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 :
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)
Citation:
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 :
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)
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2011, 15h24   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ce passage n'existe pas dans la documentation originale qui dit le contraire :
Citation:
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2011, 15h59   #8
Membre actif
 
Inscription : décembre 2006
Messages : 184
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 184
Points : 198
Points : 198
@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 :
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";
Helfima est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2011, 17h45   #9
Inscrit
 
Inscription : septembre 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 260
Points : 98
Points : 98
Merci a vous deux

Les deux méthodes fonctionnent très bien

Merci encore
Akim13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h21.


 
 
 
 
Partenaires

Hébergement Web