Bonjour,
j'ai un problème depuis la migration de mon site de PHP5 > PHP7, j'ai une fonction afin de gérer les droits d'utilisateurs sur l'ensemble du site.
exemple :
rights->projets->view->allprojets
Je récupère l'ensemble des droits via une requête SQL :
$sql = "SELECT rights_def.module, rights_def.perms, rights_def.subperms FROM rights_def";
$resql=$this->bd->query($sql);
$data = $resql->fetchAll();
$resql->closeCursor();
$data =
| module | perms | subperms |
societe > edit
societe > view
projets > view > allprojets
Et ensuite je créer un Object comme ceci avec toutes les règles à false pour commencer, plus tard j'exécute une requête avec les droits de chaque utilisateur et je modifie par true si nécessaire :
foreach($data as $r){
if(!isset($this->rights)){
$this->rights = new stdClass();
}
if(!isset($this->rights->$r['module'])){
$this->rights->$r['module'] = new stdClass();
}
if(!isset($r['perms'])){
$this->rights->$r['module']->$r['perms'] = new stdClass();
}
if(isset($r['perms']) && !isset($r['subperms'])){
$this->rights->$r['module']->$r['perms'] = false;
}
if(isset($r['subperms']) && !empty($r['subperms'])){
$this->rights->$r['module']->$r['perms']->$r['subperms'] = new stdClass();
$this->rights->$r['module']->$r['perms']->$r['subperms'] = false;
}
}
Mais à ce moment, sous PHP7 j'ai un problème. lorsque $r['module'] change de société à projets, le code if(!isset($r['perms'])){}
pense que $this->rights->projets existe déjà et du coup ne pas créer pas $this->rights->$r['module'] = new stdClass();
ce qui pose problème pour la suite du code.
Sous PHP5 tout était parfait, mais lors de mon passage sous PHP7 ce code ne fonctionne plus :)
Pouvez-vous m'éclairer sur ce problème, cela fait plusieurs jours que je suis dessus... ?
Merci.
Salut,
Merci pour ton retour, malheureusement ta proposition m'obligeait à remplacer mon object en Array.
J'avais trop de modifications à faire sur l'ensemble du site, trop compliqué....
Je viens de trouver une solution qui fonctionne correctement, juste avec des {} ???
$this->rights->{$r['module']}->{$r['perms']}
au lieu de
$this->rights->$r['module']->$r['perms']
Bon, j'ai plus de problèmes de ce côté, heureux que ce soit résolu.
Merci pour ton aide en tout cas, c'est grâce à toi que j'ai trouvé :)
Hello,
C'est peut être "ta manière de faire" qui n'est pas compatatible avec PHP 7... est-ce que tu a des messages d'erreurs (NOTICE, WARNING, ou autre...) ?
Désolé j'ai complètement "planné"... je me suis gourré de sujet. Ce que j'ai proposé n'a rien à voir avec ton problème...
Bonjour,
Merci pour ton retour,
le message d'erreur est le suivant : Warning: Attempt to modify property 'Array' of non-object in [...]
Dans ton code, tu parle de la partie $xml ?
Désolé j'ai complètement "planné"... je me suis gourré de sujet. Ce que j'ai proposé n'a rien à voir avec ton problème...
Donc pour moi ton message d'erreur est assez concret, tu essaie de modifier un Array dans un objet qui n'en est pas un.
A ta place, je partirais plutôt sur cette base là :
foreach($data as $r){
if(!isset($this->rights)){ // bof bof... la propriété devrait déjà existée avec une valeur par défaut à "array()"
$this->rights = array();
}
if(!isset($this->rights[ $r['module'] ])) {
$this->rights[ $r['module'] ] = array('perms' => false, 'subperms' => false);
}
/*
Le reste est à revoir...
si le foreach suit directement la requête et qu'il n'y a pas de traitement de "$data" entre temps
alors il n'y a aucune raison pour que $r['perms'] et $r['subperms'] n'existent pas dans $r
la valeur sera à minima NULL ou une chaine vide
quoi qu'il en soit, l'utilisation de isset() n'est pas appropriée
il faut donc adapter les conditions en fonction de la valeur par défaut des champs "module", "perms" et "subperms"
*/
if(!isset($r['perms'])){
$this->rights->$r['module']->$r['perms'] = new stdClass();
}
if(isset($r['perms']) && !isset($r['subperms'])){
$this->rights->$r['module']->$r['perms'] = false;
}
if(isset($r['subperms']) && !empty($r['subperms'])){
$this->rights->$r['module']->$r['perms']->$r['subperms'] = new stdClass();
$this->rights->$r['module']->$r['perms']->$r['subperms'] = false;
}
}
Je te laisse ajouter les infos nécessaires.
à suivre ...