基本上,您需要一个带有标志的表格和一个带有客户/用户的表格。这些表应如下所示:
标志表:
- 标志的唯一 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'";
这是我们从代码中得到的查询:
SELECT u.name, f.name, f.description
FROM users u
INNER JOIN flags f
ON f.id = 1 OR f.id = 3 OR f.id = 5 OR f.id = 7
WHERE u.name = 'Nikola'
它将返回所有标志及其名称、描述和用户名。
您所要做的就是现在显示结果。
编辑 1:用户界面
我不确定我是否理解您到底想要什么,但是如果您想允许每个用户使用多个标志,我建议您为每个标志或一个具有多个选择的选择菜单制作一个复选框,而不是 drop-向下。我认为下拉不是一个好主意,因为您只能选择一项。
编辑 2:
您可以使用与 Stack Overflow 的标记非常相似的jQuery Autocomplete ,这可能是最佳选择。
另一个想法是您实际上可以使用下拉菜单并且仍然允许多个标志。
事情是这样的:当用户从下拉列表中选择一个标志时,通过 AJAX 将一个标志存储在 PHP 数组中,并将该数组存储在$_SESSION
.
示例:通过 AJAX 向 PHP 文件发送请求,在 PHP 文件中读取$_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:
您也可以使用<select>
带有“多个”属性的。