Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je implémenter les privilèges du forum

Un masque de bits d'autorisations est mieux compris lorsqu'il est représenté sous forme binaire, chaque chiffre représentant une autorisation étant activée ou désactivée. Donc, si les autorisations X, Y et Z existent et que je n'ai accès qu'à X et Z, 101 représenterait que j'ai les première et troisième autorisations qui m'ont été accordées, mais pas la seconde. Le nombre binaire 101 est équivalent au nombre décimal 5 , c'est donc ce qui finirait par être stocké dans la base de données. Un seul petit entier est un objet beaucoup plus efficace à stocker qu'une chaîne ou plusieurs petits entiers.

MODIF : J'ai réalisé à quel point il était facile de tirer parti des fonctions de conversion existantes pour obtenir une mise en œuvre assez rapide. Voici un exemple.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

Vous pourriez obtenir de meilleures performances si vous utilisez des boucles, plutôt que de tirer vers et depuis des chaînes, mais cela illustre assez clairement le principe.