probleme d'attribution de droit

cendrine87
Invité n'ayant pas de compte PHPfrance

09 oct. 2006, 11:08

Bonjour,

Voila, j'essais de gérer les droit des utilisateurs.
Voici un extrait de la fenetre :
if ($_SESSION['login'])
{
	$sql = "SELECT lecture, ecriture, suppression
	FROM fichiers, accedepers, personnel
	WHERE fichiers.num_fic=accedepers.num_fic
	AND accedepers.num_pers=personnel.num_pers
	AND login= '".addslashes($_SESSION['login'])."'
	AND nom_fic='".addslashes($_SERVER['PHP_SELF'])."'";
	$req = mysql_query($sql) or die('Erreur SQL : <br />'.$sql);
	if (mysql_num_rows($req) > 0)
		{
		$data = mysql_fetch_assoc($req);
			switch($data['lecture'] && $data['ecriture'] && $data['suppression'])
			{ 
			case (($data['lecture']=='1') && ($data['ecriture']=='1') && ($data['suppression']=='1')):
				$droit = '111'; 
				break; 
			case (($data['lecture']=='1') && ($data['ecriture']=='1') && ($data['suppression']=='0')): 
				$droit = '110'; 
				break; 
			case (($data['lecture']=='1') && ($data['ecriture']=='0') && ($data['suppression']=='0')): 
				$droit = '100'; 
				break; 
			case (($data['lecture']=='0') && ($data['ecriture']=='0') && ($data['suppression']=='0')): 
				$droit = '000'; 
				break; 
			} 

quand je fait un
echo $droit; 
cela me donne 111.
quand je fait un
echo de $data['lecture'].' '.$data['ecriture'].' '.$data['suppression'];
j'ai 110.
110 est la vrai valeur. Alors pourquoi cela m'affiche 111. Ou es-ce que ce situe mon erreur, j'ai essayer de changer l'ordre des case et le echo $droit change tout le temps, et ne me donne jamais la vrai valeur.

Es-ce que vous auriez une idée ? merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 oct. 2006, 11:18

Le soucis vient, à mon avis, du fait que tu n'as pas compris comment fonctionne un switch/case

il ne s'agit en aucun cas d'un if/elseif

quand j'écrit ça :
switch ($toto)
{
  case 1:
    //du code...
    break:
  case 2:
    //encore du code ....
    break;
}
L'écriture équivalente serait
if ($toto == 1)
{
  //du code
}
elseif($toto == 2)
{
  //encore du code
}
le switch/case compare la valeur donnée dans le switch à la valeur donnée a chaque case. Toi, tu essaye de faire des tests dans chaque case.

Sinon, pour simplifier enormément ton problème, comme chaque type de droit contient 0 ou 1, il suffit de les concatener pour obtenir le chmod ;)
$droit = $data['lecture'].$data['ecriture']$data['suppression'];
Si lecture = 0, ecriture = 1 et suppression = 1, droit = 011 ;)

PS : au fait, le dernier droit, c'est "exécution", pas "suppression" ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

cendrine87
Invité n'ayant pas de compte PHPfrance

09 oct. 2006, 11:31

merci beaucoup, je n'y avait pas penser, j'aime bien me compliquer la vie!!!!! :D , c'est clair que c'est beaucoup plus simple.
Sinon je sais que c'est exécution mais moi par rapport a se que je veux faire, c'est suppression qu'il me faut. Merci beaucoup.

Pourquoi faire simple quand on peut faire compliquer, c'est ma devise!!!!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 oct. 2006, 11:32

Pourquoi faire simple quand on peut faire compliquer, c'est ma devise!!!!
Bienvenue dans le monde fabuleux du développement :langue:

Sinon, est-ce que tu as compris ton erreurs sur les switch/case ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

cendrine87
Invité n'ayant pas de compte PHPfrance

09 oct. 2006, 11:39

non franchement je ne voie pas se qui peut gener.
C'est qu'il n'accepte pas plusieurs choix ? Il faudrait que je fasse un switch pour lecture, un pour ecriture, un pour suppression ?

encore merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 oct. 2006, 11:45

en fait, il aurait fallut faire une concaténation et ensuite faire le switch sur ta concaténation et un case sur chaque cas (111, 110, 101, ...)

exemple de code valide
$test = $data['lecture'].$data['ecriture'].$data['suppression']
switch($test)
            { 
            case 111:
                $droit = '111'; 
                break; 
            case 110: 
                $droit = '110'; 
                break; 
            case 100: 
                $droit = '100'; 
                break; 
            case 000: 
                $droit = '000'; 
                break; 
            } 
si on traduit ta manière d'écrire le switch avec des if (comme mon 1er exemple), on aurait eu ça :
if (($data['lecture'] && $data['ecriture'] && $data['suppression']) == (($data['lecture']=='1') && ($data['ecriture']=='1') && ($data['suppression']=='1'))
{
  $droit = '111'; 
}
elseif ( ($data['lecture'] && $data['ecriture'] && $data['suppression']) ==     (($data['lecture']=='1') && ($data['ecriture']=='1') && ($data['suppression']=='0'))
{
  $droit = '110'; 
}...
Est-ce que tu comprends ton erreur maintenant ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

cendrine87
Invité n'ayant pas de compte PHPfrance

09 oct. 2006, 11:48

ok merci j'ai compris. ça peut servir pour une prochaine fois.