Daha sonra kolay erişim için veritabanında bazı veri yapısı nasıl

3 Cevap php

Ben Yönetici kullanıcıların privleges vermek için işaretleyebilirsiniz onay kutularını bir dizi var. Benim durumumda, Yönetici bu onay kutularını tıklayabilirsiniz: Image on ImageShack. Bu onay kutularını kullanıcılar bu ülke / şehirlerde verilerini görüntülemek için izin verir.

Ben folowing yapmak benim beynini rafa çalışıyorum:

1) How to best insert this permissions into my database 2) How to later work out what permissions each user is allowed

Şu anda, ben sadece benim db içine her checkbox için sütun birçok ekleyerek düşünme ve orada 1 veya 0 koymak duyuyorum. Sonra fonksiyonları eğer bu kullanarak bir sürü kontrol! Bu kodlama bir zaman defolu mal olacak.

Yapabileceğim başka bir şey var mı? Ben herhangi bir yardım için teşekkür ederiz!

3 Cevap

Siz ihtiyacınız SET data type. SET daha fazla veya daha az bir bit field, her biti bir adı vardır burada:

ALTER TABLE user ADD COLUMN permissions SET(
    'States',
    'Cities',
    'Africa',
    'Asia',
    'Australia',
    'Europe',
    ...
);

Asia verilerini görebilirsiniz kullanıcıları seçme:

SELECT * FROM user WHERE FIND_IN_SET('Asia',permissions) > 0;

Ya da Afrika Asya ve Avrupa'yı görmek değil tüm kullanıcıları seçerek:

SELECT * FROM user WHERE permissions & 40 = 40 AND !(permissions & 4)

Ben daha sonra kodu oldukça okunaklı olmalı, PHP bu sabitleri tanımlamak olacaktır:

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)) {
    # ...

Ben normalize veritabanı yaklaşımı ile gitmek istiyorum: Eğer kullanıcılar ve izinler arasında çok-çok ilişkisi var. Bu bilgileri depolamak için bir kesişme tablo gerekir.

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)
);

Bir kullanıcı için izinleri girdiğinizde, her izin için bir satır girin:

INSERT INTO UserPermissions (user_id, perm_id) VALUES
 (1234, 1), -- for Cities
 (1234, 5), -- for continent North America
 (1234, 17); -- for country Canada

Şimdi Kuzey Amerika iznine sahip tüm kullanıcıların sorgulamak kolay:

SELECT Users.*
FROM Users JOIN UserPermissions USING (user_id)
WHERE perm_id = 5;

Ayrıca, belirli bir kullanıcı için izinleri bir virgülle ayrılmış listesini getirebilir:

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;

Sen kullanıcılara isim ve her izin için sütun daha sonra bir dizi ile izinleri tablo olabilir.

Bu (muhtemelen sadece sınırlı bir kapasite ihtiyaç beri) Bütün bu veriler ile kullanıcıların bir tablo dolduruyor engeller, ancak her izin bakmak ve bir kullanıcı var ne izinleri görmek için izin verir:

ör

For Each Field
     User.Permission[Field] = Field
Next Field

Sürece onlar yüklenir kez izinler izlemenize olanak sağlayan kullanıcı yapısında belirli değişkenler gibi (bir harita / ilişkisel dizi için bu iyi olurdu.)