注册表单中带有自动补全脚本的Friends文本框(支持用户表"fullname"列中的多个单词补全)。现在问题1:如何从文本输入字段中获取名称数组,并使用php查找这些富尔名称的id?问题2:如果新用户在注册过程中身份未知,那么注册表将如何将自己的身份放在第二个(朋友)表中?例如,如果访问者编写"Tu"脚本,从用户表"Tural Teyyuboglu"中找到,完成它,添加逗号,用户可以添加他想要的用户名。每次脚本都有效。我想把这些用户名用逗号分隔成php数组,逐个搜索这些用户名中的id,然后添加到friends表中。但第二次饥饿发生了吗?但是,如果新用户在注册过程中未知,那么注册表将如何将自己的id放在第二个(朋友)表中呢?
抱歉我英语不好。我的想法是:我有一个用户数据库,每个用户都有一个自动递增的id号字段,以及其他各种带有详细信息的字段。我想在用户记录中存储一个包含朋友数组的字段。我想要最有效的方式来存储并能够搜索每个用户的"好友id数组"字段,并列出每个用户搜索的好友id。假设在某个时候可能有一百万个用户,每个用户的数组中都有一百万个"好友id",我认为用逗号分隔他们不会有效率,有什么解决方案吗?它可以存储在一个blob中并按位搜索吗?(例如,每人一位,所以一个1k的blob最多可以存储1024个朋友组合)我认为另一张表是最好的解决方案。这是一种多对多的关系,我为用户朋友建立了一个单独的表:usrfrnd_tbl,列为UserFriendID(唯一键)、UserID、FriendID。在我将Jquery自动完成应用于注册表的朋友字段时:当访问者在该输入字段中键入现有用户的名称时,首先,脚本搜索名称是否存在,完成它(如果存在),并添加逗号。用户可以键入第二、第三。。。该字段的现有用户名,每次脚本都会自动完成。现在我想创建一个php文件,它将搜索这些用户名的id,创建id的数组,并将其添加到db表中的表"usrfrnd_tbl"new users"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);
好吧,我更喜欢这样实现:
每次访问者接受自动完成时,都会创建一个隐藏的输入字段,就像这个非常简单的模板一样:
<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字符串操作了。此外,我认为这将导致一个更加可重用的代码。
希望它能有所帮助;]
$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);
}
如果我正确评估了您的应用程序,那么您的自动完成会用名称填充输入字段。因为表单只填充了名称,所以表单不知道每个名称对应的ID。你需要的是一个解决方案,其中的名称将保持其ID。
这就是我使用的:Facebook风格的JQuery自动完成插件
它是相同的FB。您可以添加/删除名称,并维护它们的ID。
当您提交[POST]表单时,您填充的输入字段将输出如下:
$_POST['friends'] = "24,54,67,7,9"; // comma-delimited list of corresponding IDs
使用PHPs爆炸功能,你可以获得每个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)
}