Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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 将数组插入MYSQL字段_Php_Mysql_Arrays - Fatal编程技术网

Php 将数组插入MYSQL字段

Php 将数组插入MYSQL字段,php,mysql,arrays,Php,Mysql,Arrays,对于论坛,我想让用户能够互相发送消息。 为了做到这一点,我制作了一个名为Contacts的表,在这个表中我有5个collumn:用户id,一个用于存储朋友,一个用于存储家庭,一个用于存储业务,另一个用于存储其他联系人。最后四个应该都包含一个数组,该数组保存该类型联系人的用户id。我之所以选择这种设计,是因为我不想输入太多或限制用户的好友数量,比如friend1、friend2等 我的问题是:我这样做对吗?如果没有,应该改进什么?朋友、家人、企业和其他人应该是什么类型的MYSQL字段?您应该做的是

对于论坛,我想让用户能够互相发送消息。 为了做到这一点,我制作了一个名为Contacts的表,在这个表中我有5个collumn:用户id,一个用于存储朋友,一个用于存储家庭,一个用于存储业务,另一个用于存储其他联系人。最后四个应该都包含一个数组,该数组保存该类型联系人的用户id。我之所以选择这种设计,是因为我不想输入太多或限制用户的好友数量,比如friend1、friend2等


我的问题是:我这样做对吗?如果没有,应该改进什么?朋友、家人、企业和其他人应该是什么类型的MYSQL字段?

您应该做的是在联系人表和任何相关表(用户、朋友、家庭、企业)之间建立一个映射表。其目的纯粹是在联系人和用户等之间创建链接,而不必做您正在谈论的事情,也不必使用压缩到varchar等字段中的数组

结构化数据方法为您提供了更灵活的应用程序

例如,UserContacts表只包含它自己的主键(id)、用户的外键和联系人的外键。您可以对每种类型执行此操作,允许您随时轻松地在任意数量的用户和联系人之间插入或修改映射,而不会损坏其他数据,也不需要复杂的逻辑来分解这样的内容:
1,2,3,4,5
1 | 2 | 3 | 4 | 5

id, user_id, contact_id
所以当你开始使用这个结构时,你会做如下的事情:

SELECT 
    Contacts.* 
    -- , Users.* -- if you want the user information
FROM UserContacts
LEFT JOIN Contacts ON (UserContacts.contact_id = Contacts.id)
LEFT JOIN Users ON (Users.id = UserContacts.user_id)
使用
serialize()
unserialize()
函数

请参阅关于如何在MySQL中存储阵列的问题:

但是,不建议您这样做。我将创建一个单独的表来存储两个用户之间的所有“连接”。例如,如果说约翰加上了阿里,就会有一张专门记录阿里和约翰的唱片。要查找用户的朋友,只需查询包含Ali或John的记录。但这是我个人做事的方式


我建议您随时使用PHP/MySQL查询用户朋友。这样可以节省大量空间,并且不会占用太多速度。

在存储之前序列化数组,在检索之后取消序列化

$friends_for_db = serialize($friends_array);
// store $friends_for_db into db
以及检索:

// read $friends_for_db from db
$friends_array = unserialize($friends_for_db);
然而,遵循其他关于设置适当的多对多设计的答案应该更明智


尽管如此,我需要这种设计来应对一种不需要完整解决方案的小情况(例如,轻松存储/检索一些我永远不会查询或使用的多选列表值,而只是向用户显示)

阅读这里的坏设计。如果需要单独访问这些位,则永远不会在单个字段中存储多个数据段。将它们全部存储在一个字段中会使数据库无法完成其设计目的:关联数据。