如何存储用户首选项以进一步查询?

时间:2011-03-15 01:20:18

标签: php

我想实现一个发送我注册用户的邮件系统 新博客文章与其配置的偏好设置匹配时的通知。

当用户配置他们的首选项时,这基本上会在下面创建一个SQL查询, 但我发现在数据库中存储SQL查询并不是非常干净/安全。除非我另有说法。

另外,如果我将来添加更多过滤器的标准,我想要一个可以很好地扩展的解决方案。

我的一个想法是serialize()一个包含所有WHERE数据的PHP数组。

这是实现这一目标的最有效方法吗?或者还有其他解决方案吗?

提前谢谢。

PS:我不是在寻找邮件库。我只是在寻找一个关于如何以最有效的方式设计我的应用程序的提示。

修改 我收到两个类似的答案提供相同的解决方案。我担心我的问题会有点复杂。

如果我只添加标签首选项,解决方案就可以使用。

如果我想进行特定的过滤,例如:UserB希望在标记为html的帖子后收到通知,并且至少有one条评论(或投票)。

这就是为什么我说SQL查询基本上是在用户选择它的首选项时创建的。

供参考,我正在添加this链接。

谢谢。

2 个答案:

答案 0 :(得分:1)

为什么不使用只包含auto_increment id字段和电子邮件字段的表格,然后在博客上使用简单的电子邮件输入?

您有用户表吗?

编辑:我认为您需要第二个名为user_preferences的表id + id_user + tag,如:

id | id_user | tag
1  |    1    | php
2  |    1    | html
3  |    2    | php

然后

SELECT DISTINCT email
FROM user
INNER JOIN user_preferences ON id_user = user.id
WHERE tag IN ('tag1', 'tag2', 'tag3');

答案 1 :(得分:0)

序列化是一种选择。我碰巧处于类似情况,管理层希望报告最多的搜索内容。所以我不得不查询整个表并构建数组,然后从大型数组执行报告......这不是处理它的最佳方法。

我更新了系统,使其具有一个表,其中字段/值列对应于正在使用的过滤器类型,然后是它的值。然后写了一个函数将它们转换成查询。

因此,在您的示例中,“tag”,“php”表中会有一个条目,然后是该用户ID的“tag”,“database-queries”。

下面与我使用的相似(已编辑来处理问题更改):

CREATE TABLE `user_prefs` (
  `user_pref_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `type` varchar(255) NOT NULL,
  `condition` varchar(10) DEFAULT '=' NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`user_pref_id`)
);

INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserA}, 'tag', 'php');
INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserA}, 'tag', 'database-queries');
INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserB}, 'tag', 'html');
INSERT INTO `user_prefs` (`user_id`, `type`, `condition`, `value`) VALUES ({UserB}, 'comments', '>', '1');

然后我能够运行常见搜索报告等。无论如何,我的工作效果更好。