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 Perl Discussion :

Utilisation de join incomplète


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut Utilisation de join incomplète
    Bonjour, j'ai peur de ne pas utiliser join au meilleur de ses possibilités.
    Voilà mon problème !!

    J'ai un tableau dont les valeurs vont me permettre de remplir une clause d'une requête.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE t WHERE t.champs IN ('9','10','1')
    les valeurs 9,10,1 et un sont dans un tableau @tab;

    Lorsque j'utilise join ainsi pour construire ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $requete="SELECT * FROM TABLE t WHERE t.champs IN (".join(',',@tab).") ";
    J'obtiens le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE t WHERE t.champs IN (9,10,1)
    Ce qui provoque une erreur dans mysql. Au lieu de 9 il me faut '9'

    Puis-je y arriver avec la fonction join() ???

    Merci de vos réponses et bonne fin de journée !!!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: Utilisation de join incomplète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete="SELECT * FROM TABLE t WHERE t.champs IN ('".join("','",@tab)."') ";
    Peut-être
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour 2Eurocents !!
    Cette solution me donne:
    pour un tableau avec un seul élément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE t WHERE t.champs IN (9)
    Et pour un tableau avec 2 ou plus éléments:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE t WHERE t.champs IN (9','10)
    tout le monde est d'accord pour critiquer la pensée unique

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut


    Il n'y a pas que le "join" que j'ai changé

    Fais un copier/coller de mon code, tu verras ... ou regarde bien les quotes simples qui se trouvent autour des doubles-quotes, entre les parenthèses autour du join ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Aie Aie Aie, tu ou vous ( ) m'impressioner(a)(ez) toujours !!!!
    ça marche parfaitement !!!

    Merci beaucoup, c'est une super astuce !!!! Enfin pour moi, je trouve !!!!!

    Bonne soirée
    tout le monde est d'accord pour critiquer la pensée unique

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 56
    Points
    56
    Par défaut
    J'ajoute juste un truc que j'aime bien faire dans ces situations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $sql = "select * from table t where t.champs in (". join ", ", map { $dbh->quote($_) } @tab. ')';
    Je crois que ça peut aider pour empêcher le cross-site scripting. UPDATE: je viens de regarder la doc, $dbh->quote() n'aide pas contre le XSS, mais gère échappe bien les caractères qu'il faut.

  7. #7
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    La réponse de chostrama est préférable à celle d'2EuroCents, car ça ne marchera pas si une valeur de @tab contient un apostrophe.

    Genre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @tab = ( "Dupont", "O'Malley" )
    Le quoting, c'est vital en SQL.

    N

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Ne pratiquant pas le SQL conjointement avec Perl, je ne suis pas "aware" sur les subtilités du "quoting" - et je n'ai pas d'objet $dbh sous la main pour user de sa méthode quote qui est pourtant d'une propreté sans faille dans le cas présent.

    Juste une question ... si les valeurs de @tab contiennent des quotes mais qu'elles ont été passées à la moulinette quotemeta, ma méthode est-elle valide ? (je pense aux cas qui peuvent me concerner, sans base de données)
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    Non, parce quotemeta va transformer ' en \', or le plupart des moteurs SQL veulent un '' pour un apostrophe imbriqué, mais pas tous.

    Et comme ça dépend du moteur justement, DBD::foo::quote t'isole de ces différences. Tu utilises quote(), et tu es sûr que ça fera "The Right Thing" pour la base en question.

    N

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

Discussions similaires

  1. utilisation de "join"
    Par Invité(e) dans le forum Linux
    Réponses: 5
    Dernier message: 21/07/2010, 17h40
  2. utilisation LEFt JOIN ds une trigger DELETE
    Par moukit233 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/04/2010, 19h48
  3. utiliser inner join au lieu de where
    Par Jcpan dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/09/2009, 15h07
  4. problème d'utilisation du JOIN et du WHERE
    Par GphyProg dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/12/2005, 20h23
  5. Question sur utilisation du JOIN LEFT ON
    Par carolinebelle dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/07/2005, 14h57

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