繁体   English   中英

PHP查询 - 当用户ID存储在另一个表中时,如何在表中添加新列并插入用户信息?

[英]PHP queries - How to add new column and insert user info in table, when user id is stored in another table?

所以我是PHP新手,目前我正在制作一个PHP OOP身份验证系统。 登录和注册工作正常,但现在我需要有一个选项供用户添加无限属性(输入列名称和值)到他的配置文件,但诀窍是我需要将属性存储在另一个数据库表中。 所以这是我的用户表。

uid upass      fullname      uemail
1   md5(pass)  John Snow     john@gmail.com
2   md5(pass)  John Doe      jdoe@gmail.com

我认为我的新桌子应该是这样的。

id  uid  age  professsion   gender
1   1    17   haha          male
2   2    62   eee           male

等等。 这个系统仅用于教育目的,它可能没有任何意义,用户可以添加无限属性,但它是需要做的事情。 我希望有人可以提供帮助。 提前致谢。

编辑

好的,我已经完成了这个功能,但是我需要回应一下呢?

        public function get_property($uid)
{
        //$query = "SELECT property,value FROM info WHERE uid='$uid' AND property='Gender'";

        $query = "SELECT uid, CONCAT('{', GROUP_CONCAT(property, ': ', value), '}') AS json FROM info GROUP BY uid";

        $result = $this->db->query($query) or die($this->db->error);

        $user_data = $result->fetch_array(MYSQLI_ASSOC);
            echo $user_data['property'];
}

哦,我猜它是json

我将创建另一个名为“users_data”的表,其中包含两个字段。 一个是用户id,第二个是BLOB,包含他创建的用户的字段。 BLOB以序列化形式存储,然后您可以在PHP中反序列化。

这样做,您不必编辑数据库,而只需将数据添加到用户数据阵列或删除它。


您可以使用以下内容选择它:

SELECT users.*, users_data.data FROM users JOIN users_data ON users_data.user_id = users.id

IMO这种方法更容易实现,然后按照您描述的方式进行。

我不认为你提出的新表是一个不错的选择,特别是因为你提到用户需要能够存储无限的属性。 您建议的设计将每个属性放在一个单独的列中,但随着属性数量开始变大,这可能变得难以处理。 相反,我建议这样的事情:

uid | property   | value
1   | age        | 17
1   | profession | haha
1   | gender     | male
2   | age        | 62
2   | profession | eee
2   | gender     | male

现在添加新属性只意味着插入记录。 请注意,可以轻松查询此表。 如果你想找到你可以做的所有男性用户:

SELECT uid
FROM yourTable
WHERE
    property = 'gender' AND value = 'male'

这种设计非常灵活,我们可以索引属性和值列以提高性能。

编辑:

如果您想以某种JSONeqsue格式输出每个用户的属性,您可以尝试使用GROUP_CONCAT例如

SELECT
    uid,
    CONCAT('{', GROUP_CONCAT(property, ': ', value), '}') AS json
FROM yourTable
GROUP BY uid;

输出:

    uid json
1   1   {age: 17,profession: haha,gender: male}
2   2   {age: 62,profession: eee,gender: male}

演示

我认为你可以创建一个用户的json对象,并在其他表中使用id映射,并将json保存在一列中以防止id。 您可以轻松地提取json并正确解码。

您可以使用table_name创建其他表来存储其他用户详细信息,例如'user_attributes'或'user_details'(或)您的愿望。 然后,您必须存储'user_id',同时为用户存储附加数据,以便您可以使用Mysql JOIN获取所有其他用户信息。

用户

uid          upass              full_name        uemail 
 1         md5('something')    James Anderson   jamesanderson@mail.com
 2         md5('123456')        Brett Lee       brettlee@mail.com

你的user_details如下所示:

id   uid      age      professsion       gender
 1    1       25        Faculty           Male
 2    2       26        Entreprenuer      Male

您可以使用下面的Mysql JOIN中的任何一个来获取数据。 Mysql加入引用连接

SELECT users.*,user_details.age,user_details.profession FROM users INNER JOIN user_details ON users.uid=user_details.uid

如果用户可以输入任意数量的动态属性,则需要更改表结构,如下所示

user_tbl

uid upass      fullname      uemail
1   md5(pass)  John Snow     john@gmail.com
2   md5(pass)  Adolf Hitler  ahitler@gmail.com

user_attr_tbl [如果任何用户输入了表中不存在的新attr_name,则需要将其插入此处。]

id       attr_name   
1        age              
2        professsion       
3        gender  

user_attr_values

id uid  user_attr_id    value
1   1       1            17
2   1       2            haha
3   1       3            male
4   2       1            62
5   2       2            eee
6   2       3            male

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM