Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 如何设置标记系统_Php_Mysql - Fatal编程技术网

Php 如何设置标记系统

Php 如何设置标记系统,php,mysql,Php,Mysql,我想知道是否有人能为我指出设置标记/通知系统的正确方向。我认为这和标签系统非常相似。如果有人知道任何教程或示例设置,那就太好了 目的 基本上,标志附加到数据项,包括客户、财产、承包商、应用程序等,其作用是通知用户有关该项的重要信息。标志应该来自用户可以添加或删除的预定项目列表 数据库 我在考虑使用3张桌子的设置 标志表:可用标志的列表,以及确定这些标志的设置 标志适用于(客户、财产等) 指示给定项的链接表附加了给定标志 适当的实体表 用户界面 我希望一些功能类似于堆栈溢出的功能,例如添加和删

我想知道是否有人能为我指出设置标记/通知系统的正确方向。我认为这和标签系统非常相似。如果有人知道任何教程或示例设置,那就太好了

目的

基本上,标志附加到数据项,包括客户、财产、承包商、应用程序等,其作用是通知用户有关该项的重要信息。标志应该来自用户可以添加或删除的预定项目列表

数据库

我在考虑使用3张桌子的设置

  • 标志表:可用标志的列表,以及确定这些标志的设置 标志适用于(客户、财产等)
  • 指示给定项的链接表附加了给定标志
  • 适当的实体表
用户界面

我希望一些功能类似于堆栈溢出的功能,例如添加和删除标记。也许可以使用jquery标记它?主要是,我希望用户能够从下拉列表中选择标志,并在选择一个或多个标志时显示标志图标。将鼠标悬停在标志上时,应显示工具提示,列出附加到该项目的标志。不确定一个标志显示全部的设置是否适合于查询目的,而不是显示多个标志。
示例视觉:

您的主要问题是,您有一个标志记录,用于任何数量的可能不同的实体,而不是单个实体(如“客户”)

过去,我通过在每个表(“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添加了另一个关于下拉菜单的方法+建议,并使用它来设计表格。