基本上,你需要一個帶有標誌和一張表的客戶/用戶表。 這些表應該是這樣的:
標誌表:
- 標誌的唯一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