France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 512 membres enregistrés - 2 069 327 posts - 122 028 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Bases de données
                [SQL] Problème de jointure sur un champ vide
87 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
[SQL] Problème de jointure sur un champ vide

Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 01 h 53 m 18 s
Bon vous allez me dire : mais qu'est-ce que c'est que ce titre a la noix !
Je vais prendre un exemple :
J'ai une table joueur, une table alliance.

Dans ma table joueur, j'ai le nom du joueur, et l'identifiant de son alliance.
Dans la table alliance, j'ai l'identifiant de l'alliance et le nom de l'alliance.

Je voudrais dans une même requête chopper le joueur et l'alliance, jusque la tout va bien :

    Code     
1. SELECT `joueur`.`nom`, `alliance`.`nom`
2. FROM `joueur`
3. INNER JOIN `alliance` ON (`joueur`.`ID_alliance` = `alliance`.`ID_alliance`)

(oui je sais Bernie, le nommage toussa toussa, d'ailleurs je veux bien des conseils la dessus parcque je pêche un peu).
Donc mon problème, c'est que des fois le joueur a une alliance, auquel cas je récupère bien tout, d'autres fois le joueur ne fais partie d'aucune alliance, auquel cas le champ `joueur`.`ID_alliance` est egal a NULL (la valeur NULL, pas la string "NULL" hein) et donc l'INNER JOIN merde et je n'ai pas le résultat.
J'ai ce problème partout dans mon site, et j'aimerais arriver a le résoudre autrement qu'en faisant plusieurs requêtes, parcque ca deviens un peu lourd au bout d'un moment.

J'ai oublié de préciser : `joueurs`.`ID_alliance` est une FOREIGN KEY qui pointe sur `alliance`.`ID_alliance`.


Message édité 1 fois, la dernière par Woofy le 01 June 2006 - 01 h 54.


bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 01 June 2006 - 11 h 34 m 27 s
ça serait pas plutot OUTER JOIN qu'il faudrait ? Je sais le faire en Oracle (avec "+", mais en ansi99 j'ai un doute...

Un truc du genre :

Select a.joueur, a.nom, a.alliance, b.nom
from joueur a RIGHT OUTER JOIN alliance b on (b.alliance = a.alliance)
where a.alliance is null;

Je suis pas sur du tout, faut voir...

Sinon, la solution rustique :

select a.joueur, a.nom, a.alliance, b.nom
from joueur a, alliance b
where a.alliance = b.alliance
UNION
select a.joueur, a.nom, a.alliance, "***" from joueur a
where not exists (select b.alliance from alliance b where a.alliance = b.alliance)

EDIT : correction where a.alliance = b.alliance et pas where a.alliance ) b.alliance :unhappy:
Comme je dit précédemment, je suis pas du tout sur de ma solution "RIGHT OUTER JOIN", je suis plus habitué au standard Oracle (qui n'est pas standard d'ailleurs)


Message édité 1 fois, la dernière par bernie38 le 01 June 2006 - 17 h 39.

La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Erel69
- Ancien Modérateur -
Fantôme
Officiel

Messages : 19 554
Inscrit le 07/11/01
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 11 h 48 m 27 s
    Code     
1. SELECT `joueur`.`nom`, `alliance`.`nom`
2. FROM `joueur`
3. LEFT JOIN `alliance` ON `joueur`.`ID_alliance` = `alliance`.`ID_alliance`;




Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 11 h 56 m 29 s
Merci ! :)

Bernie : UNION c'est un peu porc, et j'aimerais eviter le WHERE quand il n'y a pas de condition particulière. Je voulais utiliser des JOIN parcque j'ai testé que c'était beaucoup (mais alors beaucoup) plus rapide sur de grosses bases de données que le WHERE, donc voila. Ptet que je me trompe hein, j'ai pas fait de recherche la dessus !

Bon, je me penche sur left et right join ! :)




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 01 June 2006 - 17 h 41 m 05 s
ben non, UNION c'est pas porc du tout, je vois pas pourquoi tu dis ça ? C'est du SQL...
Pour ce qui est du where, en effet si la table n'a pas un index efficace, ça peut faire un table scan et là, question perf, ben :hot:

