Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso implementar privilégios de fórum


Uma máscara de bits de permissões é melhor compreendida quando representada como binária, com cada dígito representando uma permissão ativada ou desativada. Portanto, se as permissões X, Y e Z existirem e eu tiver acesso apenas a X e Z, 101 representaria que tenho a primeira e a terceira permissões concedidas a mim, mas não a segunda. O número binário 101 é equivalente ao número decimal 5 , então é isso que acabaria armazenado no banco de dados. Um único e pequeno inteiro é um objeto muito mais eficiente para armazenar do que uma string ou vários pequenos inteiros.

EDITAR: Percebi como era fácil aproveitar as funções de conversão existentes para obter uma implementação bastante rápida. Aqui está uma amostra.
<?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";
}

Você pode obter um desempenho melhor se usar loops, em vez de puxar para trás e de strings, mas isso ilustra o princípio com bastante clareza.