我一直在尝试阅读如何实现JSON解决方案以使用JQueryUI's autocomplete functionality。我正在尝试使用自动完成功能在数据库中搜索名称,并在选择后将ID填充到隐藏对象。我在网上看过很多例子,但没有找到实现这个的最好方法。数据库经常不会改变,所以我不确定如何最好地处理这种性能。
后端:
#!/usr/bin/perl
use CGI;
use DBI;
use strict;
use warnings;
my $cgi = CGI->new;
my $dbh = DBI->connect('dbi:mysql:hostname=localhost;database=test',"test","test") or die $DBI::errstr;
my $sth = $dbh->prepare(qq{select id, name from test;}) or die
$dbh->errstr;
$sth->execute() or die $sth->errstr;
my $json = undef;
while(my @user = $sth->fetchrow_array()) {
$json .= qq{{"$user[0]" : "$user[1]"}};
}
print $cgi->header(-type => "application/json", -charset => "utf-8");
print $json;
答案 0 :(得分:1)
您需要从CPAN抓取JSON包,而不是这样做:
my $json = undef;
while(my @user = $sth->fetchrow_array()) {
$json .= qq{{"$user[0]" : "$user[1]"}};
}
例如,使用JSON,它看起来像这样:
use JSON;
my $json = {};
while(my @user = $sth->fetchrow_array()) {
$json->{$user[0]} = $user[1];
}
print JSON::to_json($json);
JSON包将自动从您提供的任何Perl数据结构构造有效的JSON字符串。我们在Melody上的所有地方使用它,它被证明是一个真正的救星,可以将结构合理地转换为有效的JSON。
答案 1 :(得分:1)
jQuery自动完成需要使用json结果返回的“value”或“label”字段。如果您不包含它,jquery自动完成将不起作用:
自动完成功能的基本功能与分配给“标签”和“值”字段的查询结果一起使用。来自jQuery UI站点的'label'和'value'字段的说明:
“本地数据可以是一个简单的字符串数组,也可以包含数组中每个项目的对象,带有标签或值属性或两者。 label属性显示在建议菜单中。用户从菜单中选择了某些内容后,该值将插入到input元素中。如果仅指定了一个属性,则它将用于两者,例如。如果只提供value-properties,则该值也将用作标签。“
链接到完整示例:http://www.jensbits.com/2011/05/09/jquery-ui-autocomplete-widget-with-perl-and-mysql/
答案 2 :(得分:0)
我在谈论表演。
您可以设置一些触发器来提高性能,客户端可以设置发送请求之前所需的最小字符数。 您还可以在发送请求之前在两个字符之间设置“超时”。
如果您的数据库表非常庞大,我建议您对检索的结果进行LIMIT。 首先要避免长时间的请求处理,但也因为像IE6这样的客户并不是真的快速处理超过一百个结果(不是说,它也不是真正用户友好)。
在使用IE6的项目中,我们将返回的元素限制为100.如果用户无法将搜索减少到100个元素,我们认为他/她不知道他/她正在寻找什么。
希望它有所帮助。