8797 sujets

Développement web côté serveur, CMS

Bonjour,

Une petite question me taraude.
Je suis entrain de tenter de faire un système de vérification php/MySQL de permissions rapide et un peu spécial.

D'un côté j'ai ma table permissions comprenant deux champs:
-nss_membre (qui est l'id utilisateur du membre)
-nss_perm (qui est le numéro d'accés qu'il a).
Un utilisateur à plusieurs entrés dans cette table, dépendant du nombre de cartes d'entrées dont il a accès, des fois l'utilisateur à même plusieurs entrées pour la même carte d'accés.

De l'autre côté j'ai un autre table, categorie, comprenant elle aussi deux champs:
-nss_cat (numéro de la catégorie, unique)
-nss_perm (les numéros d'accés demandés, séparés par des virgules).

Donc, lorsque j'accède à une page appartenant à la catégorie 1, je récupère le champ nss_perm qui correspond ici à 12,6,28,42.
Je dois donc vérifier dans la table permissions que l'utilisateur qui accède à la page a les cartes d'entrée 6,12,28,42.

Ma contrainte principal est que je ne peux pas modifier le système actuel de permission (qui en passant est vraiment nul) et je dois donc faire avec ce que l'on me donne.

Je recherche donc la méthode la plus efficace possible, car actuellement j'ai fait un script qui fonctionne mais qui est vraiment barbare et qui fait souffrir le serveur.

Merci à vous
Modifié par Avdss (22 Jan 2008 - 21:39)
Salut Avdss Smiley cligne ,

c'est vrai que le système actuel est pas terrible Smiley lol !

Quand tu dis :
a écrit :
des fois l'utilisateur à même plusieurs entrées pour la même carte d'accés.
ça veut dire que pour un même nss_membre tu peux avoir plusieurs fois le même nss_perm ?


Peut-être quelque chose comme ça :
<?php
$nss_perm = '12,6,28,42';
$tab_acces = explode(',', $nss_perm);
$nb_acces_necessaires = count($tab_acces); // Nombre d'accès nécessaires pour accéder à la catégorie
$sql = 'SELECT COUNT(DISTINCT(nss_perm)) as nb_acces FROM permissions WHERE nss_perm IN ('.$nss_perm.')';
$result = mysql_query($sql) or die (mysql_error());
$donnees = mysql_fetch_array($result);
if ($donnees['nb_acces'] == $nb_acces_necessaires) { 
	//OK : l'utilisateur a tous les accès nécessaires
} else {
	// Pas OK
}
?>

A+ Smiley smile
Modifié par Heyoan (22 Jan 2008 - 16:02)
Heyoan a écrit :
Salut Avdss Smiley cligne ,

c'est vrai que le système actuel est pas terrible Smiley lol !

Quand tu dis :des fois l'utilisateur à même plusieurs entrées pour la même carte d'accés.
ça veut dire que pour un même nss_membre tu peux avoir plusieurs fois le même nss_perm ?

Tout à fait! (Vraiment naze le système...)

Heyoan a écrit :
Peut-être quelque chose comme ça :
<?php
$nss_perm = '12,6,28,42';
$tab_acces = explode(',', $nss_perm);
$nb_acces_necessaires = count($tab_acces); // Nombre d'accès nécessaires pour accéder à la catégorie
$sql = 'SELECT COUNT(DISTINCT(nss_perm)) as nb_acces FROM permissions WHERE nss_perm IN ('.$nss_perm.')';
$result = mysql_query($sql) or die (mysql_error());
$donnees = mysql_fetch_array($result);
if ($donnees['nb_acces'] == $nb_acces_necessaires) { 
	//OK : l'utilisateur a tous les accès nécessaires
} else {
	// Pas OK
}
?>

A+ Smiley smile

Merci de ta réponse.

C'est pas bête, je vais tenter.
Avdss a écrit :
C'est pas bête, je vais tenter.
C'est même super ingénieux tu veux dire Smiley biggol !
C'est même super ingénieux Smiley lol (et le pire c'est que ça fonctionne...)

Une question subsidiaire avant que je mette résolu sur ce topic.
Comment puis-je trouver les cartes d'accés qui manquent au membre pour l'avertir.

Exemple:
J'ai mes permissions demandés: 12,48,14,5,25
Les permissions du membre sont: 1,13,5,48,26,12
il lui manque les cartes d'accès 14 et 25, comment retrouver ces 14 et 25 par une manipulation?

Merci
Modifié par Avdss (22 Jan 2008 - 18:09)
Vu que tes tables ne sont pas merisiennes on est obligé de ruser :
<?php
$nss_perm = '12,48,14,5,25';
$tab_acces = explode(',', $nss_perm);
$sql = 'SELECT DISTINCT(nss_perm) FROM permissions WHERE nss_perm IN ('.$nss_perm.')';
$result = mysql_query($sql) or die (mysql_error());
$acces_user = array();
while ($donnees = mysql_fetch_array($result)) {
	array_push($acces_user, $donnees['nss_perm']);
}
if (count($acces_user) == count($tab_acces)) { 
	//OK : l'utilisateur a tous les accès nécessaires
} else {
	// Pas OK
	$diff = array_diff($tab_acces, $acces_user);
	print_r($diff);
}
?>

Modifié par Heyoan (22 Jan 2008 - 18:36)
Tu as décidément envie de m'aider aujourd'hui.

Par contre ça coince un peu cette nouvelle requête.
print_r($diff); me renvoie toutes les permissions demandés.

par exemple pour $nss_perm = '1,2,3,17,35'; ou il manque seulement le 35 à l'utilisateur, ça me renvoie:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 17 [4] => 35 )
(Et puis moi, je n'en ai pas besoin sous forme de tableau, les chiffres séparés par des virgules iront)

Merci à toi
J'ai fait une petite modif pour les virgules et pour rajouter la sélection de l'utilisateur :
<?php
$id_user = 1;
$nss_perm = '12,48,14,5,25';
$tab_acces = explode(',', $nss_perm);
$sql = 'SELECT DISTINCT(nss_perm) FROM permissions WHERE nss_membre = '.$id_user.' AND nss_perm IN ('.$nss_perm.')';
$result = mysql_query($sql) or die (mysql_error());
$acces_user = array();
while ($donnees = mysql_fetch_array($result)) {
	array_push($acces_user, $donnees['nss_perm']);
}
if (count($acces_user) == count($tab_acces)) { 
	//OK : l'utilisateur a tous les accès nécessaires
} else {
	// Pas OK
	$diff = array_diff($tab_acces, $acces_user);
	$manquants = implode(', ', $diff);
	echo $manquants;
}
?>
par contre ça fonctionne chez moi Smiley rolleyes ...

Edit: il faudrait peut-être debbuger et rajouter un print_r($acces_user);
Modifié par Heyoan (22 Jan 2008 - 21:22)
Autant pour moi, c'était une grossière erreur de nom de variable de ma part...
print_r($acces_user) m'a aider à régler le problème.

Merci à toi pour tout
Modifié par Avdss (14 Dec 2008 - 21:44)