我有一个带有客户端的MySQL表,通常的数据,姓名,地址,电话号码等等我还有一个名为“角色”的字段,客户可以在其中勾选他们喜欢做的事情,即编码,图形设计,插图等等。这些数据被推送到每个角色代码序列化的字段中,以下是一个例子。
a:3:{s:4:"_wfa";s:2:"on";s:3:"_CS";s:2:"on";s:3:"_CM";s:2:"on";}
在'viewall'页面上,我需要输出已勾选特定框的用户的所有详细信息,例如,我需要输出勾选了'_wfa'框的所有用户。
我希望这是有道理的,我似乎无法弄清楚如何去做。
我希望有人可以对此有所了解。
干杯,
答案 0 :(得分:2)
您不应该在一行的单个列中拥有多个值。使用用户的ID将角色存储在他们自己的数据库表中,您将能够简单地向MySQL询问具有所需角色的用户。
CREATE TABLE user_roles (user_id INT, role_name VARCHAR(100));
INSERT INTO user_roles (1, '_wfa');
INSERT INTO user_roles (1, '_CS');
INSERT INTO user_roles (1, '_CM');
SELECT users.id FROM users INNER JOIN user_roles ON users.id = user_roles.user_id WHERE user_roles.role_name = '_wfa';
答案 1 :(得分:1)
您应该将其规范化为表格。将其序列化意味着您不能在其上使用SQL的任何好处,并且解析它需要PHP(或其他语言的自定义代码)。
答案 2 :(得分:1)
MySQL或任何数据库都无法对外部编程语言执行的数据进行反序列化。获取数据的唯一方法是在使用数据之前将其删除并在PHP中反序列化。
使用数据库获取任何价值的唯一方法是使用表和本机数据类型在其中存储数据以强制数据一致性。规范化和参照完整性可以在执行业务规则时最大限度地减少数据重复。
转换到SQL,对象变成表 - 它们就像数组一样。对象属性成为列,但是当一个对象包含一个其他对象的数组时 - 该属性被提升为一个表...规范化意味着采取类似角色的东西,并为它们创建一个可以在其他表中引用的代码表。