vidzo Posté 5 Juillet 2009 Posté 5 Juillet 2009 Bonjour, J'ai besoin de votre aide pour construire l'architecture d'une base de donnée assez complexe. Je m'explique: On demande a un utilisateur de choisir une carte parmi une liste prédéfinie. Un certain nombre de paramètres sont associés à chaque cartes. Pour chaque paramètres, on demande à l'utilisateur de choisir parmi des valeurs prédéfinies. Jusqu'ici, tout va bien. Je créer : -une table carte, dans laquelle je liste les différentes cartes -une table paramètres dans laquelle je liste les différents parametres -une table de jointure carte-parametre qui relie l'id d'une carte avec l'id d'un paramètre. -une table valeur qui liste les différentes valeurs existantes -une table de jointure parametre-valeur, qui relie l'id d'un parametre avec l'id d'une valeur. La ou ca se complique, c'est que certaines combinaisons des valeurs renseignées entrainent de nouveaux paramètres, pour lesquels il faut à nouveau renseigner des valeurs qui peuvent à nouveau entrainer des paramètres... Je joint un fichier exel avec le shéma d'un exemple, et le modele de base de donnée (incomplet) avec les valeurs utilisées dans l'exemple remplies. Cela facilitera certainement la compréhension de mon problème. Vous trouverez le fichier exel ici: http://julien.lutel.free.fr/sql/bdd.xls Enfin, en fonction de toutes les différentes valeurs recueillies, on devra afficher la liste des competences maitrisées. Je créerai sans doute une table compétence qui listera toutes les compétences possibles, et une table qui associera l'id d'une alarme avec l'id d'un parametre et d'une carte. Mais c'est un autre problème, chaque chose en son temps, je voudrais d'abord réussir à construire le reste de l'architecture de la table. Je me doute que vous n'avez pas que ca à faire, mais si certains d'entre vous sont en vacances et s'ennuient (...) voyez ca comme un challenge ! Je remercie d'avance les âmes charitables qui accepteront de m'aider, et je retourne ma casser la tête...
Arlette Posté 6 Juillet 2009 Posté 6 Juillet 2009 Bonjour et bienvenue sur le Hub Ne rêve pas trop. Personne ne fera le travail à ta place et te le livrera tout fait ! On est ici pour donner des indications, pas pour faire le travail à la place des membres Maintenant si tu ne connais pas la gestion de bases de données, tu peux apprendre : http://livre.fnac.com/a1958888/Collectif-P...-les-nuls?PID=1
Ernestine Posté 6 Juillet 2009 Posté 6 Juillet 2009 Hello, Je n'ai peut-être pas tout saisi, mais si une valeur est rattachée à un unique paramètre, pourquoi avoir une "table de jointure" paramètre-valeur ? Pourquoi pas une simple clé étrangère dans la table valeur ?
vidzo Posté 6 Juillet 2009 Auteur Posté 6 Juillet 2009 Je n'attends pas que l'on me construise ma base, mais qu'on me donne quelques indications sur l'architecture que je devrais employer pour pouvoir modéliser une structure selon l'exemple du fichier exel. C'est vrai que la table de jointure paramètre-valeur est inutile ici, bien vu, je corrige. Et UNE table de gagné
SStephane Posté 6 Juillet 2009 Posté 6 Juillet 2009 Sur la structure, je vais pas m'étendre dessus, j'imagine que tu sais ce que tu veux, et ton truc a l'air à peu près cohérent (sans m'y être attardé). La ou ca se complique, c'est que certaines combinaisons des valeurs renseignées entrainent de nouveaux paramètres, pour lesquels il faut à nouveau renseigner des valeurs qui peuvent à nouveau entrainer des paramètres... Utilise un trigger, ça t'épargnera pas mal de code, et ça assainira ta base. je voudrais d'abord réussir à construire le reste de l'architecture de la table. J'espère que tu ne compte pas corriger le tir par la suite ?
vidzo Posté 6 Juillet 2009 Auteur Posté 6 Juillet 2009 Je suis sous mysql 4, et je ne peux pas upgrader, car je travaille pour une entreprise. Est-il possible d'utiliser des triggers avec une version mysql antérieure à la 5?
SStephane Posté 7 Juillet 2009 Posté 7 Juillet 2009 (modifié) J'espère pour toi que oui, je n'en suis pas persuadé, crée en un et vois le résultat Message subliminal : convainc ton entreprise de migrer sous mysql5 ou postgre Modifié 7 Juillet 2009 par SStephane
vidzo Posté 7 Juillet 2009 Auteur Posté 7 Juillet 2009 Ca ne dépend pas que de moi. Je fait partie d'un petit service dans une entreprise multinationale, ils comptent migrer en janvier. Mais je ne ferais plus partie de l'entreprise à ce moment la...
vidzo Posté 7 Juillet 2009 Auteur Posté 7 Juillet 2009 Bonjour, j'ai une nouvelle question, peut être un peu plus précise cette fois. Je vous indique le contexte: table Combinaison numéro id_val id_carte 1 1 3 1 2 3 1 3 3 2 1 3 2 2 3 2 4 3 2 5 3 (apaprament, certains espaces sont effacés lorsque je poste le message. Donc pour chaque ligne, le premier chiffre correspond au champ numero, le 2eme au champ id_val , et le 3eme au champ id_carte) On envoi i fois id_val par POST, et un id_carte. On connait le nombre i. On sait donc combien de reponses la requete devra récupérer. (i, pas une de plus ni une de moins) Quelle requete sql ecrire? La requete sera différente selon le nombre de valeurs envoyées par POST. Donc: $i=2; $req = $_POST['valeur1'] While ( isset($_POST['valeur.$i'])) { $req = "( $req . ' OR ' . $_POST['valeur.$i']) )"; $i ++; } Donc la requête est: "SELECT numéro from combinaison where id_carte= $_POST['carte'] AND $req;" Prenons un exemple. Imaginons que j'ai envoyé par POST les valeurs qui ont pour id 1,2 et 3. (id_val=1, 2 ou 3) et l'id de la carte 3. La requete me renvoie 3 fois le numéro 1, et 2 fois le numéro 2. Je sais que je cherche une combinaison de $i résultats. Ici, on a $i=3. Je veux donc récupérer le numéro 1 (car la requête renvoi $i fois le numéro 1, et ne pas prendre en compte le numéro 2, qui n'est renvoyé que 2 fois par la requête. Ma question : Comment puis-je faire cela? Il faut faire une nouvelle requete? Ou il suffit de rajouter un paramètre à ma requete précédente? Merci encore une fois de votre aide
Ernestine Posté 7 Juillet 2009 Posté 7 Juillet 2009 Salut, Là comme ça, et sans tout voir, je pense qu'il te faudrait utiliser dans ta requête : 1/ Une clause GROUP BY pour regrouper les résultats par numéro (GROUP BY numero) 2/ Un compteur du nombre de résultats pour chaque numéro (SELECT COUNT(*) AS quantite) 3/ Faire un tri par quantité décroissante (ORDER BY quantite DESC) 4/ Prendre le premier résultat (LIMIT 0,1) Un truc style : SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero ORDER BY quantite DESC LIMIT 0,1 Sinon, fais attention aux injections SQL, il ne faut jamais manipuler des données de formulaire comme ça directement dans la base.
vidzo Posté 7 Juillet 2009 Auteur Posté 7 Juillet 2009 Merci Ernestine. Je crois que tu as bien cerné mon problème.Le group by est intéressant. Par contre, je ne pense pas pouvoir utiliser le order by, car il ne faut pas que le nombre de numéros soit inférieur à $i, mais pas supérieur non plus. SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero AND where quantite= $i; Est ce que cette syntaxe est correcte? Je vais faire un petit tour sur la toile pour voir la syntaxe de GROUP BY. Sinon, tu me dis : " fais attention aux injections SQL, il ne faut jamais manipuler des données de formulaire comme ça directement dans la base. " Je pense que tu fais allusion à $i=2; $req = $_POST['valeur1'] While ( isset($_POST['valeur.$i'])) { $req = "( $req . ' OR ' . $_POST['valeur.$i']) )"; $i ++; } Je ne vois pas comment faire pour générer la requête autrement. Le nombre de paramètre varie.
Ernestine Posté 7 Juillet 2009 Posté 7 Juillet 2009 (modifié) Ah ben non, si tu veux sélectionner ceux qui n'ont que deux résultats il faut ajouter une clause HAVING : SELECT numero, COUNT(*) AS quantite FROM combinaison WHERE valeur=2 OR valeur=1 OR valeur=3 GROUP BY numero HAVING quantite=2 Pour les injections sql, il faut échapper les données de formulaire, sinon tu n'es pas à l'abri qu'un pirate poste le formulaire avec des données contenant elles-mêmes des requêtes lui permettant de s'introduire dans la base. Pour cela, il faut entrer les données de formulaire avec la fonction : http://fr.php.net/mysql_real_escape_string Voir aussi si sur ton serveur, les magic_quotes_gpc sont sur ON ou sur OFF. Modifié 7 Juillet 2009 par Ernestine
vidzo Posté 7 Juillet 2009 Auteur Posté 7 Juillet 2009 Ah d'accord, je vois mieux ce que tu veux dire. En fait, tout mes formulaires sont des select, donc l'utilisateur ne peut pas rentrer ce qu'il veut. Il est quand même conseillé de sécuriser les variables POST?
Ernestine Posté 7 Juillet 2009 Posté 7 Juillet 2009 L'utilisateur peut toujours rentrer tout ce qu'il veut, d'ailleurs rien ne l'oblige à poster le formulaire en passant par ton site. Il faut absolument sécuriser les données de formulaire, quelle que soit la requête, select ou autre.
vidzo Posté 7 Juillet 2009 Auteur Posté 7 Juillet 2009 Très bien, je prends note Merci pour ton aide.
Leonick Posté 8 Juillet 2009 Posté 8 Juillet 2009 En fait, tout mes formulaires sont des select, donc l'utilisateur ne peut pas rentrer ce qu'il veut.installe cet addon de firefox http://tamperdata.mozdev.org/help.html et tu verras qu'on peut modifier comme on veut des envois de formulaires en GET ou POST et là, c'est la version gentille.L'autre version se passera directement via un autre serveur, sans même passer par ton site avec l'envoi du POST Il faut donc bien vérifier toutes les données renvoyées par (soit-disant) un formulaire, et ce, sur le serveur, pas juste en js
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant