Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso implementare i privilegi del forum

Una maschera di bit delle autorizzazioni è meglio compresa se rappresentata come binaria, con ogni cifra che rappresenta un'autorizzazione attivata o disattivata. Quindi, se esistono i permessi X, Y e Z e ho accesso solo a X e Z, 101 rappresenterebbe che ho la prima e la terza autorizzazione concessi a me, ma non la seconda. Il numero binario 101 è equivalente al numero decimale 5 , quindi questo è ciò che finirebbe per essere archiviato nel database. Un singolo intero piccolo è un oggetto molto più efficiente da archiviare rispetto a una stringa o a più numeri interi piccoli.

MODIFICA: Mi sono reso conto di quanto fosse facile sfruttare le funzioni di conversione esistenti per ottenere un'implementazione piuttosto rapida. Ecco un esempio.

<?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";
}

Potresti ottenere prestazioni migliori se usi i loop, invece di tornare indietro da e verso le stringhe, ma questo illustra il principio in modo abbastanza chiaro.