Gestions des droits

Mammouth du PHP | 1668 Messages

24 août 2008, 17:26

Bonjour à toutes et tous,

j'avais posté il y a déjà quelques temps un topic sur le même sujet, mais j'ai un autre problème...
J'ai ésitez à mettre ce topic ici, j'avais le choix entre la POO (mon architecture est basée sur ce principe), le SQL et la méthodologie, je sais que vous vous en fichez :lol:
Voilà, j'ai un forumlaire de gestions des droits qui va me transmettre un tableau multidimensionnel, le problème, ou plutôt les problèmes c'est de savolirs quels droits ont été modifiés et surtout comment faire pour qu'en un minimum de requête la mise à jour soit faite. j'ai également un troisième problème, j'utilise un cache par session pour les droits, comment faire pour que l'utilisateur n'est pas à se reconnecter ?

Par avance merci de votre aide,

NB : chaque membre possède 23 droits sous contraintes par "catégories", donc ce service est beaucoup sollicité :/

PS : Configuration PHP : 5.2 et SQL : PostGreSQL 8.3 :D
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 1511 Messages

24 août 2008, 22:40

Peux tu poster le modéle de ta table de gestion des droits ? Merci ;)

Mammouth du PHP | 1668 Messages

25 août 2008, 13:12

no problème :

Code : Tout sélectionner

CREATE TABLE `droits_r_categorie` ( `fk_categorie` int(11) NOT NULL, `fk_membres` int(11) NOT NULL, `voir` int(11) NOT NULL, `repondre` int(11) NOT NULL, `editer_ses_messages` int(11) NOT NULL, `editer_messages` int(11) NOT NULL, `supprimer_ses_messages` int(11) NOT NULL, `supprimer_message` int(11) NOT NULL, `blocker_son_topic` int(11) NOT NULL, `blocker_topic` int(11) NOT NULL, `deblocker_son_topic` int(11) NOT NULL, `deblocker_topic` int(11) NOT NULL, `deplacer_son_topic` int(11) NOT NULL, `deplacer_topic` int(11) NOT NULL, `gerer_ses_droits` int(11) NOT NULL, `gerer_droits` int(11) NOT NULL, `bannir_membre` int(11) NOT NULL, `debannir_membre` int(11) NOT NULL, `placer_postit` int(11) NOT NULL, `placer_annonce` int(11) NOT NULL, `changer_postit` int(11) NOT NULL, `changer_annonce` int(11) NOT NULL, `enlever_postit` int(11) NOT NULL, `enlever_annonce` int(11) NOT NULL, );
sachant que les droits doivent contenir des booléens...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 1511 Messages

25 août 2008, 14:39

Oula, ca fait beaucoup de droits...
Certains peuvent êtres simplifiées.
Un utilisateur qui peut locker un topic peut aussi le délocker? Logique non ?
Pour des champs booléens, un INT(1) suffit vu que tu ne mets que 1 ou 0.

Autre petit point, pourquoi pour chaque membre ? Pourquoi ne pas faire des groupes plutôt ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 août 2008, 15:09

Pour des champs booléens, un INT(1) suffit vu que tu ne mets que 1 ou 0.
La valeur idéale serait plutôt un TINYINT, puisque qu'ici la valeur entre parenthèses sert à ça :
Un autre extension supportée par MySQL permet de spécifier optionnellement la taille d'affichage, sous la forme d'une valeur entière entre parenthèses, juste après le mot clé spécifiant le type (par exemple, INT(4)). Cette spécification de taille est utilisée pour remplir à gauche, avec le caractère de remplissage par défaut, les nombres dont la taille est inférieure à celle spécifiée mais uniquement à l'affichage : cela ne réduit pas l'intervalle de validité des valeurs qui peuvent être stockées dans la colonne.
:arrow: http://dev.mysql.com/doc/refman/5.0/fr/ ... types.html

Donc un INT sur 4 octets qui va de -2147483648 à 2147483647 pour stocker 0 ou 1 c'est un peu beaucoup non ?

Par contre un TINYINT sur 1 octet, qui va de -128 à 127, c'est mieux. C'est d'ailleurs ce qui est utilisé par MySQL pour remplacer le booléen.
BOOL, BOOLEAN

These types are synonyms for TINYINT(1). The synonym BOOLEAN was added in MySQL 4.1.0. A value of zero is considered false. Non-zero values are considered true:
:arrow: http://dev.mysql.com/doc/refman/4.1/en/ ... rview.html

