[RESOLU] Duplication de données: Select From de plusieurs tables

Nico La
Invité n'ayant pas de compte PHPfrance

02 mai 2013, 13:58

Bonjour à tous,

Simple visiteur du forum depuis quelques années, j'ai pris mon courage à deux mains et décidé de passer contributeur.

Explication du problème:

J'ai une page php qui va chercher des données dans trois tables différentes:

- Table 1 = Nom, prénom, mobile
- Table 2 = Telephone fixe
- Table 3 = email

J'ai alors fait cette requête: $req = "SELECT * FROM table 1, table 2, table 3";

Suivi de l'appel aux valeur souhaitée:
$req = "SELECT * FROM table 1, table 2, table 3";
 
$result = mysql_query ($req) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
 
 
 
while ($row = mysql_fetch_array($result)){
 
echo '<table>
 
<tr>
 
<u>'. $row["nom"] .'
 
</tr>
 
<tr>
 
'. $row["prenom"] .'</u>
 
</tr>
 
Téléphone:
 
<tr>
 
'. $row["phone"] .'
 
</tr>
 
Mobile:
 
<tr>
 
'. $row["mobile"] .'
 
</tr>
 
Email:
 
<tr>
 
'. $row["email"] .'
 
</tr>
 
 </table>';

Aucun problème (pour moi) dans le code, jusqu'à ce que j'essai et que je vois mes champs bien remplis mais dupliqués X fois.

Je n'arrive pas à trouver le problème, j'esperais avoir une aide sur le forum.

Bonne journée à vous !

Nico

Eléphant du PHP | 51 Messages

02 mai 2013, 14:21

Bonjour,
En fait ton erreur vient de l'utilisation de la commande SELECT avec plusieurs tables, je te conseille de consulter des sites qui t'expliquent comment manipuler ces commandes. Pour ce qui est de l'explication de tes duplications cela vient du fait que cette requête ne possède pas de critère de jointure entre une table et l'autre. Dans ce cas, le compilateur SQL calcule le produit cartésien des deux ensembles, en gros à chaque ligne de la première table, il accole l'ensemble des lignes de la seconde.
Il est donc nécessaire de lui indiquer la clé de liaison avec un WHERE.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 mai 2013, 14:23

salut,


La comme ça je dirais que tu as fait un produit cartésien : ligne de table1 multiplier par le nombre de ligne de la table2 le tout multiplier par le nombre de tuple de la table 3 ...

Il te faut réaliser une jointure entre les tables.

La jointure c'est ce qui permet de faire la liaison entre les différentes tables (historie de savoir a qui appartient un email ;) )

Dans ton cas les tables sont surement de ce style

utilisateur (
id
nom
prenom
)

email (
idutilisateur
email
)

telephone (
idutilisateur
tel
)

la requête devient donc à ça
select * from utilisateur 
join email using(idutilisateur)
join telephone using(idutilisateur)
@+
Il en faut peu pour être heureux ......

Nico La
Invité n'ayant pas de compte PHPfrance

02 mai 2013, 14:36

Un grand merci pour vos réponses, en effet je commence à voir le problème !

J'ai donc essayais différentes façon d'utiliser ton code:
SELECT * FROM utilisateur 
JOIN email USING(idutilisateur)
JOIN telephone USING(idutilisateur)
Cependant je n'ai que des erreurs. Que faut-il mettre dans idutilisateur ?

Sachant que mes tables sont sous cette forme:

vid = 106
nid = 106
name = Dubois
first = Jean

(VID et NID sont tous deux idutilisateur).

Nico La
Invité n'ayant pas de compte PHPfrance

02 mai 2013, 14:40

Je souhaitais vous remercier !
J'ai finalement réussi depuis hier matin que je cherchais !

Encore un grand merci !

Bonne journée à vous.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 mai 2013, 14:43

de rien
Il en faut peu pour être heureux ......