Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向不同组添加用户_Php_Mysql - Fatal编程技术网

Php 向不同组添加用户

Php 向不同组添加用户,php,mysql,Php,Mysql,我有一个名为users的mySQL表。它有UID、等级、用户名、密码等 我的目标是创建一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户只能是一个部落的首领,但可以是他/她想要成为的任意多个部落的村民。评级系统将考虑部落所有成员的评级 在对关系数据库表和分组进行了一些研究之后,我不清楚应该如何设置表,或者如何设置与之配套的PHP代码 如果有人能给我指出正确的方向,我将不胜感激 编辑:我预见到的一个大问题是接受加入一个部落。我不知道

我有一个名为users的mySQL表。它有UID、等级、用户名、密码等

我的目标是创建一个类似于Facebook好友列表的系统(部落)。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户只能是一个部落的首领,但可以是他/她想要成为的任意多个部落的村民。评级系统将考虑部落所有成员的评级

在对关系数据库表和分组进行了一些研究之后,我不清楚应该如何设置表,或者如何设置与之配套的PHP代码

如果有人能给我指出正确的方向,我将不胜感激


编辑:我预见到的一个大问题是接受加入一个部落。我不知道你是怎么解释的。

听起来你需要两门课:
村民和
部落

然后,可能是一个名为
chief\u of
的数据库字段,或者如果此人不是酋长,则该数据库字段为
null
,并包含他们是酋长的部落名称

在这些类中,您可以使用
getChiefOf()
方法来测试用户是否是主管



或者,你也可以有一个酋长表,按UID索引,并有相同的列说明他们是哪个部落的酋长。效率稍低,但结构更好。突然想到的一个缺点是,如果出于某种原因更改了UID,则必须更新两个表,因此第一个表可能更好。

听起来您需要两个类:
Villager
Tribe

然后,可能是一个名为
chief\u of
的数据库字段,或者如果此人不是酋长,则该数据库字段为
null
,并包含他们是酋长的部落名称

在这些类中,您可以使用
getChiefOf()
方法来测试用户是否是主管


或者,你也可以有一个酋长表,按UID索引,并有相同的列说明他们是哪个部落的酋长。效率稍低,但结构更好。突然想到的一个缺点是,如果出于某种原因更改了UID,则必须更新两个表,因此第一个表可能更好

类似于Facebook的好友列表。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户都是一个部落的首领

好的,您有一个
用户
表,还需要一个
部落

然后,您描述的关系是一对一的
部落首领(一个用户可以是一个部落的首领;一个部落只有一个首领),因此您可以将其存储在
用户(部落首领)或
部落(部落首领:用户)中

在这里,
chief\u of
可能是一个外键,因此如果删除一个部落,相关元组的
chief\u of
将设置为NULL(用户不能是不再存在的部落的首领)

成员资格有点复杂,因为一个用户可以属于多个部落,而一个部落将有多个成员

这是一种多对多关系,通常通过一个包含键对的表来实现:

CREATE TABLE member_of (
    user_id integer,
    tribe_id integer
);
这两个字段都是外键的自然候选字段。您可以使用
作者
书籍
找到类似的实现

要指示Bob是洞穴熊氏族的成员,请检索Bob和Bears的ID,并在
member\u中插入一个元组

要检索氏族的所有成员,可以使用联接:

SELECT Users.* FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear');
我认为MySQL上的较短版本是
使用(user_id)
(这意味着两个表都有一个同名的列),但我认为
上的
更清晰

您还可以检索虚拟的“is_chief”列:

chief\u of
属性等于部落id的一个用户将
is\u chief
设置为TRUE,等于1,因此

SELECT Users.*, chief_of = tribe_id AS is_chief FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear')
    ORDER BY (chief_of = tribe_id) DESC, user_name;
将按字母顺序检索用户,但负责人除外,负责人(如果在场)将排在第一位

至于加入部落,这确定了三种状态:用户不在部落,用户在部落,用户被要求加入部落。前两个实际上是同一属性的两个面
成员
。因此,我们很自然地会创建一个新属性,并在
中将其称为
wants\u。它将映射到与
成员\u相同的表

酋长可以在
中检索其
部落id
等于他自己的
酋长的
wants_的所有元组(因此,如果为NULL,表示他不是酋长,则自动不返回任何内容)。然后他可能会将其视为带有用户名的复选框表。当他批准加入时,对于每次批准,您都会从
中的
wants\u中删除元组,并将其放入
member\u中

或者您可以决定“成员资格”本身就是一种状态,这样您就有了一个更复杂的联接表

user_id,
tribe_id,
status
其中,
状态
可以是

  • nothing(没有(U,T,?)元组):用户U和部落T彼此未知
  • 100:用户U是部落T的正式成员
  • -1:部落T已经决定U不是成员,甚至不能要求成为成员
  • 0:用户U希望成为T的成员
  • 1-99:用户U是试用(学徒)成员
类似于Facebook的好友列表。每个用户都可以查看用户的个人资料并将其添加到他们的部落中。每个用户都是一个部落的首领

好的,您有一个
用户
表,还需要一个
部落

然后您描述的关系是
的首领,这是一对一(一个用户可以是一个部落的首领;一个部落只有一个首领),因此您可以
SELECT Users.*, chief_of = tribe_id AS is_chief FROM Users
    JOIN member_of ON (Users.user_id = member_of.user_id)
    WHERE member_of.tribe_id =
        (SELECT tribe_id FROM Tribes WHERE tribe_name = 'Clan of the Cave Bear')
    ORDER BY (chief_of = tribe_id) DESC, user_name;
user_id,
tribe_id,
status