2011-06-16 72 views
1

我的想法: 我有一個用戶數據庫,每個用戶都有一個自動增加的id號字段,以及其他各個字段的詳細信息。我想在用戶記錄中存儲一個包含一系列朋友的字段。我想要最有效的方式來存儲並能夠搜索每個用戶的朋友ID數組字段,並列出每個用戶搜索的朋友ID。假設某些時候可能會有一百萬個用戶,其中每個用戶的陣列中都有一百萬個「朋友ID」,我不認爲讓他們分開逗號會很高效,任何解決方案?它可以存儲在一個blob中並逐位搜索? (比如每人一點,所以一個1k的blob可以存儲多達1024個朋友組合)我認爲另一個表是最好的解決方案。這是一個多對多的關係,我已經爲用戶朋友建立了一個單獨的表:usrfrnd_tbl 與列UserFriendID(唯一的關鍵),UserID,FriendID 在我應用Jquery自動完成到朋友的註冊表單字段:當訪問者類型現有用戶的名稱到此輸入字段,首先,腳本搜索名稱存在,完成它(如果存在),添加逗號。用戶可以輸入第二,第三...現有的用戶名到這個字段,每次腳本都會自動完成。現在我想創建一個php文件,它將搜索這些用戶名的id,創建id的數組,將它添加到db表中的「usrfrnd_tbl」新用戶「FriendID」字段中。問題: 1.如何做?現在,在提交註冊表之後,如何獲取已編寫名稱的id的數組,並將它提交給usr_table的「friends」字段? 2.我只需要書面姓名和全名。我不需要價值。我可以如何從jquery代碼中刪除它? 對不起我的英文不好 我的代碼:幫助!用戶註冊問題!

HTML

<form action="index.php" method="post">  
<input class="std" type="text" name="friends" id="friends"/> 
<input type="submit" name="submit"> 
</form> 

jQuery的

$(function() { 
    function split(val) { 
     return val.split(/,\s*/); 
    } 
    function extractLast(term) { 
     return split(term ).pop(); 
    } 

    $("#friends") 
     // don't navigate away from the field on tab when selecting an item 
     .bind("keydown", function(event) { 
      if (event.keyCode === $.ui.keyCode.TAB && 
        $(this).data("autocomplete").menu.active) { 
       event.preventDefault(); 
      } 
     }) 
     .autocomplete({ 
      source: function(request, response) { 
       $.getJSON("search.php", { 
        term: extractLast(request.term) 
       }, response); 
      }, 
      search: function() { 
       // custom minLength 
       var term = extractLast(this.value); 
       if (term.length < 2) { 
        return false; 
       } 
      }, 
      focus: function() { 
       // prevent value inserted on focus 
       return false; 
      }, 
      select: function(event, ui) { 
       var terms = split(this.value); 
       // remove the current input 
       terms.pop(); 
       // add the selected item 
       terms.push(ui.item.value); 
       // add placeholder to get the comma-and-space at the end 
       terms.push(""); 
       this.value = terms.join(", "); 
       return false; 
      } 
     }); 
}); 

的search.php

$db = new mysqli('localhost', 'user' ,'pass', 'db') or die(mysqli_errno()); 
$q = strtolower($_GET["term"]); 
if (!$q) return; 
$query = $db->query("select id, fullname from usr_table where fullname like '$q%'") or die(mysqli_errno()); 
$results = array(); 
while ($row = mysqli_fetch_array($query)) {$results[] = array ("id" => $row[0] , "label" => $row[1], "value" => $row[1]);} 
echo json_encode($results); 

回答

2

您需要做的是創建另一個將存儲朋友ID的表,您不應該在用戶表中將其作爲逗號分隔值執行此操作。例如,

表:用戶

用戶ID,名字,姓氏
1,約翰史密斯
2,蘇珊,卡特
3,詹姆斯布雷克

表:好友
ID ,用戶ID,FriendID
1,2,
2,1,3
3,3,2

Above Friends表中包含3行。它顯示用戶標識1(John)有兩行,但兩行的friendID不同。現在你需要將兩張桌子結合在一起。實施例

SELECT * FROM用戶ü INNER JOIN好友f在f.UserID = u.UserID WHERE u.UserID = 1

上面的SQL將返回兩行,這是約翰的兩個朋友。

+1

註冊表單中帶有自動完成腳本的朋友文本框(支持來自userstable「fullname」列的多個詞完成)。現在問題1:如何從文本輸入字段獲取名稱數組,並用php查找這些姓名的id?問題2:如果註冊表中的新用戶id未知,註冊表將如何將其ID放到第二個(朋友)表中? – 2011-06-16 21:05:50

+0

我不明白你的意思是由文本輸入數組。請給出一個用戶將進入文本框的例子。 – 2011-06-16 21:20:50

+1

例如,如果訪客寫入「胡」腳本從用戶表中找到「Sid Hussain」,則完成它,添加逗號,用戶可以添加儘可能多的他想要的用戶名。每次腳本工作。我想要得到這個用逗號分隔的用戶名到php數組,搜索這個用戶名一個一個的id並添加到好友表中。但是第二次懷孕發生?但是如果註冊表中的新用戶身份不明,註冊表將如何將其ID添加到第二個(朋友)表中? – 2011-06-16 21:29:05