[RESOLU] Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

Re: Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

par moogli » 28 oct. 2016, 14:25

je n'ai pas indiqué de mettre des droits en dur, mais d'utiliser ceux de la personne connecté (récupéré à la connexion).
cela évite les requêtes complexe pour pas grand chose, sachant que ta dernière requête tu es obligés de faire une jointure non nécessaire avec la table des droits.

ensuite avoir une gestion plus simple et strict des droits me semble nécessaire car rien ne t'assure que tu en va pas avoir des problèmes de casse, de typo ou autre dans les droits (comme la suppression, renommage partiel etc).
De manière général quand on commence à mettre plusieurs données de façon structurés dans un champs de base de données c'est une erreur.
Ceci bien entendu quand ces données ont une utilité au point de vue structurelle;
En clair je ne dit pas qu'il ne faut pas stocker du csv, json, xml ou autre en base. Je dit que si la donnée est une données exploitable par la base c'est qu'il s'agit d'une entité / table a part.
cela va aussi dans la sens de la première forme nomal.


@+

Re: Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

par Ancien Utilisateur » 27 oct. 2016, 12:08

Merci pour ta reponse.

Je t'apporte plus de precisions, en fait les fiches c'est dynamique car on va en creer au fil du temps.
Du coup la page droit sera fournie par le nombre de fiche.
Je ne peux donc pas mettre de droit en fixe dans ma requête, ca doit comparer.

En gros je recupere le nom de la fiche et je verifie qu'il apparait dans la colonne droits.

Code : Tout sélectionner

SELECT nom_fiche FROM fiches WHERE droits LIKE "'.mysql_escape_string($_SESSION['droits']).'" AND login = "'.mysql_escape_string($_SESSION['login_ariane']).'"

Re: Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

par moogli » 27 oct. 2016, 11:47

salut,

il faut tester ce que tu trouves ave un client SQL (phpmyadmin, heidisql, mysqlworkbench etc).

donc
SELECT droits, login FROM membres, fiche WHERE (BETWEEN droits AND fiche) AND login = "'.mysql_escape_string($_SESSION['login_ariane']).'"

ceci n'est pas syntaxiquement correct ton oublie

la première semble plus correcte après il faut voir quoi comparer.

a priori les fiches ont des droits et il ne faut récupérer que celles qui correspondent aux droits de l'utilisateur courant ?

première chose : les droits de l'utilisateur courant doivent être récupérés à la connexion et mis en session (pas la peine de faire la recherche à chaque fois).
La requête se fera donc uniquement sur fiche.
ensuite il y a plusieurs possibilités :
- une fichie a un seul droit
- une fiche a une ou plusieurs droits

dans premier cas tu utilise la clause sql in
select les,colonnes from fiche where droit in ('1','2','3' ....)
dans le second cas il faut voir comment tu stock les x droit pour une fiche.

ce que tu fais pour les droits utilisateur est une erreur de conception.
tu devrais avoir une table droits (qui contient les droits ;) )
et une table qui fait la jointure entre droits et utilisateu. En clair deux colonnes qui forme la PK (cle primaire) qui sont toutes les deux des clefs étrangères (FK) vers droits et membres
create table droitsMembre (
id_droit int not null,
id_membre int not null
);
alter table droitsMembre add constraint PK_droitsMembre primary key (id_droit,id_membre);
alter table droitsMembre add constraint FK _droit_droitsMembre  foreign key (id_droit) references droits(id_droit);
alter table droitsMembre add constraint FK _membre_droitsMembre  foreign key (id_membre) references membre(id_membre );
un couple id_droit, id_membre accorde le droit "id_droit" au membre "id_membre"
si tu ne trouve pas couple c'est que le droit n'est pas accordé au membre.

Du coup tu as un tableau de droit en session que tu utilise pour les requêtes SQL ou l'affichage.


@+

Filtrer les données d'un tableau avec des valeurs sql séparées par virgules

par Ancien Utilisateur » 27 oct. 2016, 08:32

Bonjour,

Je souhaite filtrer un tableau php bouclé qui genere une liste de fiche depuis ma base de donnée.

Voici les données exemples :

Les habilitations du membre visiteur table "membres" (colonne "droits") dont les valeurs ressemblent a ceci "valeur1, valeur5, valeur6".

Dans ma BDD j'ai les valeurs "valeur1, valeur2, valeur3, valeur4, valeur5, valeur6".

Il faut que lorsque le visiteur consulte le tableau il ne puisse voir seulement les valeurs dont il dispose les droits.

J'ai trouvé sur le net que l'ont doit utiliser "LIKE".

Cela doit être jointé avec la table "fiche_liste".

Est-ce dans ce sens :

Code : Tout sélectionner

SELECT droits, login FROM membres WHERE droits LIKE '' AND login = "'.mysql_escape_string($_SESSION['login_ariane']).'"
ou

Code : Tout sélectionner

SELECT droits, login FROM membres, fiche WHERE (BETWEEN droits AND fiche) AND login = "'.mysql_escape_string($_SESSION['login_ariane']).'"
Merci beaucoup.