2011-06-16 90 views
1

帶註冊表單的帶有自動完成腳本的朋友文本框(支持來自userstable「全名」列的多個單詞完成)。現在問題1:如何從文本輸入字段獲取名稱數組,並用php查找這些姓名的id?問題2:如果註冊表中的新用戶id未知,註冊表將如何將其ID放到第二個(朋友)表中? 例如,如果訪客寫入「Tu」腳本從用戶表中找到「Tural Teyyuboglu」,則完成它,添加逗號,用戶可以添加儘可能多的他想要的用戶名。每次腳本工作。我想要得到這個用逗號分隔的用戶名到php數組,搜索這個用戶名一個一個的id並添加到好友表中。但是第二次懷孕發生?但是如果註冊表中的新用戶身份不明,註冊表將如何將其ID添加到第二個(朋友)表中?向php數組輸入字段

對不起,我的英語不好。我的想法是:我有一個用戶數據庫,每個用戶都有一個自動增加的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」字段?我只需要書面姓名和全名。我不需要價值。我可以如何從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); 

回答

1
$usr_fullname = mysql_real_escape_string($_GET['usr_fullname']); 
// other user information here 

$friend_str = mysql_real_escape_string($_GET['friend_str']); 

$sql = " 
INSERT INTO usr_table 
    (`fullname`, `etc`) 
VALUES 
    ('$usr_fullname', etc) 
"; 

$result = mysql_query($sql) or die(mysql_error()); 

$new_user_id = mysql_insert_id($result); 

$friend_arr = explode(',', $friend_str); 

foreach($friend_arr as $friend_name) { 
    $friend_name = trim($friend_name); 

    if (empty($friend_name)) { 
     continue; 
    } 

    $sql = " 
    SELECT id 
    FROM usr_table 
     WHERE `fullname` = '$friend_name' 
    LIMIT 1 
    "; 

    $result = mysql_query($sql); 

    if (!$result) { 
     echo "$sql failed " . mysql_error(); 
     exit; 
    } 
    if (mysql_num_rows($result) == 0) { 
     continue; // this person does not exist 
    } 

    $data = mysql_fetch_array($result); 
    $friend_id = $data['id']; 

    $sql = " 
    INSERT INTO usrfrnd_table 
     (`user_id`, `friend_id`) 
    VALUES 
     ('$new_user_id', '$friend_id') 
    "; 

    mysql_query($sql); 
} 
+1

我更新了問題。請再讀一遍 – 2011-06-16 21:33:49

+1

請幫忙。你可以加我到你的Skype名單,我想和你聊天。請:tural.teyyuboglu – 2011-06-16 21:41:26

1

如果我正確評估您的應用程序,那麼您的自動填充將使用名稱填充輸入字段。因爲它只填充了名稱,所以表單不知道與每個名稱對應的ID。你需要的是一個解決方案,名字將保持它的ID。

這是我用什麼:Facebook style JQuery autocomplete plugin

這是相同的FB。您可以添加/刪除名稱,並維護其ID。

當你的[POST]表單提交,你的人口輸入字段將輸出如下:

$_POST['friends'] = "24,54,67,7,9"; // comma-delimited list of corresponding IDs 

使用PHP的爆炸功能,您可以獲取每個ID和簡單地處理每個ID您的信息。也許,像這樣:

$personAddingFriendsID = 45; // arbitrary 
$friends = explode(",", $_POST['friends']); 

foreach ($friends AS $friendID) { 
    $insertQuery = "INSERT INTO friendsMap SET friend1 = '$personAddingFriendsID', friend2 = '$friendID"; 
    //etc.. (not including SQL injection) 
} 
2

嗯,我寧願實現的事情是這樣的:

每當遊客接受自動完成,一個隱藏的輸入字段將在這個非常創建,就像簡單的模板:

<input type="text" name="user[id]" value="Friend's name" /> 

動態形式是這樣的一些後自動完成:

<form> 
    <input type="hidden" name="friends[14]" value="Stephen Hawking" /> 
    <input type="hidden" name="friends[22]" value="Josh Obama" /> 
    <input type="hidden" name="friends[19]" value="Julia Bin Laden" /> 
    <input type="submit" /> 
</form> 

$_REQUEST數據會在這麼多的更優雅的關聯數組結束結構:

Array 
(
    [friends] => Array 
     (
      [14] => Stephen Hawking 
      [22] => Josh Obama 
      [19] => Julia Bin Laden 
     ) 

) 

隨着手中了結構化數據,有一個棘手的PHP字符串操作沒有任何藉口。另外,我認爲這會導致更多的可重用代碼。

希望它有幫助;]