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

Langage SQL Discussion :

Recherche dans plusieurs tables


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut Recherche dans plusieurs tables
    Bonjour à tous !

    Après avoir lutté toute la matinée sur un problème assez bête, je me décide à demander ici, ça doit être trivial et je ne le vois pas ...

    Mon soucis : j'ai deux tables "utilisateurs" (en gros une table user et une table admin, je n'ai pas le droit de fusionner les deux).

    Quand je veux chercher une personne (par exemple pour récupérer le mot de passe en base et le vérifier au moment d'un login), j'essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT admin.password, user.password FROM "admin","user" WHERE login=\''.$login.'\' AND id=\''.$id.'\'';
    Le problème quand je fais ça, c'est qu'il trouve bien le résultat (quand je lance mon exemple, le login et l'id corresponde à un admin) sauf que la requête me renvoie autant de lignes que les deux tables réunies, et chaque ligne contenant le même password, celui que j'ai demandé.

    J'ai également essayé quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT password FROM "admin","user" WHERE login=\''.$login.'\' AND id=\''.$id.'\'';
    Mais là j'ai une erreur php : Query failed: ERREUR: la référence à la colonne « password » est ambigu .

    Comment puis-je corriger ma requête, sachant que dans ce cas de figure, elle ne devrait renvoyer qu'un seul résultat toujours ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    la modélisation laisse à désirer...


    Bref, si vous cherchez un utilisateur qui se trouvent ou non dans la table admin, il vous faudra 2 requêtes distinct et les relier via un union ou un union all selon votre besoin.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Forcément ! Tu fais le produit cartésien des deux tables !

    Tu cherches à vérifier la connexion d'un utilisateur, qu'il soit simple utilisateur ou administrateur ?

    Ce qui m'étonne quand même, c'est que dans ta requête tu connais déjà l'id de l'utilisateur. C'est donc qu'il est déjà connecté non ?

    Le processus classique, c'est :
    1) L'utilisateur fournit son login et son mot de passe au système
    2) Le système cherche dans la BDD un user ou un admin qui correspond à ce login et à ce mot de passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id
    FROM user
    WHERE login = '$login'
    	AND password = MD5('$password')
    UNION
    SELECT id
    FROM admin
    WHERE login = '$login'
    	AND password = MD5('$password')
    Si un utilisateur peut figurer dans les deux tables avec deux id différents, cette requête te retournera les deux id.

    Et au passage, j'espère que tes variables sont protégées en amont contre les injections SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Je cherche à savoir si c'est un admin ou un user. Et effectivement j'avais mal fait mon exemple, car je n'ai pas l'id ^^.

    Je ne peux pas vérifier le password de cette façon, car je le stock crypté avec un salt accolé, donc je dois extraire le password pour faire le calcul et ensuite vérifier.

    Pour ce qui est de la protection contre les injections sql, j'ai lu quelques trucs assez vagues, je vais chercher comment faire avec postgresql.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par cyscek Voir le message
    Je cherche à savoir si c'est un admin ou un user. Et effectivement j'avais mal fait mon exemple, car je n'ai pas l'id ^^.
    Donc mon hypoyhèse et ma solution sont bonnes ?

    Je ne peux pas vérifier le password de cette façon, car je le stock crypté avec un salt accolé, donc je dois extraire le password pour faire le calcul et ensuite vérifier.
    Il suffit alors de supprimer la fonction MD5 de ma requête. C'était juste pour donner un principe.

    Pour ce qui est de la protection contre les injections sql, j'ai lu quelques trucs assez vagues, je vais chercher comment faire avec postgresql.
    Ce n'est pas différent avec Postgresql.
    C'est juste le principe qu'il ne faut pas donner directement de variables issues de POST ou GET à une requête sans vérifier qu'elles ne contiennent rien de dangereux.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Effectivement la solution était la bonne

    J'ai utilisé le mysql_real_escape_string pour vérifier mes variables, ça n'a aucune incidence sur le fait que j'utilise postgresql je présume ?

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Utilise plutôt pg_escape_string
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. recherche dans plusieurs tables
    Par cyscek dans le forum Débuter
    Réponses: 10
    Dernier message: 15/05/2012, 12h46
  2. Recherche dans plusieurs tables
    Par vero3030 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 18/10/2007, 14h21
  3. [MySQL] recherche dans plusieurs tables
    Par minimoof dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/08/2007, 08h58
  4. recherche dans plusieurs tables
    Par rostomides dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/03/2007, 09h34
  5. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 19h04

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