Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/11/2010, 20h05   #1
Invité régulier
 
Inscription : septembre 2009
Messages : 18
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 18
Points : 6
Points : 6
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 :
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 :
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 :
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
Mocodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h47   #2
Invité de passage
 
Inscription : septembre 2008
Messages : 7
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 7
Points : 2
Points : 2
Une piste avec PREPARE

Code :
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"');
benangi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 13h48   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
3
4
5
6
7
 
WHERE 
( Filtre1 IS NULL OR Colonne1 = Filtre1)
AND 
(Filtre2 IS NULL OR Colonne2 = Filtre2)
AND
...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 13h58   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 922
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 922
Points : 18 111
Points : 18 111
Envoyer un message via MSN à CinePhil
Citation:
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h25.


 
 
 
 
Partenaires

Hébergement Web