Php 如何在数据库中构造一些数据以便以后检索

Php 如何在数据库中构造一些数据以便以后检索,php,mysql,database,Php,Mysql,Database,我有一组复选框,管理员可以勾选这些复选框来授予用户权限。在我的情况下,管理员可以单击以下复选框:。这些复选框将允许用户查看这些国家/城市的数据 我正在绞尽脑汁做以下工作: 1) 如何最好地将此权限插入我的数据库 2) 以后如何确定每个用户允许哪些权限 目前,我正在考虑为每个复选框添加许多列到我的db中,并在其中添加1或0。然后使用大量的if函数检查这些函数!!在编码时,这将是一个浪费时间的问题 还有什么我能做的吗?谢谢你的帮助 您可以有一个带有用户名的权限表,然后是每个权限的若干列 这可以防止

我有一组复选框,管理员可以勾选这些复选框来授予用户权限。在我的情况下,管理员可以单击以下复选框:。这些复选框将允许用户查看这些国家/城市的数据

我正在绞尽脑汁做以下工作:

1) 如何最好地将此权限插入我的数据库 2) 以后如何确定每个用户允许哪些权限

目前,我正在考虑为每个复选框添加许多列到我的db中,并在其中添加1或0。然后使用大量的if函数检查这些函数!!在编码时,这将是一个浪费时间的问题


还有什么我能做的吗?谢谢你的帮助

您可以有一个带有用户名的权限表,然后是每个权限的若干列

这可以防止您用所有这些数据填充users表(因为您可能只需要有限的容量),但允许您查看每个权限并查看用户拥有哪些权限:

e、 g

只要在用户结构中有一个特定的变量,允许您在加载权限后跟踪权限(映射/关联数组就可以了)。

您需要。集合或多或少是一个集合,其中每个位都有一个名称:

ALTER TABLE user ADD COLUMN permissions SET(
    'States',
    'Cities',
    'Africa',
    'Asia',
    'Australia',
    'Europe',
    ...
);
选择可以查看亚洲数据的用户:

SELECT * FROM user WHERE FIND_IN_SET('Asia',permissions) > 0;
或者选择可以查看亚洲和欧洲但不能查看非洲的所有用户:

SELECT * FROM user WHERE permissions & 40 = 40 AND !(permissions & 4)
我将在PHP中进一步定义这些常量,那么您的代码应该非常可读:

define('PERMISSION_STATES', 1);
define('PERMISSION_CITIES', 2);
define('PERMISSION_AFRICA', 4);
define('PERMISSION_ASIA', 8);
define('PERMISSION_AUSTRALIA', 16);
define('PERMISSION_EUROPE', 32);
# ...

# Check if user can view data for Africa
if ($user['permissions'] & PERMISSION_AFRICA) {
    # ...

# Check if user can Asia and Europe but not Africa
if ($user['permissions'] & PERMISSION_ASIA
    && $user['permissions'] & PERMISSION_EUROPE
    && !($user['permissions'] & PERMISSION_AFRICA)) {
    # ...

我将使用规范化数据库方法:用户和权限之间存在多对多关系。您需要一个交集表来存储此信息

CREATE TABLE UserPermissions (
  user_id INT NOT NULL,
  perm_id INT NOT NULL,
  PRIMARY KEY(user_id, perm_id),
  FOREIGN KEY (user_id) REFERENCES Users (user_id),
  FOREIGN KEY (perm_id) REFERENCES Permissions (perm_id)
);
为用户输入权限时,请为每个权限输入一行:

INSERT INTO UserPermissions (user_id, perm_id) VALUES
 (1234, 1), -- for Cities
 (1234, 5), -- for continent North America
 (1234, 17); -- for country Canada
现在很容易查询所有拥有北美权限的用户:

SELECT Users.*
FROM Users JOIN UserPermissions USING (user_id)
WHERE perm_id = 5;
您还可以获取给定用户的以逗号分隔的权限列表:

SELECT user_id, GROUP_CONCAT(Permissions.Name) AS perm_list
FROM UserPermissions JOIN Permissions USING (perm_id)
WHERE user_id = 1234
GROUP BY user_id;

嗨,Soulmerge,在比较用户权限和PHP常量时,为什么要使用符号AND?它与“==”不一样吗?似乎是一条捷径,从未见过。启发我:)这是一个有点明智的操作员:
SELECT user_id, GROUP_CONCAT(Permissions.Name) AS perm_list
FROM UserPermissions JOIN Permissions USING (perm_id)
WHERE user_id = 1234
GROUP BY user_id;