Oui, penche toi sur les LEFT et RIGHT OUTER JOIN, parce que je maitrise mais alors pas du tout, faudrait que je me replonge dedans...



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 17 h 53 m 21 s
Bah si je peux eviter les unions, dans ce cas je pourrais faire un truc pour eviter les injections SQL. Niveau secu, c'est toujours ca de gagne.




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 01 June 2006 - 18 h 26 m 25 s
pas compris, là ?



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 18 h 28 m 26 s
Bah dans ma classe de gestion des requetes, j'abandonne la requete si elle contiens un UNION.
Bien sur ca ne dispense pas des addslashes, mais ca peut servir au cas ou j'en oublierais !




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 01 June 2006 - 18 h 33 m 22 s
pas compris pourquoi...



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 19 h 11 m 03 s
Parcque pour l'instant, l'union est le seul moyen que j'ai trouve pour faire de l'injection SQL.
Injection SQL : quelques exemples.
Suposont que on ai oublie de mettre un addslashes sur les parametres login et password d'un formulaire de connexion.
La requete est du type : SELECT `login` FROM `membre` WHERE `login`='$login' AND `password`=MD5('$password')

Supposons que tu rentre admin'-- comme login, et n'importe quoi en mot de passe :
    Code     
1. SELECT `login` FROM `membre` WHERE `login`='admin'--' AND `password`=MD5('password')
Au final, tout ce qu'il y a derriere les -- est ignoree et tu es logue avec le compte admin. C'est encore plus grave si tu oublie les quotes dans la requete, parcque meme avec un addslashes ca peut passer. Ensuite, UNION. Tu utilise toto' UNION insert into `membre` (login, password, rang) values ('hacker', MD5('1337'), 'administrateur')-- comme login.
    Code     
1. SELECT `login` FROM `membre` WHERE `login`='toto' UNION insert into `membre`  (login, password, rang) values ('hacker', MD5('1337'), 'administrateur')--' AND `password`=MD5('password')

La tu a carrement ajoute un utilisateur avec les droits d'admin.
Bon bien sur, ce genre d'attaque reste rare, est inutile ou presque sur des petits sites a la mort moi le noeud comme j'utilise (quoique ptet pas d'autres), mais rien n'empeche de prendre de bonnes habitudes ^^


Message édité 1 fois, la dernière par Woofy le 01 June 2006 - 19 h 11.


bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 01 June 2006 - 20 h 17 m 54 s
mais tout vient d'une erreur de codage. ça n'a rien à voir avec la clause where, l'union ou l'age du capitaine.
Même chose avec les overflow de buffer, ça empêche d'utiliser strcpy, ou memcpy ? Faut pas non plus exagérer, et se concentrer sur la qualité du code plutôt qu'édicter des ukases de ce type.

Et ce que tu appelles addslash ça serait pas plutôt back-slash ???



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 01 June 2006 - 21 h 44 m 00 s
Heu, c'est une fonction php addslashes (ou quelque chose qui s'en rapproche), excuse moi ^^

Oui, ce sont des erreurs de codage, mais bon les failles de sécuritée viennent tout le temps de là non ?




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 02 June 2006 - 08 h 57 m 36 s
oui, mais c'est pas une raison pour ne pas utiliser les fonctions qui vont bien ! C'est comme si je disais : j'utilise pas l'electricité, on peut s'électrocuter. Avec des précautions, on s'en sort. Ce conseil, c'est un de tes profs qui te l'a donné ? Parce que si oui, je sors mon dicton préféré : "mauvais prof, changer de prof" :D



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Woofy
Totalement inutile, complètement indispensable

Messages : 31 539
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 02 June 2006 - 10 h 31 m 50 s
Nop, j'ai pas de prof de PHP/SQL (enfin si Erel ^^).
Disons que j'utilise pas UNION, la seule manière de le retrouver dans une requête serait une injection SQL.
Je suis d'accord, c'est du bidouillage.




Erel69
- Ancien Modérateur -
Fantôme
Officiel

Messages : 19 554
Inscrit le 07/11/01
Ville : Lyon
Non connecté
  Posté le 02 June 2006 - 12 h 14 m 16 s


Le 02 juin 2006 - 10 h 31, Woofy a écrit :
Nop, j'ai pas de prof de PHP/SQL (enfin si Erel ^^).


Et je précise que c'est pas moi qui lui ai dit de pas utiliser les fonctions à risques qui ne le sont pas si bien codées :D




Page genérée en 0.1715 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory