Bit Manipülasyon ve PHP MySQL Alma

2 Cevap php

Ben biraz daha yönetilebilir bir tablo olması için benim mysql tablo biraz optimize etmek için çalışıyorum. Ben bir bit alanı kullanıcı izinlerini saklamak istiyorum.

Örneğin, bir kullanıcının izinleri (I kullanıcı izinleri büyüyen bir dizi var, bu nedenle bu boyu biraz daha uzun olabilir) 0110 olabilir

Örneğin, aşağıdaki uygun olabilir:

0: User cannot post news items on the website 1: User can post new articles on the website 1: User can edit any article on the website 0: User cannot remove articles from the website etc. (for other permissions)

Ben bu bir mysql biraz alanda depolanan varsa. Nasıl bu PHP işleyebilirsiniz?

For example, in PHP is there an easy way to get the 3rd bit and see if it is a 0 or a 1?

Is there an easy way to set the 3rd bit to be a 0 or a 1?

2 Cevap

Sen kullanabilirsiniz bitwise operators.

Örneğin:

$bits = bindec('0110');
var_dump($bits & bindec('0100'));

Eğer "4" (i.e. non-zero -- which you can consider as "ok"), üçüncü biti olarak $bits ayarlanır alacak.

Ve:

$bits = bindec('0010');
var_dump($bits & bindec('0100'));

Size 0 alacak - $bits ayarlı değil de üçüncü bit olarak.


Of course, no need to call bindec each time -- I just used it here to make things easier to read ; my first example could be rewritten as something like this :

$bits = bindec('0110');
var_dump($bits & 1<<2);


And to make to code easier to understand, don't use such magic values, but use some constants ; for instance :

define('PERMISSION_TO_DO_X', 1);
define('PERMISSION_TO_DO_Y', 1<<1);
define('PERMISSION_TO_DO_Z', 1<<2);

Ve bunları kullanmak için:

$bits = bindec('0110');
if ($bits & PERMISSION_TO_DO_X) {
    echo "OK to do X<br />";
}
if ($bits & PERMISSION_TO_DO_Y) {
    echo "OK to do Y<br />";
}
if ($bits & PERMISSION_TO_DO_Z) {
    echo "OK to do Z<br />";
}

Burada, size çıktı bu tür alır:

OK to do Y
OK to do Z

Çünkü:

  • en sağdaki bit 0 (izin verilen X değil)
  • (sağdan başlayarak) ikinci bit 1: izin Y verilir
  • (hala ve her zaman sağdan başlayarak) üçüncü bit 1: izin verilen Z

Her izni ile, bir tamsayı olarak izinleri saklamak düşündünüz mü bir ikili değer (yani 1,2,4,8,16) ve birlikte tüm izinleri ekleyin. Onlar ve kullanarak belirli bir izniniz varsa o zaman kontrol edebilirsiniz operatör

Şöyle:

if ($accessLevel & $userPermissions)

Bu size bir ikili sayıyı saklamak çok daha kullanışlı bir sistem verir


Yorumlarda istendiği gibi, biraz daha bilgi.

Sen izinleri depolamak için bir tamsayı alanı olması için, kullanıcıların bir tablo kurmak istiyorsunuz. Lütfen izin düzeyleri her bir ikili bit değerine karşılık gelen bir ikili çoklu (burada doğru terim bilmiyorum) olurdu. Örneğin:

Read - 1
Edit - 2
Create - 4
Delete - 8

Ve böylece, gerektiği kadar. Kullanıcıların izin düzeyi oluşturmak için, size VEYA araya değerleri. En yukarıdaki düzeylerde statik değerler olarak bir sınıfa kaydedilir varsayalım, bunu gibi yaratacaktır:

$newUser->Permissions = Permissions::Read | Permissions::Create;

Size okumak ve oluşturmak, ancak düzenleyebilir veya silebilirsiniz bir kullanıcı verir.

Bir kullanıcı bir eylemi gerçekleştirmek için izni olup olmadığını kontrol etmek, kullanmak ve:

if ($newUser->Permissions & Permissions::Read) {
    echo 'You can do this!';
}  else {
    echo 'You can't this!';
}

Bu size basit bir veritabanı alanı verir, bu kontrolleri ve değişiklikleri kullanımı basit gerçekçi ihtiyacınız olacak gibi uzayabilir, ve. Ayrıca gerekebilir özelleştirme ne düzeyine bağlı olarak, vb, başka bir tabloda izin düzeylerini saklamak düşünebilirsiniz.