sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo implementar los privilegios del foro?

Una máscara de bits de permisos se comprende mejor cuando se representa como binario, con cada dígito que representa un permiso activado o desactivado. Entonces, si existen los permisos X, Y y Z, y solo tengo acceso a X y Z, 101 representaría que tengo el primer y el tercer permiso otorgados, pero no el segundo. El número binario 101 es equivalente al número decimal 5 , entonces eso es lo que terminaría almacenado en la base de datos. Un solo entero pequeño es un objeto mucho más eficiente para almacenar que una cadena o varios enteros pequeños.

EDITAR: Me di cuenta de lo fácil que era aprovechar las funciones de conversión existentes para lograr una implementación bastante rápida. Aquí hay una muestra.

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

Puede obtener un mejor rendimiento si usa bucles, en lugar de retroceder hacia y desde las cadenas, pero esto ilustra el principio con bastante claridad.