基本上,你需要一个带有标志和一张表的客户/用户表。 这些表应该是这样的:
标志表:
- 标志的唯一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());
如果您想编辑标志,选择字段,反序列化数组并使用Array functions进行编辑。
选择和显示:
所以,你有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'
它将返回所有标志及其名称,描述和用户的nam即
您所要做的就是现在显示结果。
编辑1:用户界面
我不知道如果我明白你到底想要什么,但如果你要允许每个用户多个标志,我建议你做一个checkbox每个国旗或select menu with multiple choices而不是下拉。我认为下拉并不是一个好主意,因为您只能选择一个项目。
编辑2:
可以使用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文件中,检查返回的结果。如果“确定”,则继续,如果与“确定”不同,则显示错误。
要防止多次选择相同的标记,可以在用户选择jQuery时使用jQuery(请参阅this问题)从下拉菜单中将其删除。在页面上的其他位置,您可以显示选定的标志。
编辑3:
你也可以使用一个<select>
with "multiple" attribute。
用它来设计表格。 – sammich 2012-07-15 01:27:13