我需要提取与列name
对应的行。被拉出的行对应于数组@values
中的地址。以下是我的代码:
use strict;
use DBI;
open (FH, "/user/address") or die $!;
my@values=<FH>;
close(FH);
my @names;
my $query = "Select name from table where address = ?";
my $sth = $dbh->prepare( $query ) or die "could not prepare statement\n", $dbh->errstr;
foreach my $value(@values){ #@values contain list of address
$sth->execute($value) or die "could not execute statement $query\n", $sth->errstr;
while ($result = $sth->fetchrow_hashref()){
my $name_reqd = $result->{name};
print "Name Req: $name_reqd\n"; #not printing anything
push (@names, $name_reqd);
}
}
print "@names\n"; #not printing anything
但是当我打印@names
时,我没有得到任何输出,我不确定出了什么问题。
答案 0 :(得分:4)
我看到了一些事情:
@names
,这意味着它在第一次使用的范围内被自动声明:在while循环中。此外,在循环的每次迭代中销毁并创建新副本,然后在调用print
时创建新的(空)副本。添加use warnings;
会抓住这个。$result
访问数据。尝试在while循环的第一行添加use Data::Dumper; print Dumper($result);
以查看您已阅读的数据。/usr/address
中使用的格式,但如果它有多行,则只能读取该文件的第一行。您可以通过首先本地化$/
来一次性阅读整个文件(请参阅perldoc perlvar)。此外(正如Ivan所说),这个字符串最后仍会有一个换行符:使用chomp
去除它(也许在分成行之后,如果你多了一个)。请参阅perldoc -f chomp和perldoc -f split。在这些点之间,您应该打印足够的调试数据,以便轻松查看出错的地方。
答案 1 :(得分:3)
此代码的问题是文件读取。代码my @values=<FH>;
在末尾读取所有带有换行符号(\n
)的行。在这种情况下应该手动删除它。您可以使用chomp
函数
open (FH, "/user/address") or die $!;
my @values = <FH>;
chomp(@values);
close(FH);
<强>更新强>
我认为它没有搜索任何东西,因为它找不到。地址通常包含空格。查询Select name from table where address = ?
将只找到完全相同的地址(字母大小写是唯一被忽略的内容)。例如,“a”在sql中不等于“a”。
答案 2 :(得分:2)
未经测试,但您不应该像这样访问您的字段。
my $name_reqd = $result[0];
这是因为你正在使用fetchrow_array()。
答案 3 :(得分:2)
您应确保数据库驱动程序为returning column names in lower case。另外,对此类查询使用selectcol_arrayref
:
use strict;
use warnings;
use DBI;
use File::Slurp;
my @values = read_file '/user/address';
chomp @values;
my $dbh = DBI->connect(
# appropriate parameters
);
my $sth = $dbh->prepare(
'SELECT name FROM table WHERE address = ?'
) or die sprintf 'Cannot prepare: %s', $dbh->errstr;
my @names;
for my $value ( @values ) {
my $names = $dbh->selectcol_arrayref(
$sth, {}, $value
) or die sprintf 'Cannot select col: %s', $dbh->errstr;
push @names, @$names;
print "'$_'\n" for @$names;
);
print "@names\n";
答案 4 :(得分:1)
在致电print keys %$result
后,您$sth->fetchrow_hashref
看到了什么?
答案 5 :(得分:0)
你的桌子真的被称为“桌子”吗?也许它应该是$table
,$table
设置为表的实际名称。
如果可以,例如SQLite或MySQL,请尝试从数据库命令行运行查询。