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

SQL Procédural MySQL Discussion :

Selection passée en paramètre


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 18
    Par défaut Selection passée en paramètre
    Bonjour,

    je viens vers vous pour un petit coup de main, je travaille actuellement sur un projet (scolaire, rien à cacher, c'est un PTI de BTS IG), et je souhaiterai créer ma requète dynamiquement.

    Pour faire simple, en fonction des TextBox remplis, je génère une chaine de caractère que je souhaiterai passer en argument d'une procédure stockée dont voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE PROCEDURE `view_selected_subscribers`(param varchar(1024))
    BEGIN
    SELECT matricule AS 'Matricule', nom AS 'Nom', prenom AS 'Prenom', adresse AS 'Adresse', codePostal AS "Code Postal", ville AS 'Ville', dateNaissance AS "Date de Naissance", idCategorie AS 'CSP', telephone AS 'Telephone', mail AS "E-mail", dateAdhesion AS "Date d'Adhesion", admin AS "Est Admin?" FROM abonnes WHERE param;
    END $$
    Le problème c'est que je n'arrive pas à trouver le format de passage de cet argument "param", lorsque j'exécute ma requète à la main de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT matricule AS 'Matricule', nom AS 'Nom', prenom AS 'Prenom', adresse AS 'Adresse', codePostal AS "Code Postal", ville AS 'Ville', dateNaissance AS "Date de Naissance", idCategorie AS 'CSP', telephone AS 'Telephone', mail AS "E-mail", dateAdhesion AS "Date d'Adhesion", admin AS "Est Admin?" FROM abonnes WHERE abonnes.matricule = 1;
    J'ai bien un retour.
    Par contre lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL view_selected_subscribers(abonnes.matricule = 1);
    C'est une erreur 1109 qui m'attends. J'ai pensé que vu que j'envoie un varchar en paramètre, je devais l'entourer de simple, voir de de double quote, mais dans ce cas, exit l’Erreur, mais aucun enregistrement ne m'est retourné...

    Si vous aviez une petite piste, je vous en remercie

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 11
    Par défaut
    Une piste avec PREPARE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    delimiter $$
    DROP PROCEDURE IF EXISTS db2.`myProcedure`$$ 
    CREATE PROCEDURE db2.`myProcedure`(IN param varchar(1024))
    BEGIN
    SET @Q= CONCAT('SELECT * FROM db2.product WHERE ', param);
    PREPARE stmt FROM @Q;
    EXECUTE stmt;
    END $$
     
    delimiter ;
     
    USE db2;
    CALL myProcedure('reference = "ref1"');

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    attention,

    en faisant ainsi vous vous exposez aux attaques par injection SQL

    une solution certes pas sympa a mettre en place mais plus sure serait de définir un paramètre en entrée de votre procédure stockée pour chaque colonne susceptible d'être filtrée. ce paramètre doit être nullable

    ensuite dans la clause where de votre requete, vous pouvez mettre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WHERE 
    ( Filtre1 IS NULL OR Colonne1 = Filtre1)
    AND 
    (Filtre2 IS NULL OR Colonne2 = Filtre2)
    AND
    ...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    en fonction des TextBox remplis,
    Il y a donc une interface utilisateur développée dans un langage de programmation.
    Pourquoi ne pas préparer la requête dans le langage de programmation et l'envoyer au serveur une fois construite ?

    Attention quand même aux injections SQL !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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. Réponses: 3
    Dernier message: 01/02/2006, 21h31
  2. Problème de fstream passé en paramètre
    Par Beb8 dans le forum SL & STL
    Réponses: 2
    Dernier message: 11/04/2005, 11h51
  3. [SQL server 2000] bout de requete passé en paramètre
    Par guignol dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/08/2004, 17h45
  4. Réponses: 6
    Dernier message: 28/05/2004, 09h39
  5. Réponses: 5
    Dernier message: 27/11/2003, 10h55

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