Php 如何设置标记系统
我想知道是否有人能为我指出设置标记/通知系统的正确方向。我认为这和标签系统非常相似。如果有人知道任何教程或示例设置,那就太好了 目的 基本上,标志附加到数据项,包括客户、财产、承包商、应用程序等,其作用是通知用户有关该项的重要信息。标志应该来自用户可以添加或删除的预定项目列表 数据库 我在考虑使用3张桌子的设置Php 如何设置标记系统,php,mysql,Php,Mysql,我想知道是否有人能为我指出设置标记/通知系统的正确方向。我认为这和标签系统非常相似。如果有人知道任何教程或示例设置,那就太好了 目的 基本上,标志附加到数据项,包括客户、财产、承包商、应用程序等,其作用是通知用户有关该项的重要信息。标志应该来自用户可以添加或删除的预定项目列表 数据库 我在考虑使用3张桌子的设置 标志表:可用标志的列表,以及确定这些标志的设置 标志适用于(客户、财产等) 指示给定项的链接表附加了给定标志 适当的实体表 用户界面 我希望一些功能类似于堆栈溢出的功能,例如添加和删
- 标志表:可用标志的列表,以及确定这些标志的设置 标志适用于(客户、财产等)
- 指示给定项的链接表附加了给定标志
- 适当的实体表
示例视觉:您的主要问题是,您有一个标志记录,用于任何数量的可能不同的实体,而不是单个实体(如“客户”) 过去,我通过在每个表(“FlagID”)中提供一个在整个数据库中唯一的额外的
外键字段来解决这个问题。GUID是合适的。然后,您只需将应用于特定上下文的表连接到Flags表中的FlagID,您将只获得应用于该特定实体的标志
例如,当您将Flags表中的FlagID加入Customers表中的FlagID时,您只会获得与客户相关的标志
请注意,堆栈溢出没有“多实体”问题;所有的标志都被转换为帖子。基本上,您需要一个带有标志的表和一个带有客户/用户的表。
这些表应该如下所示:
标志表:
- 标志的唯一ID(最简单的方法是将“ID”字段设置为
AUTO_INCREMENT
)
- 旗名
- 标志说明
- 你还想要什么
用户表:
- 存储标志的字段(我建议存储标志的序列化数组)
- 其他用途所需的其他数据
除了存储序列化数组之外,还可以创建另一个表,在其中存储用户的唯一ID和标志ID。每个标志一行。然而,我认为第一种方法更好、更有效
选择和显示标志:
- 选择包含序列化标志数组的字段
- 取消序列化数组并使用
JOIN
选择标志的名称和说明
例子
将标志存储到用户配置文件中:
假设要存储ID为1、3、5和7的标志:
$flags = serialize(array(1, 3, 5, 7));
mysql_query("UPDATE `users` SET `flags` = '$flags'") or die(mysql_error());
如果要编辑标志,请选择字段,取消阵列序列化,然后使用编辑
选择和显示:
因此,数组的值为1、3、5和7。
下面是创建SELECT
查询的示例:
$flags = array(1, 3, 5, 7); // selected from 'users' table and unserialized
$query = "SELECT u.name, f.name, f.description FROM users u INNER JOIN flags f ON ";
$conditions = null;
for($i = 0; $i < count($flags); $i++)
{
$conditions .= "f.id = $flags[$i] OR ";
}
$conditions = substr($conditions , 0, -4); // removing the last " OR "
$query = $query . $conditions . " WHERE u.name = 'Nikola'";
它将返回所有标志及其名称、说明和用户名
您现在所要做的就是显示结果
编辑1:用户界面
我不确定我是否理解您的确切需求,但是如果您希望允许每个用户使用多个标志,我建议您为每个标志创建一个,或者创建一个而不是下拉列表。我认为下拉列表不是一个好主意,因为您只能选择一个项目
编辑2:
您可以使用与Stack Overflow的标记非常相似的,可能是最好的选择。
另一个想法是,您实际上可以使用下拉菜单,并且仍然允许使用多个标志
问题是:当用户从下拉列表中选择标志时,通过AJAX将标志存储在PHP数组中,并将数组存储在$\u SESSION
示例:通过AJAX向PHP文件发送请求,在PHP文件中读取应存储标志的$\u SESSION
变量。如果为空(还没有标志)-添加一个1键数组。如果它不是空的,则读取其值(整个数组),将新标志添加到数组中,并将其返回到会话变量
session_start();
if(isset($_POST['id'])) $flagid = $_POST['id']; // previously sent request via AJAX that contains this ID.
if(empty($_SESSION['flags'])) $_SESSION['flags'] = array($flagid); // this is the first selected flag
else
{
// other tags was selected earlier
$flags = $_SESSION['flags'];
$flags[] = $flagid;
$_SESSION['flags'] = $flags;
}
die("ok");
现在,回到JS文件中,检查返回的结果。如果是“ok”,则继续,如果与“ok”不同,则显示错误。
为了防止多次选择同一标记,可以在用户选择时使用jQuery(请参阅问题)从下拉列表中删除它。在页面的其他位置,可以显示选定的标志
编辑3:
到目前为止,您还可以使用非常有用的答案。。我现在正在把桌子的设计弄下来!将更新结果,然后将考虑用户界面。@Nikola K。谢谢,看到您的编辑。是的,我同意下拉列表的问题。我担心的是,如果一个给定实体的标志太多,那么带有多个选项的复选框或菜单可能会使UI变得混乱。sammich添加了另一个关于下拉菜单的方法+建议,并使用它来设计表格。