gpt4 book ai didi

php - 哪种数据类型适合存储这种情况?

转载 作者:行者123 更新时间:2023-11-30 10:50:31 24 4
gpt4 key购买 nike

比如我有一个用户,这个用户有不同的用户权限,比如一个用户可以有

-create file
-read file
-update file
-delete file

4个权限,我可以使用4个BOOL来查找用户权限,但是如果用户有更多的权限,我需要创建越来越多的BOOL来存储权限。我不认为这是一个好主意。我想为此获得一个长整数...例如,用户可以做的所有事情是 1111。创建文件为1000,读取文件为100,更新为10,删除为1。因此,如果用户仅获得读取文件权限为0100。

有没有更好的idea??谢谢。

最佳答案

我建议将特权(权限)转换为二进制状态字符串,然后将其作为长整型或十六进制字符串(VARCHAR;用于存储大量权限)存储在数据库中。

例子

$privileges_list = array(
0 => 'create_file',
1 => 'read_file',
2 => 'update_file',
3 => 'delete_file',
4 => 'create_pool',
5 => 'vote_in_pool',
6 => 'create_gallery',
7 => 'upload_images',
8 => 'view_statistics'
);

所以如果你想给用户设置create file, update fileview statistics 权限,只需在字符串中适当的位置加上1 (0, 2, 8) 其余为 0

$binary_string = "100000101";

此字符串中的最后一个字符是位置 0,第一个字符是位置 8。

现在您可以将此字符串转换为整数 (261) 或十六进制数 (105),并将其作为该用户的权限集(我更喜欢十六进制)放入数据库。

要将此值转换回特权列表,您可以使用类似这样的东西

function hexvalue2privileges($hexvalue, $plist) {
$res = array(); $res_assoc = array();
for ($i = strlen($hexvalue) - 1; $i >= 0; $i--) {
$bin = str_pad(decbin(hexdec(substr($hexvalue, $i, 1))), 4, '0', STR_PAD_LEFT);
$bin_array = array_reverse(str_split($bin, 1));
foreach ($bin_array as $bitstate) $res[] = $bitstate == '1' ? true : false;
}
foreach ($plist as $key => $id) {
$res_assoc[$id] = $res[$key];
}
return $res_assoc;
}

并调用这个函数

print_r(hexvalue2privileges('105', $privileges_list));

输出将是

Array
(
[create_file] => 1 // true
[read_file] => // false
[update_file] => 1 // true
[delete_file] => // false
[create_pool] => // false
[vote_in_pool] => // false
[create_gallery] => // false
[upload_images] => // false
[view_statistics] => 1 // true
)

对于每个十六进制字符,您可以存储 4 个权限,因此使用此公式计算所需的字符数

$chars_needed = floor((count($privileges_list)-1) / 4) + 1; // result 3

获取二进制字符串的总长度

$binary_length = $chars_needed * 4; // result 12

固定权限集的长度

$binary_string = "100000101";
$binary_string = str_pad($binary_string, $binary_length, '0', STR_PAD_LEFT);
// result '000100000101'

将$binary_string 转换为十六进制

$binary_string = "000100000101";

$hexvalue = "";
$groups = str_split($binary_string, 4);
foreach ($groups as $group) $hexvalue .= dechex(bindec($group));

// result $hexvalue='105' (1=0001, 0=0000, 5=0101)

您还可以创建权限组,并通过为每个组(管理员、版主、 guest 、vip 等)创建权限集来将它们分配给用户。

希望对你有帮助

关于php - 哪种数据类型适合存储这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5665831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com