如何使用 PHP 正确从数据库中获取标志值


How to properly get flag value from database using PHP?

想象一下这样。我的数据库中有一个名为 flags 的字段,其中添加或删除的数据如下所示:

UPDATE people SET flags=flags|16 WHERE ....
UPDATE people SET flags=flags|128 WHERE ....
UPDATE people SET flags=flags&~16 WHERE ....
UPDATE people SET flags=flags&~128 WHERE ....

例如,此字段的值可以像 65536 或更多或更少。我的问题是 - 如何使用 PHP 代码从此字段中获取特定标志?我的意思是这样的:

SELECT * FROM people WHERE flags=16;

但结果将返回所有字段中不仅有数字 16 的人,而且会返回旗帜为 65536 的人,有 16 的人,但不是 2 或 1 的人。我应该在我的 php 代码或一些特定的 PHP 集成函数中使用哪个SELECT查询?谢谢。

假设flags是位域,并且您希望选择设置了位 #4 ( 10000 ) 的行

SELECT * FROM people WHERE flags & 16;

但这并不理想,因为您正在失去数据库所擅长的所有参考优势。

您应该拥有的是两个新表; flagspeople_flags .前者包含所有标志(idname列就足够了)。后者包含flag_id列和people_id列,创建多对多关系(请参阅联结表)。

不过逻辑不正确。您不能只有一个包含 16 的标志,因为它不是唯一的。

假设您有包含此行的数据库

name:Jhon tel:012345 email:test@test.com flags:16
name:Mike tel:012344 email:mike@test.com flags:16
name:Sarah tel:012346 email:sarah@test.com flags:2442

使用 Select 语句从此表中选择标志 16,您将获得两行数据,您可以使用 Distinct 或获取标志是唯一的