输入字段单词到php数组

时间:2011-06-16 21:21:25

标签: php mysql arrays autocomplete

带有自动填充脚本的朋友文本框(在注册表单中支持从用户表“fullname”列中完成多个单词的完成)。现在问题1:如何从文本输入字段获取名称数组并使用php查找theese fulnames的id?问题2:如果注册期间新用户身份未知,注册表格如何将theese id列入第二(朋友)表? 例如,如果访问者从用户表“Tural Teyyuboglu”中找到“Tu”脚本,则完成它,添加逗号,用户可以添加他想要的用户名。每次脚本都有效。我希望将这个用户名用逗号分隔到php数组,逐个搜索theese用户名作为id并添加到friends表。但第二个猜测发生了吗?但是,如果新用户在注册时身份不明,那么注册表格如何将theese id列入第二(朋友)表?

抱歉我的英语不好。我的想法:我有一个用户数据库,每个用户都有一个自动增加的ID号字段,以及各种其他字段及其详细信息。我想在用户记录中存储一个包含一系列朋友的字段。我希望以最有效的方式存储并能够搜索每个用户的“朋友ID数组”字段并列出每个用户搜索的朋友ID。假设在某个时刻可能有一百万用户,其中每个人的阵列中都有一百万个“朋友ids”,我不认为让它们以逗号分隔会有效,任何解决方案?它可以存储在blob中并按位搜索吗? (例如每人一点,所以1k blob可以存储多达1024个朋友组合)我认为另一个表是最好的解决方案。这是一个多对多的关系,我为用户朋友建立了一个单独的表:usrfrnd_tbl,列为UserFriendID(唯一键),UserID,FriendID在我应用Jquery自动完成到朋友注册表单的字段:当访问者类型名称为现有用户到此输入字段,首先,脚本搜索名称存在,完成它(如果存在),添加逗号。用户可以在此字段中键入第二个,第三个...现有用户名,并且每次脚本都将自动完成。现在我想创建将搜索这些用户名的id的php文件,创建id的数组,将其添加到db表中的表“usrfrnd_tbl”新用户“FriendID”字段中。问题:1。怎么做?现在,如何获取书面名称的id数组,并在提交注册表后提交给usr_table的“friends”字段?我只需要书面名称和全名。我不需要value.How如何从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);

3 个答案:

答案 0 :(得分: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字符串操作。此外,我认为这将导致更多可重用的代码。

希望它有所帮助;]

答案 1 :(得分: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);
}

答案 2 :(得分: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)
}