Mammouth du PHP | 1668 Messages

25 août 2008, 15:41

Je penses que ça marche pareil pour PostGreSQL, je sais que ça pourrait être simplifié, mais j'ai pas tellement le choix :/

Pour les groupes, on a des profiles de droits que l'on applique, mais pas de groupes "dynamique"...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 août 2008, 16:21

Ah ouais c'est du Postgre... pardon :oops:

Mammouth du PHP | 1668 Messages

25 août 2008, 18:26

Ah ouais c'est du Postgre... pardon :oops:
T'inquiet pas j'ai l'habitude, j'ai pensé à un truc :

Je peux faire une requête pour récupérer tout les membres et comparer les droits envoyés et les droits en BDD, ça va bien limiter les requêtes, ensuite, je peux prélevés leurs changements, et les organiser (regrouper) par droits, par contre, je ne vois pas comment faire la seconde chose et encore moins un regroupement par "paquets" de plusieurs droits identiques...

Exemple :
<?php
$tab=array();
// $tab["pk_utilisateur"]
$tab[1]=array("manger" => 1, "boire" => 1, "dormir" => 0);
$tab[2]=array("manger" => 1, "boire" => 0, "dormir" => 1);
$tab[3]=array("manger" => 0, "boire" => 1, "dormir" => 1);
$tab[4]=array("manger" => 1, "boire" => 0, "dormir" => 0);
$tab[5]=array("manger" => 0, "boire" => 1, "dormir" => 1);
j'aimerais faire une fonction qui puissent faire les modifs en un minimum de changement... comment faire ?
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 185 Messages

26 août 2008, 05:29

Un truc comme ça ?
<?php

// Tableau des droits d'origine
$tab=array(); 
// $tab["pk_utilisateur"] 
$tab[1]=array("manger" => 1, "boire" => 1, "dormir" => 0); 
$tab[2]=array("manger" => 1, "boire" => 0, "dormir" => 1); 
$tab[3]=array("manger" => 0, "boire" => 1, "dormir" => 1); 
$tab[4]=array("manger" => 1, "boire" => 0, "dormir" => 0); 
$tab[5]=array("manger" => 0, "boire" => 1, "dormir" => 1);

// Tableau des droits modifiés
$tab2 = $tab;

$tab2[2]["manger"] = 0;
$tab2[4]["manger"] = 0;
$tab2[3]["manger"] = 1;
$tab2[3]["boire"] = 0;

// Tableau des changements (à remplir)
$tab3 = array();

foreach($tab as $u => $d) // user -> droit
{
	// On veut les droits qui change, on pré-sélectionne pour chaque utilisateur
	if ($d == $tab2[$u]) continue;
	
	static $liste_droits = array("manger", "boire", "dormir");
	
	// Pour les utilisateurs dont les droits ont changés, on regarde ce sont lesquels
	foreach($liste_droits as $n)
	{
		if ($d[$n] != $tab2[$u][$n])
		{
			// Et on rempli le tableau des changements comme ça nous arrange :)
			if (empty($tab3[$n][$tab2[$u][$n]]))
				$tab3[$n][$tab2[$u][$n]] = array($u);
			else
				$tab3[$n][$tab2[$u][$n]][] = $u;
		}
	}
}

// Le résultat
print_r($tab3);

// Et les requêtes SQL faisable
foreach($tab3 as $d => $liste)
{
	foreach($liste as $v => $users)
	{
		echo 'UPDATE droits SET '.$d.' = '.$v.' WHERE user IN ('.implode(',', $users).')';
		echo '<br />';
	}
}

Mammouth du PHP | 19672 Messages

26 août 2008, 09:37

Pour le type de données à choisir, un rapide coup d'œil dans la doc de PostGreSQL t'aurait donné la réponse : http://docs.postgresqlfr.org/8.1/datatype-boolean.html
:-*
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1668 Messages

26 août 2008, 13:11

Pour le type de données à choisir, un rapide coup d'œil dans la doc de PostGreSQL t'aurait donné la réponse : http://docs.postgresqlfr.org/8.1/datatype-boolean.html
:-*
A noté que ce n'était pas le but du topic,

Pour ta réponse savegeman, je vais l'étudier, on m'a également orienté vers un algorithme génétique : puis par regroupement arriver à mes fins....
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol